root/vtcross/trunk/CR_policy/src/main_policy_engine.c @ 98

Revision 98, 5.9 KB (checked in by anonymous, 15 years ago)

Added policy engine code

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