forked from iosifpeterfi/openCAPWAP-OpenWRT
-
Notifications
You must be signed in to change notification settings - Fork 0
/
WTPStatsReceive.c
126 lines (105 loc) · 4.85 KB
/
WTPStatsReceive.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/*******************************************************************************************
* Copyright (c) 2008 Laboratorio di Sistemi di Elaborazione e Bioingegneria Informatica *
* Universita' Campus BioMedico - Italy *
* *
* This program is free software; you can redistribute it and/or modify it under the terms *
* of the GNU General Public License as published by the Free Software Foundation; either *
* version 2 of the License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, but WITHOUT ANY *
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A *
* PARTICULAR PURPOSE. See the GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License along with this *
* program; if not, write to the: *
* Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, *
* MA 02111-1307, USA. *
* *
* --------------------------------------------------------------------------------------- *
* Project: Capwap *
* *
* Author : Daniele De Sanctis ([email protected]) *
* *
*******************************************************************************************/
#include "WTPStatsReceive.h"
int create_data_Frame(CWProtocolMessage ** frame, char *buffer, int len)
{
CW_CREATE_OBJECT_ERR(*frame, CWProtocolMessage, return 0;
);
CWProtocolMessage *auxPtr = *frame;
CW_CREATE_PROTOCOL_MESSAGE(*auxPtr, len, return 0;
);
memcpy(auxPtr->msg, buffer, len);
auxPtr->offset = len;
return 1;
}
CW_THREAD_RETURN_TYPE CWWTPReceiveStats(void *arg)
{
int sock, rlen, len, k, fragmentsNum = 0, fromlen;
MM_MONITOR_DATA *pData;
struct sockaddr_un servaddr;
struct sockaddr_un from;
static char buffer[PACKET_SIZE + 1];
CWProtocolMessage *completeMsgPtr = NULL;
CWProtocolMessage *data = NULL;
CWBindingTransportHeaderValues *bindingValuesPtr = NULL;
CWThreadSetSignals(SIG_BLOCK, 1, SIGALRM);
/* Create a UNIX datagram socket for this thread */
if ((sock = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0) {
CWDebugLog("THR STATS: Error creating socket");
CWExitThread();
}
/* Set up address structure for server socket */
bzero(&servaddr, sizeof(servaddr));
bzero(&from, sizeof(from));
servaddr.sun_family = AF_UNIX;
strcpy(servaddr.sun_path, SOCKET_PATH);
unlink(SOCKET_PATH);
len = sizeof(servaddr.sun_family) + strlen(servaddr.sun_path);
if (bind(sock, (const struct sockaddr *)&servaddr, len) < 0) {
CWDebugLog("THR STATS: Error binding socket");
CWExitThread();
}
CW_CREATE_OBJECT_ERR(pData, MM_MONITOR_DATA, EXIT_THREAD);
fromlen = sizeof(from);
/* Receive data */
CW_REPEAT_FOREVER {
rlen = recvfrom(sock, buffer, PACKET_SIZE, 0, (struct sockaddr *)&from, (socklen_t *) & fromlen);
if (rlen == -1) {
CWDebugLog("THR STATS: Error receiving from unix socket");
CWExitThread();
} else {
completeMsgPtr = NULL;
if (!create_data_Frame(&data, buffer, rlen)) {
CWDebugLog("Error extracting a data stats frame");
CWExitThread();
};
pData = (MM_MONITOR_DATA *) data->msg;
CW_CREATE_OBJECT_ERR(bindingValuesPtr, CWBindingTransportHeaderValues, EXIT_THREAD);
bindingValuesPtr->dataRate = -1; //to distinguish between wireless frame e data message (Daniele) see CWBindig.c line 224
if (CWAssembleDataMessage(&completeMsgPtr, &fragmentsNum, gWTPPathMTU, data, bindingValuesPtr,
CW_PACKET_PLAIN, 0)) {
for (k = 0; k < fragmentsNum; k++) {
#ifdef CW_NO_DTLS
if (!CWNetworkSendUnsafeConnected
(gWTPSocket, completeMsgPtr[k].msg, completeMsgPtr[k].offset)) {
#else
if (!CWSecuritySend
(gWTPSession, completeMsgPtr[k].msg, completeMsgPtr[k].offset)) {
#endif
CWDebugLog("Failure sending Request");
break;
}
}
}
for (k = 0; k < fragmentsNum; k++) {
CW_FREE_PROTOCOL_MESSAGE(completeMsgPtr[k]);
}
CW_FREE_OBJECT(completeMsgPtr);
CW_FREE_OBJECT(data);
CW_FREE_OBJECT(bindingValuesPtr);
}
}
close(sock);
return (NULL);
}