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

Revision 136, 5.8 KB (checked in by bhilburn, 15 years ago)

Migrated to using autoconf-generate config.h so that compile lines are easier to
read, and compile flags are better organized.

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