#include <unistd.h>
#include <pthread.h>
#include <stdio.h>
+#include <semaphore.h>
#define UN_MNGT_SOCKET "/var/run/fwpsock"
unsigned char buffer[FWP_MTU];
unsigned int vres_id;
+sem_t sem_msg_in;
+
/***/
void fwp_adm_test(struct fwp_ctable *ct)
if ((code == NEGOTIATE_REQUEST)||(code == NEGOTIATE_RESPONSE))
fwp_msgq_enqueue(&msgq_neg_in, msgb);
+ sem_post(sem_msq_in);
else {
printf("Error: not valid negotiate frame\n");
fwp_msgb_free(msgb);
}
}
-
-void* fwp_client_thread(void* ap_address)
+void fwp_client negotiate_request(unsigned int hid, struct msgb *msgb)
{
struct fwp_ctable_entry ctentry;
struct fwp_contract cnt;
+
+ fwp_msg_contract_pull(msgb, &cnt);
+
+ memcpy(&ctentry.contract, &cnt, sizeof(cnt));
+ memcpy(&ctentry.saddr, &msgb->addr, sizeof(msgb->addrlen));
+ ctentry.addrlen = msgb->addrlen;
+ ctentry.hid = hid;
+ hid = fwp_ctable_put(&ctable_negotiate, &ctentry);
+
+ msgb->data = msgb->head;
+ fwp_msg_header_put(msgb, FWP_NEGT_REQ, hid);
+ msgb->addrlen = sizeof(fwp_server_addr);
+ memcpy(msgb->addr, (struct sockaddr*)&fwp_server_addr, msgb->addrlen);
+
+ fwp_vres_send(vres_id, msgb);
+}
+
+int fwp_client negotiate_response(unsigned int hid, struct msgb *msgb)
+{
+ struct fwp_ctable_entry ctentry;
+ struct fwp_contract cnt_res;
+ struct fwp_contract *cnt_req;
+
+ fwp_msg_contract_pull(msgb, &cnt_res);
+ cnt_req = fwp_ctable_get(&ctable_negotiate, hid);
+
+ if (!cnt_req) /*TODO: test na zhodu res.cnt = req.cnt */
+ return -1; /* not valid response*/
+
+ if (cnt.res.status == FWP_ACCEPTED)
+ fwp_ctable_add(&ctable_appected, cnt);
+
+ fwp_ctable_remove(&ctable_negotiate, hid);
+
+ /* forward response to app */
+ memcpy(&msgb->addr, &ctentry.saddr, sizeof(msgb->addrlen));
+ msgb->addrlen = ctentry.addrlen;
+
+ fwp_vres_send(vres_id, msgb);
+ return 0;
+}
+
+void* fwp_client_thread(void* arg)
+{
struct fwp_msgb *msgb;
unsigned int code, hid;
while (1) {
- while ((msgb = fwp_msgq_dequeue(&msgq_neg_in))) {
- fwp_msg_header_pull(msgb, &code, &hid);
+ sem_wait(sem_msg_in);
+ msgb = fwp_msgq_dequeue(&msgq_neg_in);
+ if (!msgb)
+ continue;
- switch (code) {
- case NEGOTIATE_REQUEST:
-
- fwp_msg_contract_pull(msgb, &cnt);
- memcpy(&ctentry.contract, &cnt, sizeof(cnt));
- memcpy(&ctentry.saddr, &msgb->addr,
- sizeof(msgb->addrlen));
- ctentry.addrlen = msgb->addrlen;
-
- fwp_ctable_put(&ctable_negotiate, &ctentry);
- /*fwp_msgb_push(sizeof(struct fwp_msg_header));*/
-
- hid = ctentry.contract.id;
-
- fwp_msg_header_put(msgb, code, hid);
- /*
- memcpy(msgb->addr,
- (struct sockaddr*)&fwp_server_addr,
- peer_addrlen);
- msgb->addrlen = sizeof(fwp_server_addr);
- memcpy(msgb->head, buffer, len);
- msgb->len = len;
-
- */
-
- fwp_vres_send(vres_id,msgb);
+ fwp_msg_header_pull(msgb, &code, &hid);
+
+ switch (code) {
+ case FWP_NEGT_REQ:
+ fwp_client_negotiate_request(hid, msgb);
break;
- case NEGOTIATE_RESPONSE:
-
- /* fwp_ctable_del(negt_ctable,id, cnt);
- fwp_ctable_add(accept_ctable, cnt);
-
- contract_to_msg(cnt, msg);
- fwp_vres_send(client,msg,..);*/
+ case FWP_NEGT_RES:
+ fwp_client negotiate_response(hid, msgb);
break;
-
- }
- }
+ }
}
}
pthread_t rx_thread_id, server_thread_id, client_thread_id;
pthread_attr_t attr;
+ sem_init(&sem_msg_in, 0, 0);
mode = FWP_SERVER;
pthread_attr_init(&attr);
rc = pthread_create(&rx_thread_id, &attr, fwp_rx_thread, (void*) NULL);