root/vtcross/branches/bhilburn/src/policy_engines/default_policy_engine.c @ 120

Revision 120, 5.9 KB (checked in by bhilburn, 15 years ago)

Creating automake files for the various parts of the VTCROSS system. Got rid of
the components directory seemed it seemed unnecessary.

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.