root/vtcross/branches/bhilburn/src/policy_engines/default_policy_engine.cpp @ 127

Revision 127, 5.6 KB (checked in by bhilburn, 15 years ago)

Started moving everything to c++ so that it can use the headers properly. Almost
have the policy engine demo compiling and working again.

Line 
1#include <stdio.h>
2#include <sys/types.h>
3#include <sys/socket.h>
4#include <netinet/in.h>
5#include <netdb.h>
6#include <stdlib.h>
7#include <string.h>
8
9#include "vtcross/cbr.h"
10#include "vtcross/containers.h"
11
12#define CR_PORT 30002
13
14// error handling
15void error(char *msg)
16{
17    perror(msg);
18    exit(0);
19}
20
21void ReadMessage(int socket,char * buffer) {
22    int i,n;
23
24    n = recv(socket,buffer,256,MSG_PEEK);
25    for(i=0;i<256;i++){
26            if(strcmp(&buffer[i],"\0") == 0) break;
27    }
28    n = recv(socket,buffer,i+1,0);
29    if (n < 0)
30         error("ERROR reading from socket");
31    //printf("ReadMessage:%s %d\n",buffer,n);
32}
33
34// setup client socket connection
35int ClientSocket(int argc, char** argv)
36{
37    int sockfd;
38    int portno;
39    struct sockaddr_in serv_addr;
40    struct hostent *server;
41   
42    // server name
43    server = gethostbyname(argv[1]);
44    if (server == NULL) {
45        fprintf(stderr,"ERROR, no such host\n");
46        exit(0);
47    }
48    // port no.
49    portno = atoi(argv[2]);
50    // socket file descriptor
51    sockfd = socket(AF_INET, SOCK_STREAM, 0);
52    if (sockfd < 0)
53        error("ERROR opening socket");
54    // initiate struct socketaddr_in
55    bzero((char *) &serv_addr, sizeof(serv_addr));
56    serv_addr.sin_family = AF_INET;
57    serv_addr.sin_port = htons(portno);
58    bcopy((char *)server->h_addr,
59         (char *)&serv_addr.sin_addr.s_addr,
60         server->h_length);
61    // cast sockaddr_in to sockaddr
62    if (connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)) < 0)
63        error("ERROR connecting");
64
65    return sockfd;
66}
67
68   
69int SendMessage(int socketfd, char *message)
70{
71    int n;
72     
73    strcat(message, "\0000");
74    n = send(socketfd,message,(strlen(message)+1),0);
75    if (n<0)
76        error("Error sending to server\n");
77    else if(n == 0)
78        printf("Server closed the socket.\n");
79   
80    return n;
81}
82
83int GetParameter(int sockfd, struct Parameter pList[], struct CE_Info *ce_info)
84{
85    char buffer[256];
86    int i;
87
88    // numParameters
89    bzero(buffer,256);
90    ReadMessage(sockfd,buffer);
91    ce_info->numParameters = atoi(buffer);
92    printf("number of parameters: %d\n", ce_info->numParameters);
93   
94    for (i = 0; i < ce_info->numParameters; i++){
95        bzero(buffer,256);
96        ReadMessage(sockfd,buffer);
97        printf("Name: %s\n", buffer);
98        strcpy(pList[i].name, buffer);
99   
100        bzero(buffer,256);
101        ReadMessage(sockfd,buffer);
102        printf("Units: %s\n", buffer);
103        strcpy(pList[i].units, buffer);
104
105        bzero(buffer,256);
106        ReadMessage(sockfd,buffer);
107        printf("Min: %s\n", buffer);
108        pList[i].min = atof(buffer);
109   
110        bzero(buffer,256);
111        ReadMessage(sockfd,buffer);
112        printf("Max: %s\n", buffer);
113        pList[i].max = atof(buffer);
114   
115        bzero(buffer,256);
116        ReadMessage(sockfd,buffer);
117        printf("Step: %s\n", buffer);
118        pList[i].step = atof(buffer);
119   
120        bzero(buffer,256);
121        ReadMessage(sockfd,buffer);
122        printf("Value: %s\n", buffer);
123        pList[i].value = atof(buffer);
124   
125    }
126    return 1;
127}
128
129
130int GetRequest(int sockfd, struct Parameter pList[], struct CE_Info *ce_info)
131{
132    char buffer[256];
133   
134    // Get control identifier
135    // Possibly could implement some sort of authentication here
136    bzero(buffer,256);
137    ReadMessage(sockfd,buffer);
138
139    if(strcmp(buffer,"val") != 0) {
140            printf("Policy Engine:: Unexpected control data received.\n\n");
141        return 0;
142    }
143
144    printf("Policy Engine:: Getting parameters.\n\n");
145    // Get potenial transmission parameter values
146    GetParameter(sockfd, pList, ce_info);
147
148    return 1;
149}
150
151int ValidateTransmissionParameters(struct Parameter pList[], struct CE_Info *ce_info, int decision_array[])
152{
153    int i = 0;
154    // Decision array holds parameter decision
155    // 1 = OK
156    // 0 = FAIL
157
158    printf("Policy Engine:: Policies Validated.\n\n");
159    for (i = 0; i < ce_info->numParameters; i++){
160        decision_array[i] = 1;
161    }
162
163    return 1;
164}
165
166
167int RegisterPE(int sockfd)
168{
169    // Send register message to cognitive radio
170    SendMessage(sockfd, "p_register");
171    printf("Policy Engine:: Registration message sent.\n\n");
172    return 1;
173}
174
175int SendCEDecision(int sockfd, struct Parameter pList[], struct CE_Info *ce_info, int decision_array[])
176{
177    // send results back to server
178    char var[50];
179    int i;
180 
181    // parameter
182    for (i = 0; i < ce_info->numParameters; i++){
183        sprintf(var, "%i", decision_array[i]);
184        SendMessage(sockfd, var);
185    }
186   
187    return 1;
188}
189
190int ParsePolicies() {
191
192    printf("Policy Engine:: Policies parsed.\n\n");
193
194    return 1;
195}
196
197// main client socket
198int main(int argc, char *argv[])
199{
200    int decision_array[10];
201    struct Parameter pList[10];
202    struct CE_Info ce_info;
203    int sockfd;
204    int ret = 0;
205   
206    // setup client socket connection
207    if (argc < 3) {
208       fprintf(stderr,"usage: %s hostname port\n", argv[0]);
209       exit(0);
210    }
211   
212    // setup client socket connection with server
213    sockfd = ClientSocket(argc, argv);
214
215    // Parse initial Policies
216    printf("Policy Engine:: Parsing local policies.\n\n");
217    ret = ParsePolicies();
218
219    ret = RegisterPE(sockfd);
220
221    while(1) {
222       
223        printf("Policy Engine:: Waiting for Policy Check Request.\n\n");
224        ret = GetRequest(sockfd, pList, &ce_info);
225       
226        if(ret == 1) {
227            printf("Policy Engine:: Validating Transmission Parameters.\n\n");
228            ValidateTransmissionParameters(pList, &ce_info, decision_array);   
229   
230            printf("Policy Engine:: Sending Policy decision to Server.\n\n");
231            SendCEDecision(sockfd, pList, &ce_info, decision_array);
232        }
233    }
234   
235    return 0;
236}
Note: See TracBrowser for help on using the browser.