diff options
author | Claudiu Olteanu <claudiu@140774ce-b5e7-0310-ab8b-a85725594a96> | 2013-07-19 16:48:12 +0000 |
---|---|---|
committer | Claudiu Olteanu <claudiu@140774ce-b5e7-0310-ab8b-a85725594a96> | 2013-07-19 16:48:12 +0000 |
commit | 2904abb26e88eaef03c79e0a6571c6245032a2f1 (patch) | |
tree | cec51257a50b20233555060ad39fd1fec554eb99 /src/transport/gnunet-helper-transport-bluetooth.c | |
parent | 1421f70e9abc758b976bd89020bcbfa4be3964ae (diff) | |
download | gnunet-2904abb26e88eaef03c79e0a6571c6245032a2f1.tar.gz gnunet-2904abb26e88eaef03c79e0a6571c6245032a2f1.zip |
Fixed some bugs
Diffstat (limited to 'src/transport/gnunet-helper-transport-bluetooth.c')
-rw-r--r-- | src/transport/gnunet-helper-transport-bluetooth.c | 141 |
1 files changed, 92 insertions, 49 deletions
diff --git a/src/transport/gnunet-helper-transport-bluetooth.c b/src/transport/gnunet-helper-transport-bluetooth.c index ca9aa70c3..27ba06b2c 100644 --- a/src/transport/gnunet-helper-transport-bluetooth.c +++ b/src/transport/gnunet-helper-transport-bluetooth.c | |||
@@ -114,6 +114,8 @@ static struct SendBuffer write_pout; | |||
114 | static struct SendBuffer write_std; | 114 | static struct SendBuffer write_std; |
115 | 115 | ||
116 | 116 | ||
117 | static struct GNUNET_TRANSPORT_WLAN_MacAddress broadcast = {{255, 255, 255, 255, 255, 255}}; | ||
118 | |||
117 | /* *********** specialized version of server_mst.c begins here ********** */ | 119 | /* *********** specialized version of server_mst.c begins here ********** */ |
118 | /* ****** this is the same version as the one used in gnunet-helper-transport-wlan.c ****** */ | 120 | /* ****** this is the same version as the one used in gnunet-helper-transport-wlan.c ****** */ |
119 | 121 | ||
@@ -208,6 +210,8 @@ mst_create (MessageTokenizerCallback cb, | |||
208 | ret->curr_buf = MIN_BUFFER_SIZE; | 210 | ret->curr_buf = MIN_BUFFER_SIZE; |
209 | ret->cb = cb; | 211 | ret->cb = cb; |
210 | ret->cb_cls = cb_cls; | 212 | ret->cb_cls = cb_cls; |
213 | ret->pos = 0; | ||
214 | |||
211 | return ret; | 215 | return ret; |
212 | } | 216 | } |
213 | 217 | ||
@@ -236,6 +240,7 @@ mst_receive (struct MessageStreamTokenizer *mst, | |||
236 | 240 | ||
237 | ret = GNUNET_OK; | 241 | ret = GNUNET_OK; |
238 | ibuf = (char *) mst->hdr; | 242 | ibuf = (char *) mst->hdr; |
243 | |||
239 | while (mst->pos > 0) | 244 | while (mst->pos > 0) |
240 | { | 245 | { |
241 | do_align: | 246 | do_align: |
@@ -309,6 +314,7 @@ do_align: | |||
309 | mst->pos = 0; | 314 | mst->pos = 0; |
310 | } | 315 | } |
311 | } | 316 | } |
317 | |||
312 | while (size > 0) | 318 | while (size > 0) |
313 | { | 319 | { |
314 | if (size < sizeof (struct GNUNET_MessageHeader)) | 320 | if (size < sizeof (struct GNUNET_MessageHeader)) |
@@ -365,6 +371,7 @@ do_align: | |||
365 | } | 371 | } |
366 | 372 | ||
367 | 373 | ||
374 | |||
368 | /** | 375 | /** |
369 | * Destroys a tokenizer. | 376 | * Destroys a tokenizer. |
370 | * | 377 | * |
@@ -538,7 +545,7 @@ register_service (struct HardwareInfos *dev, int rc_channel) | |||
538 | * 6. register the service record to the local SDP server | 545 | * 6. register the service record to the local SDP server |
539 | * 7. cleanup | 546 | * 7. cleanup |
540 | */ | 547 | */ |
541 | 548 | ||
542 | //FIXME: probably this is not the best idea. I should find a different uuid | 549 | //FIXME: probably this is not the best idea. I should find a different uuid |
543 | uint8_t svc_uuid_int[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 550 | uint8_t svc_uuid_int[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
544 | dev->pl_mac.mac[5], dev->pl_mac.mac[4], dev->pl_mac.mac[3], | 551 | dev->pl_mac.mac[5], dev->pl_mac.mac[4], dev->pl_mac.mac[3], |
@@ -811,11 +818,11 @@ open_device (struct HardwareInfos *dev) | |||
811 | 818 | ||
812 | if (strcmp (dev_info.name, dev->iface) == 0) | 819 | if (strcmp (dev_info.name, dev->iface) == 0) |
813 | { | 820 | { |
814 | char addr[19] = { 0 }; //the device MAC address | 821 | //char addr[19] = { 0 }; //the device MAC address |
815 | 822 | ||
816 | dev_id = dev_info.dev_id; //the device was found | 823 | dev_id = dev_info.dev_id; //the device was found |
817 | 824 | ||
818 | ba2str (&dev_info.bdaddr, addr); //get the device's MAC address | 825 | // ba2str (&dev_info.bdaddr, addr); //get the device's MAC address |
819 | /** | 826 | /** |
820 | * Copy the MAC address to the device structure | 827 | * Copy the MAC address to the device structure |
821 | * FIXME: probably this is not the best solution | 828 | * FIXME: probably this is not the best solution |
@@ -1025,6 +1032,15 @@ stdin_send_hw (void *cls, const struct GNUNET_MessageHeader *hdr) | |||
1025 | } | 1032 | } |
1026 | 1033 | ||
1027 | 1034 | ||
1035 | //TODO | ||
1036 | /** | ||
1037 | * Broadcast a HELLO message for peer discovery | ||
1038 | */ | ||
1039 | static void | ||
1040 | send_broadcast () | ||
1041 | { | ||
1042 | // Use a hard coded port number to send hello messages to all the neighbours | ||
1043 | } | ||
1028 | /** | 1044 | /** |
1029 | * Main function of the helper. This code accesses a bluetooth interface | 1045 | * Main function of the helper. This code accesses a bluetooth interface |
1030 | * forwards traffic in both directions between the bluetooth interface and | 1046 | * forwards traffic in both directions between the bluetooth interface and |
@@ -1041,7 +1057,6 @@ main (int argc, char *argv[]) | |||
1041 | { | 1057 | { |
1042 | struct HardwareInfos dev; | 1058 | struct HardwareInfos dev; |
1043 | char readbuf[MAXLINE]; | 1059 | char readbuf[MAXLINE]; |
1044 | char dest[18]; | ||
1045 | int maxfd; | 1060 | int maxfd; |
1046 | fd_set rfds; | 1061 | fd_set rfds; |
1047 | fd_set wfds; | 1062 | fd_set wfds; |
@@ -1128,8 +1143,7 @@ main (int argc, char *argv[]) | |||
1128 | #endif | 1143 | #endif |
1129 | } | 1144 | } |
1130 | 1145 | ||
1131 | 1146 | /* Send MAC address of the bluetooth interface to STDOUT first */ | |
1132 | /* Send MAC address of the bluetooth interface to STDOUT first */ | ||
1133 | { | 1147 | { |
1134 | struct GNUNET_TRANSPORT_WLAN_HelperControlMessage macmsg; | 1148 | struct GNUNET_TRANSPORT_WLAN_HelperControlMessage macmsg; |
1135 | 1149 | ||
@@ -1140,89 +1154,114 @@ main (int argc, char *argv[]) | |||
1140 | write_std.size = sizeof (macmsg); | 1154 | write_std.size = sizeof (macmsg); |
1141 | } | 1155 | } |
1142 | 1156 | ||
1143 | 1157 | ||
1144 | stdin_mst = mst_create (&stdin_send_hw, &dev); | 1158 | stdin_mst = mst_create (&stdin_send_hw, &dev); |
1145 | stdin_open = 1; | 1159 | stdin_open = 1; |
1146 | while (1) | 1160 | |
1161 | while (1) | ||
1147 | { | 1162 | { |
1148 | maxfd = -1; | 1163 | maxfd = -1; |
1149 | FD_ZERO (&rfds); | 1164 | FD_ZERO (&rfds); |
1150 | if ((0 == write_pout.size) && (1 == stdin_open)) | 1165 | if ((0 == write_pout.size) && (1 == stdin_open)) |
1151 | { | 1166 | { |
1167 | fprintf(stderr, "LOG : %s adds STDIN to rfds\n", dev.iface); //FIXME: debugging message | ||
1152 | FD_SET (STDIN_FILENO, &rfds); | 1168 | FD_SET (STDIN_FILENO, &rfds); |
1153 | maxfd = MAX (maxfd, STDIN_FILENO); | 1169 | maxfd = MAX (maxfd, STDIN_FILENO); |
1154 | } | 1170 | } |
1155 | if (0 == write_std.size) | 1171 | if (0 == write_std.size) |
1156 | { | 1172 | { |
1173 | fprintf(stderr, "LOG : %s adds fd_rfcomm to rfds\n", dev.iface); //FIXME: debugging message | ||
1157 | FD_SET (dev.fd_rfcomm, &rfds); | 1174 | FD_SET (dev.fd_rfcomm, &rfds); |
1158 | maxfd = MAX (maxfd, dev.fd_rfcomm); | 1175 | maxfd = MAX (maxfd, dev.fd_rfcomm); |
1159 | } | 1176 | } |
1160 | FD_ZERO (&wfds); | 1177 | FD_ZERO (&wfds); |
1161 | if (0 < write_std.size) | 1178 | if (0 < write_std.size) |
1162 | { | 1179 | { |
1180 | fprintf(stderr, "LOG : %s adds STDOUT to wfds\n", dev.iface); //FIXME: debugging message | ||
1163 | FD_SET (STDOUT_FILENO, &wfds); | 1181 | FD_SET (STDOUT_FILENO, &wfds); |
1164 | maxfd = MAX (maxfd, STDOUT_FILENO); | 1182 | maxfd = MAX (maxfd, STDOUT_FILENO); |
1165 | } | 1183 | } |
1166 | 1184 | ||
1167 | for (i = 0; i < crt_rfds; i++) | 1185 | for (i = 0; i < crt_rfds; i++) |
1168 | { | 1186 | { |
1187 | fprintf(stderr, "LOG : %s adds extra fds to rfds\n", dev.iface); //FIXME: debugging message | ||
1169 | FD_SET (rfds_list[i], &rfds); | 1188 | FD_SET (rfds_list[i], &rfds); |
1170 | maxfd = MAX (maxfd, rfds_list[i]); | 1189 | maxfd = MAX (maxfd, rfds_list[i]); |
1171 | } | 1190 | } |
1172 | 1191 | ||
1173 | for (i = 0; i < crt_wfds; i++) | 1192 | for (i = 0; i < crt_wfds; i++) |
1174 | { | 1193 | { |
1194 | fprintf(stderr, "LOG : %s adds extra fds to wfds\n", dev.iface); //FIXME: debugging message | ||
1175 | FD_SET (wfds_list[i], &wfds); | 1195 | FD_SET (wfds_list[i], &wfds); |
1176 | maxfd = MAX (maxfd, wfds_list[i]); | 1196 | maxfd = MAX (maxfd, wfds_list[i]); |
1177 | } | 1197 | } |
1178 | 1198 | ||
1179 | if (0 < write_pout.size) | 1199 | if (0 < write_pout.size) |
1180 | { | 1200 | { |
1181 | int sendsocket, status; | 1201 | int sendsocket, status; |
1182 | struct sockaddr_rc addr = { 0 }; | 1202 | struct sockaddr_rc addr = { 0 }; |
1183 | struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame *frame; | 1203 | struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame *frame; |
1184 | 1204 | ||
1185 | memset (dest, 0, sizeof (dest)); | ||
1186 | |||
1187 | sendsocket = socket (AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM); | ||
1188 | |||
1189 | if (sendsocket < 0) | ||
1190 | { | ||
1191 | fprintf (stderr, "Failed to create a RFCOMM socket (sending stage): %s\n", | ||
1192 | strerror (errno)); | ||
1193 | return -1; | ||
1194 | } | ||
1195 | |||
1196 | /* Get the destination address */ | 1205 | /* Get the destination address */ |
1197 | //FIXME : not sure if this is correct | 1206 | //FIXME : not sure if this is correct |
1198 | frame = (struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame *) write_pout.buf; | 1207 | frame = (struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame *) write_pout.buf; |
1199 | memcpy (&addr.rc_bdaddr, &frame->addr1, sizeof (bdaddr_t)); | ||
1200 | |||
1201 | addr.rc_family = AF_BLUETOOTH; | ||
1202 | addr.rc_channel = get_channel (&dev, addr.rc_bdaddr); | ||
1203 | |||
1204 | /*TODO: use a NON-BLOCKING socket | ||
1205 | * sock_flags = fcntl (sendsocket, F_GETFL, 0); | ||
1206 | * fcntl( sendsocket, F_SETFL, sock_flags | O_NONBLOCK); | ||
1207 | */ | ||
1208 | status = connect (sendsocket, (struct sockaddr *) &addr, sizeof (addr)); | ||
1209 | if (0 != status && errno != EAGAIN) | ||
1210 | { | ||
1211 | //fprintf (stderr, "connect error on %s\n", argv[1]); | ||
1212 | perror("Connect error"); | ||
1213 | return -1; | ||
1214 | } | ||
1215 | 1208 | ||
1216 | FD_SET (sendsocket, &wfds); | 1209 | if (memcmp (&frame->addr1, &dev.pl_mac, |
1217 | maxfd = MAX (maxfd, sendsocket); | 1210 | sizeof (struct GNUNET_TRANSPORT_WLAN_MacAddress)) == 0) |
1218 | 1211 | { | |
1219 | if (crt_wfds < MAX_PORTS) | 1212 | fprintf (stderr, "LOG : %s has a message for him:)\n", dev.iface); //FIXME: debugging message |
1220 | wfds_list[crt_wfds++] = sendsocket; //add the socket to the list | 1213 | memset (&write_pout, 0, sizeof (write_pout)); // clear the buffer |
1221 | else | 1214 | } |
1215 | else if (memcmp (&frame->addr1, &broadcast, | ||
1216 | sizeof (struct GNUNET_TRANSPORT_WLAN_MacAddress)) == 0) | ||
1217 | { | ||
1218 | fprintf (stderr, "LOG : %s has a broadcast message\n", dev.iface); //FIXME: debugging message | ||
1219 | memset (&write_pout, 0, sizeof (write_pout)); //FIXME for now just clear the buffer | ||
1220 | send_broadcast(); | ||
1221 | } | ||
1222 | else | ||
1222 | { | 1223 | { |
1223 | fprintf (stderr, "The limit for the write file descriptors list was \ | 1224 | fprintf (stderr, "LOG : %s has a new message for %x:%x:%x:%x:%x:%x\n", dev.iface, |
1224 | reached\n"); | 1225 | frame->addr1.mac[5], frame->addr1.mac[4], frame->addr1.mac[3], |
1225 | break; | 1226 | frame->addr1.mac[2], frame->addr1.mac[1], frame->addr1.mac[0]); //FIXME: debugging message |
1227 | |||
1228 | memcpy (&addr.rc_bdaddr, &frame->addr1, sizeof (bdaddr_t)); | ||
1229 | |||
1230 | sendsocket = socket (AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM); | ||
1231 | |||
1232 | if (sendsocket < 0) | ||
1233 | { | ||
1234 | fprintf (stderr, "Failed to create a RFCOMM socket (sending stage): %s\n", | ||
1235 | strerror (errno)); | ||
1236 | return -1; | ||
1237 | } | ||
1238 | |||
1239 | |||
1240 | addr.rc_family = AF_BLUETOOTH; | ||
1241 | addr.rc_channel = get_channel (&dev, addr.rc_bdaddr); | ||
1242 | |||
1243 | /*TODO: use a NON-BLOCKING socket | ||
1244 | * sock_flags = fcntl (sendsocket, F_GETFL, 0); | ||
1245 | * fcntl( sendsocket, F_SETFL, sock_flags | O_NONBLOCK); | ||
1246 | */ | ||
1247 | status = connect (sendsocket, (struct sockaddr *) &addr, sizeof (addr)); | ||
1248 | if (0 != status && errno != EAGAIN) | ||
1249 | { | ||
1250 | fprintf (stderr, "%s failed to connect\n", dev.iface); | ||
1251 | return -1; | ||
1252 | } | ||
1253 | |||
1254 | FD_SET (sendsocket, &wfds); | ||
1255 | maxfd = MAX (maxfd, sendsocket); | ||
1256 | |||
1257 | if (crt_wfds < MAX_PORTS) | ||
1258 | wfds_list[crt_wfds++] = sendsocket; //add the socket to the list | ||
1259 | else | ||
1260 | { | ||
1261 | fprintf (stderr, "The limit for the write file descriptors list was \ | ||
1262 | reached\n"); | ||
1263 | break; | ||
1264 | } | ||
1226 | } | 1265 | } |
1227 | } | 1266 | } |
1228 | { | 1267 | { |
@@ -1235,8 +1274,7 @@ main (int argc, char *argv[]) | |||
1235 | break; | 1274 | break; |
1236 | } | 1275 | } |
1237 | } | 1276 | } |
1238 | 1277 | for (i = maxfd; i >= 0; i--) | |
1239 | for (i = 0; i <= maxfd; i++) | ||
1240 | { | 1278 | { |
1241 | if (FD_ISSET (i , &wfds)) | 1279 | if (FD_ISSET (i , &wfds)) |
1242 | { | 1280 | { |
@@ -1256,6 +1294,7 @@ main (int argc, char *argv[]) | |||
1256 | write_std.pos = 0; | 1294 | write_std.pos = 0; |
1257 | write_std.size = 0; | 1295 | write_std.size = 0; |
1258 | } | 1296 | } |
1297 | fprintf(stderr, "LOG : %s sends a message to STDOUT\n", dev.iface); //FIXME: debugging message | ||
1259 | } | 1298 | } |
1260 | else | 1299 | else |
1261 | { | 1300 | { |
@@ -1283,7 +1322,9 @@ main (int argc, char *argv[]) | |||
1283 | write_pout.size = 0; | 1322 | write_pout.size = 0; |
1284 | (void) close (i); | 1323 | (void) close (i); |
1285 | } | 1324 | } |
1325 | fprintf(stderr, "LOG : %s sends a message to a DEVICE\n", dev.iface); //FIXME: debugging message | ||
1286 | } | 1326 | } |
1327 | |||
1287 | } | 1328 | } |
1288 | 1329 | ||
1289 | if (FD_ISSET (i, &rfds)) | 1330 | if (FD_ISSET (i, &rfds)) |
@@ -1302,6 +1343,7 @@ main (int argc, char *argv[]) | |||
1302 | /* stop reading... */ | 1343 | /* stop reading... */ |
1303 | stdin_open = 0; | 1344 | stdin_open = 0; |
1304 | } | 1345 | } |
1346 | fprintf(stderr, "LOG : %s receives a message from STDIN\n", dev.iface); //FIXME: debugging message | ||
1305 | mst_receive (stdin_mst, readbuf, ret); | 1347 | mst_receive (stdin_mst, readbuf, ret); |
1306 | } | 1348 | } |
1307 | else if (i == dev.fd_rfcomm) | 1349 | else if (i == dev.fd_rfcomm) |
@@ -1311,7 +1353,7 @@ main (int argc, char *argv[]) | |||
1311 | unsigned int opt = sizeof (addr); | 1353 | unsigned int opt = sizeof (addr); |
1312 | 1354 | ||
1313 | readsocket = accept (dev.fd_rfcomm, (struct sockaddr *) &addr, &opt); | 1355 | readsocket = accept (dev.fd_rfcomm, (struct sockaddr *) &addr, &opt); |
1314 | 1356 | fprintf(stderr, "LOG : %s accepts a message\n", dev.iface); //FIXME: debugging message | |
1315 | if (readsocket == -1) | 1357 | if (readsocket == -1) |
1316 | { | 1358 | { |
1317 | fprintf (stderr, "Failed to accept a connection on interface: %s\n", | 1359 | fprintf (stderr, "Failed to accept a connection on interface: %s\n", |
@@ -1344,6 +1386,7 @@ main (int argc, char *argv[]) | |||
1344 | - sizeof (struct GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage) | 1386 | - sizeof (struct GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage) |
1345 | + sizeof (struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame), | 1387 | + sizeof (struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame), |
1346 | rrm); | 1388 | rrm); |
1389 | fprintf (stderr, "LOG: %s reads something from the socket\n", dev.iface);//FIXME : debugging message | ||
1347 | if (0 > ret) | 1390 | if (0 > ret) |
1348 | { | 1391 | { |
1349 | fprintf (stderr, "Read error from rfcomm socket: %s\n", strerror (errno)); | 1392 | fprintf (stderr, "Read error from rfcomm socket: %s\n", strerror (errno)); |
@@ -1363,8 +1406,8 @@ main (int argc, char *argv[]) | |||
1363 | } | 1406 | } |
1364 | /* Error handling, try to clean up a bit at least */ | 1407 | /* Error handling, try to clean up a bit at least */ |
1365 | mst_destroy (stdin_mst); | 1408 | mst_destroy (stdin_mst); |
1409 | stdin_mst = NULL; | ||
1366 | sdp_close (dev.session); | 1410 | sdp_close (dev.session); |
1367 | |||
1368 | (void) close (dev.fd_rfcomm); | 1411 | (void) close (dev.fd_rfcomm); |
1369 | for (i = 0; i < crt_rfds; i++) | 1412 | for (i = 0; i < crt_rfds; i++) |
1370 | (void) close (rfds_list[i]); | 1413 | (void) close (rfds_list[i]); |