summaryrefslogtreecommitdiff
path: root/src/transport/gnunet-transport-wlan-sender.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/transport/gnunet-transport-wlan-sender.c')
-rw-r--r--src/transport/gnunet-transport-wlan-sender.c280
1 files changed, 140 insertions, 140 deletions
diff --git a/src/transport/gnunet-transport-wlan-sender.c b/src/transport/gnunet-transport-wlan-sender.c
index 36273f765..c3485ac47 100644
--- a/src/transport/gnunet-transport-wlan-sender.c
+++ b/src/transport/gnunet-transport-wlan-sender.c
@@ -1,19 +1,19 @@
1/* 1/*
2 This file is part of GNUnet 2 This file is part of GNUnet
3 Copyright (C) 2011 GNUnet e.V. 3 Copyright (C) 2011 GNUnet e.V.
4 4
5 GNUnet is free software: you can redistribute it and/or modify it 5 GNUnet is free software: you can redistribute it and/or modify it
6 under the terms of the GNU Affero General Public License as published 6 under the terms of the GNU Affero General Public License as published
7 by the Free Software Foundation, either version 3 of the License, 7 by the Free Software Foundation, either version 3 of the License,
8 or (at your option) any later version. 8 or (at your option) any later version.
9 9
10 GNUnet is distributed in the hope that it will be useful, but 10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of 11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Affero General Public License for more details. 13 Affero General Public License for more details.
14 14
15 You should have received a copy of the GNU Affero General Public License 15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>. 16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17 17
18 SPDX-License-Identifier: AGPL3.0-or-later 18 SPDX-License-Identifier: AGPL3.0-or-later
19 */ 19 */
@@ -54,11 +54,11 @@
54 * @return GNUNET_YES at success 54 * @return GNUNET_YES at success
55 */ 55 */
56static int 56static int
57getRadiotapHeader (struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage *header, 57getRadiotapHeader(struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage *header,
58 uint16_t size) 58 uint16_t size)
59{ 59{
60 header->header.size = htons (size); 60 header->header.size = htons(size);
61 header->header.type = htons (GNUNET_MESSAGE_TYPE_WLAN_DATA_TO_HELPER); 61 header->header.type = htons(GNUNET_MESSAGE_TYPE_WLAN_DATA_TO_HELPER);
62 header->rate = 255; 62 header->rate = 255;
63 header->tx_power = 0; 63 header->tx_power = 0;
64 header->antenna = 0; 64 header->antenna = 0;
@@ -74,18 +74,18 @@ getRadiotapHeader (struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage *header,
74 * @return GNUNET_YES if there was no error 74 * @return GNUNET_YES if there was no error
75 */ 75 */
76static int 76static int
77getWlanHeader (struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame *Header, 77getWlanHeader(struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame *Header,
78 const struct GNUNET_TRANSPORT_WLAN_MacAddress *to_mac_addr, 78 const struct GNUNET_TRANSPORT_WLAN_MacAddress *to_mac_addr,
79 const struct GNUNET_TRANSPORT_WLAN_MacAddress *mac, 79 const struct GNUNET_TRANSPORT_WLAN_MacAddress *mac,
80 unsigned int size) 80 unsigned int size)
81{ 81{
82 const int rate = 11000000; 82 const int rate = 11000000;
83 83
84 Header->frame_control = htons (IEEE80211_FC0_TYPE_DATA); 84 Header->frame_control = htons(IEEE80211_FC0_TYPE_DATA);
85 Header->addr3 = mac_bssid_gnunet; 85 Header->addr3 = mac_bssid_gnunet;
86 Header->addr2 = *mac; 86 Header->addr2 = *mac;
87 Header->addr1 = *to_mac_addr; 87 Header->addr1 = *to_mac_addr;
88 Header->duration = GNUNET_htole16 ((size * 1000000) / rate + 290); 88 Header->duration = GNUNET_htole16((size * 1000000) / rate + 290);
89 Header->llc[0] = WLAN_LLC_DSAP_FIELD; 89 Header->llc[0] = WLAN_LLC_DSAP_FIELD;
90 Header->llc[1] = WLAN_LLC_SSAP_FIELD; 90 Header->llc[1] = WLAN_LLC_SSAP_FIELD;
91 Header->llc[2] = 0; // FIXME 91 Header->llc[2] = 0; // FIXME
@@ -95,7 +95,7 @@ getWlanHeader (struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame *Header,
95 95
96 96
97int 97int
98main (int argc, char *argv[]) 98main(int argc, char *argv[])
99{ 99{
100 char msg_buf[WLAN_MTU]; 100 char msg_buf[WLAN_MTU];
101 struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage *radiotap; 101 struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage *radiotap;
@@ -114,137 +114,137 @@ main (int argc, char *argv[])
114 int macpipe[2]; /* This holds the fd for the input & output of the pipe */ 114 int macpipe[2]; /* This holds the fd for the input & output of the pipe */
115 115
116 if (4 != argc) 116 if (4 != argc)
117 { 117 {
118 fprintf ( 118 fprintf(
119 stderr, 119 stderr,
120 "This program must be started with the interface and the targets and source mac as argument.\n"); 120 "This program must be started with the interface and the targets and source mac as argument.\n");
121 fprintf (stderr, 121 fprintf(stderr,
122 "Usage: interface-name mac-DST mac-SRC\n" 122 "Usage: interface-name mac-DST mac-SRC\n"
123 "e.g. mon0 11-22-33-44-55-66 12-34-56-78-90-ab\n"); 123 "e.g. mon0 11-22-33-44-55-66 12-34-56-78-90-ab\n");
124 return 1; 124 return 1;
125 } 125 }
126 if (6 != SSCANF (argv[2], 126 if (6 != SSCANF(argv[2],
127 "%x-%x-%x-%x-%x-%x", 127 "%x-%x-%x-%x-%x-%x",
128 &temp[0], 128 &temp[0],
129 &temp[1], 129 &temp[1],
130 &temp[2], 130 &temp[2],
131 &temp[3], 131 &temp[3],
132 &temp[4], 132 &temp[4],
133 &temp[5])) 133 &temp[5]))
134 { 134 {
135 fprintf (stderr, 135 fprintf(stderr,
136 "Usage: interface-name mac-DST mac-SRC\n" 136 "Usage: interface-name mac-DST mac-SRC\n"
137 "e.g. mon0 11-22-33-44-55-66 12-34-56-78-90-ab\n"); 137 "e.g. mon0 11-22-33-44-55-66 12-34-56-78-90-ab\n");
138 return 1; 138 return 1;
139 } 139 }
140 for (i = 0; i < 6; i++) 140 for (i = 0; i < 6; i++)
141 outmac.mac[i] = temp[i]; 141 outmac.mac[i] = temp[i];
142 if (6 != SSCANF (argv[3], 142 if (6 != SSCANF(argv[3],
143 "%x-%x-%x-%x-%x-%x", 143 "%x-%x-%x-%x-%x-%x",
144 &temp[0], 144 &temp[0],
145 &temp[1], 145 &temp[1],
146 &temp[2], 146 &temp[2],
147 &temp[3], 147 &temp[3],
148 &temp[4], 148 &temp[4],
149 &temp[5])) 149 &temp[5]))
150 { 150 {
151 fprintf (stderr, 151 fprintf(stderr,
152 "Usage: interface-name mac-DST mac-SRC\n" 152 "Usage: interface-name mac-DST mac-SRC\n"
153 "e.g. mon0 11-22-33-44-55-66 12-34-56-78-90-ab\n"); 153 "e.g. mon0 11-22-33-44-55-66 12-34-56-78-90-ab\n");
154 return 1; 154 return 1;
155 } 155 }
156 for (i = 0; i < 6; i++) 156 for (i = 0; i < 6; i++)
157 inmac.mac[i] = temp[i]; 157 inmac.mac[i] = temp[i];
158 158
159 159
160 /* Setup communication pipeline first */ 160 /* Setup communication pipeline first */
161 if (pipe (commpipe)) 161 if (pipe(commpipe))
162 { 162 {
163 fprintf (stderr, "Failed to create pipe: %s\n", strerror (errno)); 163 fprintf(stderr, "Failed to create pipe: %s\n", strerror(errno));
164 exit (1); 164 exit(1);
165 } 165 }
166 if (pipe (macpipe)) 166 if (pipe(macpipe))
167 { 167 {
168 fprintf (stderr, "Failed to create pipe: %s\n", strerror (errno)); 168 fprintf(stderr, "Failed to create pipe: %s\n", strerror(errno));
169 exit (1); 169 exit(1);
170 } 170 }
171 171
172 /* Attempt to fork and check for errors */ 172 /* Attempt to fork and check for errors */
173 if ((pid = fork ()) == -1) 173 if ((pid = fork()) == -1)
174 { 174 {
175 fprintf (stderr, "Failed to fork: %s\n", strerror (errno)); 175 fprintf(stderr, "Failed to fork: %s\n", strerror(errno));
176 exit (1); 176 exit(1);
177 } 177 }
178 memset (msg_buf, 0x42, sizeof (msg_buf)); 178 memset(msg_buf, 0x42, sizeof(msg_buf));
179 if (pid) 179 if (pid)
180 {
181 /* A positive (non-negative) PID indicates the parent process */
182 if (0 != close (commpipe[0])) /* Close unused side of pipe (in side) */
183 fprintf (stderr, "Failed to close fd: %s\n", strerror (errno));
184 setvbuf (stdout,
185 (char *) NULL,
186 _IONBF,
187 0); /* Set non-buffered output on stdout */
188
189 if (0 != close (macpipe[1]))
190 fprintf (stderr, "Failed to close fd: %s\n", strerror (errno));
191 if (sizeof (hcm) != read (macpipe[0], &hcm, sizeof (hcm)))
192 fprintf (stderr, "Failed to read hcm...\n");
193 fprintf (stderr,
194 "Got MAC %.2X:%.2X:%.2X:%.2X:%.2X:%.2X\n",
195 hcm.mac.mac[0],
196 hcm.mac.mac[1],
197 hcm.mac.mac[2],
198 hcm.mac.mac[3],
199 hcm.mac.mac[4],
200 hcm.mac.mac[5]);
201 radiotap = (struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage *) msg_buf;
202 getRadiotapHeader (radiotap, WLAN_MTU);
203 getWlanHeader (&radiotap->frame, &outmac, &inmac, WLAN_MTU);
204 start = time (NULL);
205 count = 0;
206 while (1)
207 { 180 {
208 ret = write (commpipe[1], msg_buf, WLAN_MTU); 181 /* A positive (non-negative) PID indicates the parent process */
209 if (0 > ret) 182 if (0 != close(commpipe[0])) /* Close unused side of pipe (in side) */
210 { 183 fprintf(stderr, "Failed to close fd: %s\n", strerror(errno));
211 fprintf (stderr, "write failed: %s\n", strerror (errno)); 184 setvbuf(stdout,
212 break; 185 (char *)NULL,
213 } 186 _IONBF,
214 count += ret; 187 0); /* Set non-buffered output on stdout */
215 akt = time (NULL); 188
216 if (akt - start > 30) 189 if (0 != close(macpipe[1]))
217 { 190 fprintf(stderr, "Failed to close fd: %s\n", strerror(errno));
218 bytes_per_s = count / (akt - start); 191 if (sizeof(hcm) != read(macpipe[0], &hcm, sizeof(hcm)))
219 bytes_per_s /= 1024; 192 fprintf(stderr, "Failed to read hcm...\n");
220 printf ("send %f kbytes/s\n", bytes_per_s); 193 fprintf(stderr,
221 start = akt; 194 "Got MAC %.2X:%.2X:%.2X:%.2X:%.2X:%.2X\n",
222 count = 0; 195 hcm.mac.mac[0],
223 } 196 hcm.mac.mac[1],
197 hcm.mac.mac[2],
198 hcm.mac.mac[3],
199 hcm.mac.mac[4],
200 hcm.mac.mac[5]);
201 radiotap = (struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage *)msg_buf;
202 getRadiotapHeader(radiotap, WLAN_MTU);
203 getWlanHeader(&radiotap->frame, &outmac, &inmac, WLAN_MTU);
204 start = time(NULL);
205 count = 0;
206 while (1)
207 {
208 ret = write(commpipe[1], msg_buf, WLAN_MTU);
209 if (0 > ret)
210 {
211 fprintf(stderr, "write failed: %s\n", strerror(errno));
212 break;
213 }
214 count += ret;
215 akt = time(NULL);
216 if (akt - start > 30)
217 {
218 bytes_per_s = count / (akt - start);
219 bytes_per_s /= 1024;
220 printf("send %f kbytes/s\n", bytes_per_s);
221 start = akt;
222 count = 0;
223 }
224 }
224 } 225 }
225 }
226 else 226 else
227 {
228 /* A zero PID indicates that this is the child process */
229 (void) close (0);
230 (void) close (1);
231 if (-1 ==
232 dup2 (commpipe[0], 0)) /* Replace stdin with the in side of the pipe */
233 fprintf (stderr, "dup2 failed: %s\n", strerror (errno));
234 if (-1 ==
235 dup2 (macpipe[1], 1)) /* Replace stdout with the out side of the pipe */
236 fprintf (stderr, "dup2 failed: %s\n", strerror (errno));
237 (void) close (commpipe[1]); /* Close unused side of pipe (out side) */
238 (void) close (macpipe[0]); /* Close unused side of pipe (in side) */
239 /* Replace the child fork with a new process */
240 if (execlp ("gnunet-helper-transport-wlan",
241 "gnunet-helper-transport-wlan",
242 argv[1],
243 NULL) == -1)
244 { 227 {
245 fprintf (stderr, "Could not start gnunet-helper-transport-wlan!"); 228 /* A zero PID indicates that this is the child process */
246 _exit (1); 229 (void)close(0);
230 (void)close(1);
231 if (-1 ==
232 dup2(commpipe[0], 0)) /* Replace stdin with the in side of the pipe */
233 fprintf(stderr, "dup2 failed: %s\n", strerror(errno));
234 if (-1 ==
235 dup2(macpipe[1], 1)) /* Replace stdout with the out side of the pipe */
236 fprintf(stderr, "dup2 failed: %s\n", strerror(errno));
237 (void)close(commpipe[1]); /* Close unused side of pipe (out side) */
238 (void)close(macpipe[0]); /* Close unused side of pipe (in side) */
239 /* Replace the child fork with a new process */
240 if (execlp("gnunet-helper-transport-wlan",
241 "gnunet-helper-transport-wlan",
242 argv[1],
243 NULL) == -1)
244 {
245 fprintf(stderr, "Could not start gnunet-helper-transport-wlan!");
246 _exit(1);
247 }
247 } 248 }
248 }
249 return 0; 249 return 0;
250} 250}