aboutsummaryrefslogtreecommitdiff
path: root/src/transport/gnunet-helper-transport-bluetooth.c
diff options
context:
space:
mode:
authorClaudiu Olteanu <claudiu@140774ce-b5e7-0310-ab8b-a85725594a96>2013-07-19 16:48:12 +0000
committerClaudiu Olteanu <claudiu@140774ce-b5e7-0310-ab8b-a85725594a96>2013-07-19 16:48:12 +0000
commit2904abb26e88eaef03c79e0a6571c6245032a2f1 (patch)
treecec51257a50b20233555060ad39fd1fec554eb99 /src/transport/gnunet-helper-transport-bluetooth.c
parent1421f70e9abc758b976bd89020bcbfa4be3964ae (diff)
downloadgnunet-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.c141
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;
114static struct SendBuffer write_std; 114static struct SendBuffer write_std;
115 115
116 116
117static 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 {
241do_align: 246do_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 */
1039static void
1040send_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]);