diff options
Diffstat (limited to 'src/transport/gnunet-transport-wlan-sender.c')
-rw-r--r-- | src/transport/gnunet-transport-wlan-sender.c | 251 |
1 files changed, 0 insertions, 251 deletions
diff --git a/src/transport/gnunet-transport-wlan-sender.c b/src/transport/gnunet-transport-wlan-sender.c deleted file mode 100644 index 5256ec7be..000000000 --- a/src/transport/gnunet-transport-wlan-sender.c +++ /dev/null | |||
@@ -1,251 +0,0 @@ | |||
1 | /* | ||
2 | This file is part of GNUnet | ||
3 | Copyright (C) 2011 GNUnet e.V. | ||
4 | |||
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 | ||
7 | by the Free Software Foundation, either version 3 of the License, | ||
8 | or (at your option) any later version. | ||
9 | |||
10 | GNUnet is distributed in the hope that it will be useful, but | ||
11 | WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
13 | Affero General Public License for more details. | ||
14 | |||
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/>. | ||
17 | |||
18 | SPDX-License-Identifier: AGPL3.0-or-later | ||
19 | */ | ||
20 | |||
21 | /** | ||
22 | * @file transport/gnunet-transport-wlan-sender.c | ||
23 | * @brief program to send via WLAN as much as possible (to test physical/theoretical throughput) | ||
24 | * @author David Brodski | ||
25 | */ | ||
26 | #include "platform.h" | ||
27 | #include "plugin_transport_wlan.h" | ||
28 | #include "gnunet_protocols.h" | ||
29 | |||
30 | #define WLAN_MTU 1500 | ||
31 | |||
32 | /** | ||
33 | * LLC fields for better compatibility | ||
34 | */ | ||
35 | #define WLAN_LLC_DSAP_FIELD 0x1f | ||
36 | #define WLAN_LLC_SSAP_FIELD 0x1f | ||
37 | |||
38 | #define IEEE80211_ADDR_LEN 6 /* size of 802.11 address */ | ||
39 | |||
40 | #define IEEE80211_FC0_VERSION_MASK 0x03 | ||
41 | #define IEEE80211_FC0_VERSION_SHIFT 0 | ||
42 | #define IEEE80211_FC0_VERSION_0 0x00 | ||
43 | #define IEEE80211_FC0_TYPE_MASK 0x0c | ||
44 | #define IEEE80211_FC0_TYPE_SHIFT 2 | ||
45 | #define IEEE80211_FC0_TYPE_MGT 0x00 | ||
46 | #define IEEE80211_FC0_TYPE_CTL 0x04 | ||
47 | #define IEEE80211_FC0_TYPE_DATA 0x08 | ||
48 | |||
49 | |||
50 | /** | ||
51 | * function to fill the radiotap header | ||
52 | * @param header pointer to the radiotap header | ||
53 | * @param size total message size | ||
54 | * @return GNUNET_YES at success | ||
55 | */ | ||
56 | static int | ||
57 | getRadiotapHeader (struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage *header, | ||
58 | uint16_t size) | ||
59 | { | ||
60 | header->header.size = htons (size); | ||
61 | header->header.type = htons (GNUNET_MESSAGE_TYPE_WLAN_DATA_TO_HELPER); | ||
62 | header->rate = 255; | ||
63 | header->tx_power = 0; | ||
64 | header->antenna = 0; | ||
65 | return GNUNET_YES; | ||
66 | } | ||
67 | |||
68 | |||
69 | /** | ||
70 | * function to generate the wlan hardware header for one packet | ||
71 | * @param Header address to write the header to | ||
72 | * @param to_mac_addr pointer to the address of the recipient | ||
73 | * @param mac pointer to the mac address to send from (normally overwritten over by helper) | ||
74 | * @param size size of the whole packet, needed to calculate the time to send the packet | ||
75 | * @return GNUNET_YES if there was no error | ||
76 | */ | ||
77 | static int | ||
78 | getWlanHeader (struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame *Header, | ||
79 | const struct GNUNET_TRANSPORT_WLAN_MacAddress *to_mac_addr, | ||
80 | const struct GNUNET_TRANSPORT_WLAN_MacAddress *mac, | ||
81 | unsigned int size) | ||
82 | { | ||
83 | const int rate = 11000000; | ||
84 | |||
85 | Header->frame_control = htons (IEEE80211_FC0_TYPE_DATA); | ||
86 | Header->addr3 = mac_bssid_gnunet; | ||
87 | Header->addr2 = *mac; | ||
88 | Header->addr1 = *to_mac_addr; | ||
89 | Header->duration = GNUNET_htole16 ((size * 1000000) / rate + 290); | ||
90 | Header->llc[0] = WLAN_LLC_DSAP_FIELD; | ||
91 | Header->llc[1] = WLAN_LLC_SSAP_FIELD; | ||
92 | Header->llc[2] = 0; // FIXME | ||
93 | Header->llc[3] = 0; // FIXME | ||
94 | return GNUNET_YES; | ||
95 | } | ||
96 | |||
97 | |||
98 | int | ||
99 | main (int argc, char *argv[]) | ||
100 | { | ||
101 | char msg_buf[WLAN_MTU]; | ||
102 | struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage *radiotap; | ||
103 | unsigned int temp[6]; | ||
104 | struct GNUNET_TRANSPORT_WLAN_MacAddress inmac; | ||
105 | struct GNUNET_TRANSPORT_WLAN_MacAddress outmac; | ||
106 | struct GNUNET_TRANSPORT_WLAN_HelperControlMessage hcm; | ||
107 | unsigned long long count; | ||
108 | double bytes_per_s; | ||
109 | time_t start; | ||
110 | time_t akt; | ||
111 | int i; | ||
112 | ssize_t ret; | ||
113 | pid_t pid; | ||
114 | int commpipe[2]; /* This holds the fd for the input & output of the pipe */ | ||
115 | int macpipe[2]; /* This holds the fd for the input & output of the pipe */ | ||
116 | |||
117 | if (4 != argc) | ||
118 | { | ||
119 | fprintf ( | ||
120 | stderr, | ||
121 | "This program must be started with the interface and the targets and source mac as argument.\n"); | ||
122 | fprintf (stderr, | ||
123 | "Usage: interface-name mac-DST mac-SRC\n" | ||
124 | "e.g. mon0 11-22-33-44-55-66 12-34-56-78-90-ab\n"); | ||
125 | return 1; | ||
126 | } | ||
127 | if (6 != sscanf (argv[2], | ||
128 | "%x-%x-%x-%x-%x-%x", | ||
129 | &temp[0], | ||
130 | &temp[1], | ||
131 | &temp[2], | ||
132 | &temp[3], | ||
133 | &temp[4], | ||
134 | &temp[5])) | ||
135 | { | ||
136 | fprintf (stderr, | ||
137 | "Usage: interface-name mac-DST mac-SRC\n" | ||
138 | "e.g. mon0 11-22-33-44-55-66 12-34-56-78-90-ab\n"); | ||
139 | return 1; | ||
140 | } | ||
141 | for (i = 0; i < 6; i++) | ||
142 | outmac.mac[i] = temp[i]; | ||
143 | if (6 != sscanf (argv[3], | ||
144 | "%x-%x-%x-%x-%x-%x", | ||
145 | &temp[0], | ||
146 | &temp[1], | ||
147 | &temp[2], | ||
148 | &temp[3], | ||
149 | &temp[4], | ||
150 | &temp[5])) | ||
151 | { | ||
152 | fprintf (stderr, | ||
153 | "Usage: interface-name mac-DST mac-SRC\n" | ||
154 | "e.g. mon0 11-22-33-44-55-66 12-34-56-78-90-ab\n"); | ||
155 | return 1; | ||
156 | } | ||
157 | for (i = 0; i < 6; i++) | ||
158 | inmac.mac[i] = temp[i]; | ||
159 | |||
160 | |||
161 | /* Setup communication pipeline first */ | ||
162 | if (pipe (commpipe)) | ||
163 | { | ||
164 | fprintf (stderr, "Failed to create pipe: %s\n", strerror (errno)); | ||
165 | exit (1); | ||
166 | } | ||
167 | if (pipe (macpipe)) | ||
168 | { | ||
169 | fprintf (stderr, "Failed to create pipe: %s\n", strerror (errno)); | ||
170 | exit (1); | ||
171 | } | ||
172 | |||
173 | /* Attempt to fork and check for errors */ | ||
174 | if ((pid = fork ()) == -1) | ||
175 | { | ||
176 | fprintf (stderr, "Failed to fork: %s\n", strerror (errno)); | ||
177 | exit (1); | ||
178 | } | ||
179 | memset (msg_buf, 0x42, sizeof(msg_buf)); | ||
180 | if (pid) | ||
181 | { | ||
182 | /* A positive (non-negative) PID indicates the parent process */ | ||
183 | if (0 != close (commpipe[0])) /* Close unused side of pipe (in side) */ | ||
184 | fprintf (stderr, "Failed to close fd: %s\n", strerror (errno)); | ||
185 | setvbuf (stdout, | ||
186 | (char *) NULL, | ||
187 | _IONBF, | ||
188 | 0); /* Set non-buffered output on stdout */ | ||
189 | |||
190 | if (0 != close (macpipe[1])) | ||
191 | fprintf (stderr, "Failed to close fd: %s\n", strerror (errno)); | ||
192 | if (sizeof(hcm) != read (macpipe[0], &hcm, sizeof(hcm))) | ||
193 | fprintf (stderr, "Failed to read hcm...\n"); | ||
194 | fprintf (stderr, | ||
195 | "Got MAC %.2X:%.2X:%.2X:%.2X:%.2X:%.2X\n", | ||
196 | hcm.mac.mac[0], | ||
197 | hcm.mac.mac[1], | ||
198 | hcm.mac.mac[2], | ||
199 | hcm.mac.mac[3], | ||
200 | hcm.mac.mac[4], | ||
201 | hcm.mac.mac[5]); | ||
202 | radiotap = (struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage *) msg_buf; | ||
203 | getRadiotapHeader (radiotap, WLAN_MTU); | ||
204 | getWlanHeader (&radiotap->frame, &outmac, &inmac, WLAN_MTU); | ||
205 | start = time (NULL); | ||
206 | count = 0; | ||
207 | while (1) | ||
208 | { | ||
209 | ret = write (commpipe[1], msg_buf, WLAN_MTU); | ||
210 | if (0 > ret) | ||
211 | { | ||
212 | fprintf (stderr, "write failed: %s\n", strerror (errno)); | ||
213 | break; | ||
214 | } | ||
215 | count += ret; | ||
216 | akt = time (NULL); | ||
217 | if (akt - start > 30) | ||
218 | { | ||
219 | bytes_per_s = count / (akt - start); | ||
220 | bytes_per_s /= 1024; | ||
221 | printf ("send %f kbytes/s\n", bytes_per_s); | ||
222 | start = akt; | ||
223 | count = 0; | ||
224 | } | ||
225 | } | ||
226 | } | ||
227 | else | ||
228 | { | ||
229 | /* A zero PID indicates that this is the child process */ | ||
230 | (void) close (0); | ||
231 | (void) close (1); | ||
232 | if (-1 == | ||
233 | dup2 (commpipe[0], 0)) /* Replace stdin with the in side of the pipe */ | ||
234 | fprintf (stderr, "dup2 failed: %s\n", strerror (errno)); | ||
235 | if (-1 == | ||
236 | dup2 (macpipe[1], 1)) /* Replace stdout with the out side of the pipe */ | ||
237 | fprintf (stderr, "dup2 failed: %s\n", strerror (errno)); | ||
238 | (void) close (commpipe[1]); /* Close unused side of pipe (out side) */ | ||
239 | (void) close (macpipe[0]); /* Close unused side of pipe (in side) */ | ||
240 | /* Replace the child fork with a new process */ | ||
241 | if (execlp ("gnunet-helper-transport-wlan", | ||
242 | "gnunet-helper-transport-wlan", | ||
243 | argv[1], | ||
244 | NULL) == -1) | ||
245 | { | ||
246 | fprintf (stderr, "Could not start gnunet-helper-transport-wlan!"); | ||
247 | _exit (1); | ||
248 | } | ||
249 | } | ||
250 | return 0; | ||
251 | } | ||