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.c256
1 files changed, 128 insertions, 128 deletions
diff --git a/src/transport/gnunet-transport-wlan-sender.c b/src/transport/gnunet-transport-wlan-sender.c
index be8bcdda0..191ea8619 100644
--- a/src/transport/gnunet-transport-wlan-sender.c
+++ b/src/transport/gnunet-transport-wlan-sender.c
@@ -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)
180 { 207 {
181 /* A positive (non-negative) PID indicates the parent process */ 208 ret = write (commpipe[1], msg_buf, WLAN_MTU);
182 if (0 != close(commpipe[0])) /* Close unused side of pipe (in side) */ 209 if (0 > ret)
183 fprintf(stderr, "Failed to close fd: %s\n", strerror(errno)); 210 {
184 setvbuf(stdout, 211 fprintf (stderr, "write failed: %s\n", strerror (errno));
185 (char *)NULL, 212 break;
186 _IONBF, 213 }
187 0); /* Set non-buffered output on stdout */ 214 count += ret;
188 215 akt = time (NULL);
189 if (0 != close(macpipe[1])) 216 if (akt - start > 30)
190 fprintf(stderr, "Failed to close fd: %s\n", strerror(errno)); 217 {
191 if (sizeof(hcm) != read(macpipe[0], &hcm, sizeof(hcm))) 218 bytes_per_s = count / (akt - start);
192 fprintf(stderr, "Failed to read hcm...\n"); 219 bytes_per_s /= 1024;
193 fprintf(stderr, 220 printf ("send %f kbytes/s\n", bytes_per_s);
194 "Got MAC %.2X:%.2X:%.2X:%.2X:%.2X:%.2X\n", 221 start = akt;
195 hcm.mac.mac[0], 222 count = 0;
196 hcm.mac.mac[1], 223 }
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 }
225 } 224 }
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)
227 { 244 {
228 /* A zero PID indicates that this is the child process */ 245 fprintf (stderr, "Could not start gnunet-helper-transport-wlan!");
229 (void)close(0); 246 _exit (1);
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 }
248 } 247 }
248 }
249 return 0; 249 return 0;
250} 250}