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-23 20:15:55 +0000
committerClaudiu Olteanu <claudiu@140774ce-b5e7-0310-ab8b-a85725594a96>2013-07-23 20:15:55 +0000
commit72e59e5bed5fa70718ab02642e6cb8f438f97340 (patch)
tree8d279417b018924062f3c1a9a0e8e07913945837 /src/transport/gnunet-helper-transport-bluetooth.c
parent778a92d48e8d642d78e0ee7420090d457472c9e8 (diff)
downloadgnunet-72e59e5bed5fa70718ab02642e6cb8f438f97340.tar.gz
gnunet-72e59e5bed5fa70718ab02642e6cb8f438f97340.zip
skiping the broadcast messages
Diffstat (limited to 'src/transport/gnunet-helper-transport-bluetooth.c')
-rw-r--r--src/transport/gnunet-helper-transport-bluetooth.c261
1 files changed, 135 insertions, 126 deletions
diff --git a/src/transport/gnunet-helper-transport-bluetooth.c b/src/transport/gnunet-helper-transport-bluetooth.c
index 27ba06b2c..a8819c8d6 100644
--- a/src/transport/gnunet-helper-transport-bluetooth.c
+++ b/src/transport/gnunet-helper-transport-bluetooth.c
@@ -539,7 +539,7 @@ register_service (struct HardwareInfos *dev, int rc_channel)
539 /** 539 /**
540 * 1. initializations 540 * 1. initializations
541 * 2. set the service ID, class, profile information 541 * 2. set the service ID, class, profile information
542 * 3. make the service record publicly nrowsable 542 * 3. make the service record publicly browsable
543 * 4. register the RFCOMM channel 543 * 4. register the RFCOMM channel
544 * 5. set the name, provider and description 544 * 5. set the name, provider and description
545 * 6. register the service record to the local SDP server 545 * 6. register the service record to the local SDP server
@@ -1157,49 +1157,48 @@ main (int argc, char *argv[])
1157 1157
1158 stdin_mst = mst_create (&stdin_send_hw, &dev); 1158 stdin_mst = mst_create (&stdin_send_hw, &dev);
1159 stdin_open = 1; 1159 stdin_open = 1;
1160 1160 int ok = 0;
1161 fprintf (stderr, "Check if the program exits\n");
1161 while (1) 1162 while (1)
1162 { 1163 {
1163 maxfd = -1; 1164 maxfd = -1;
1164 FD_ZERO (&rfds); 1165 FD_ZERO (&rfds);
1165 if ((0 == write_pout.size) && (1 == stdin_open)) 1166 if ((0 == write_pout.size) && (1 == stdin_open))
1166 { 1167 {
1167 fprintf(stderr, "LOG : %s adds STDIN to rfds\n", dev.iface); //FIXME: debugging message 1168 // fprintf(stderr, "LOG : %s adds STDIN to rfds\n", dev.iface); //FIXME: debugging message
1168 FD_SET (STDIN_FILENO, &rfds); 1169 FD_SET (STDIN_FILENO, &rfds);
1169 maxfd = MAX (maxfd, STDIN_FILENO); 1170 maxfd = MAX (maxfd, STDIN_FILENO);
1170 } 1171 }
1171 if (0 == write_std.size) 1172 if (0 == write_std.size)
1172 { 1173 {
1173 fprintf(stderr, "LOG : %s adds fd_rfcomm to rfds\n", dev.iface); //FIXME: debugging message 1174 // fprintf(stderr, "LOG : %s adds fd_rfcomm to rfds\n", dev.iface); //FIXME: debugging message
1174 FD_SET (dev.fd_rfcomm, &rfds); 1175 FD_SET (dev.fd_rfcomm, &rfds);
1175 maxfd = MAX (maxfd, dev.fd_rfcomm); 1176 maxfd = MAX (maxfd, dev.fd_rfcomm);
1176 } 1177 }
1177 FD_ZERO (&wfds); 1178 FD_ZERO (&wfds);
1178 if (0 < write_std.size) 1179 if (0 < write_std.size)
1179 { 1180 {
1180 fprintf(stderr, "LOG : %s adds STDOUT to wfds\n", dev.iface); //FIXME: debugging message 1181 // fprintf(stderr, "LOG : %s adds STDOUT to wfds\n", dev.iface); //FIXME: debugging message
1181 FD_SET (STDOUT_FILENO, &wfds); 1182 FD_SET (STDOUT_FILENO, &wfds);
1182 maxfd = MAX (maxfd, STDOUT_FILENO); 1183 maxfd = MAX (maxfd, STDOUT_FILENO);
1183 } 1184 }
1184 1185
1185 for (i = 0; i < crt_rfds; i++) 1186 for (i = 0; i < crt_rfds; i++)
1186 { 1187 {
1187 fprintf(stderr, "LOG : %s adds extra fds to rfds\n", dev.iface); //FIXME: debugging message 1188 // fprintf(stderr, "LOG : %s adds extra fds to rfds\n", dev.iface); //FIXME: debugging message
1188 FD_SET (rfds_list[i], &rfds); 1189 FD_SET (rfds_list[i], &rfds);
1189 maxfd = MAX (maxfd, rfds_list[i]); 1190 maxfd = MAX (maxfd, rfds_list[i]);
1190 } 1191 }
1191 1192
1192 for (i = 0; i < crt_wfds; i++) 1193 for (i = 0; i < crt_wfds; i++)
1193 { 1194 {
1194 fprintf(stderr, "LOG : %s adds extra fds to wfds\n", dev.iface); //FIXME: debugging message 1195 // fprintf(stderr, "LOG : %s adds extra fds to wfds\n", dev.iface); //FIXME: debugging message
1195 FD_SET (wfds_list[i], &wfds); 1196 FD_SET (wfds_list[i], &wfds);
1196 maxfd = MAX (maxfd, wfds_list[i]); 1197 maxfd = MAX (maxfd, wfds_list[i]);
1197 } 1198 }
1198 1199
1199 if (0 < write_pout.size) 1200 if (0 < write_pout.size)
1200 { 1201 {
1201 int sendsocket, status;
1202 struct sockaddr_rc addr = { 0 };
1203 struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame *frame; 1202 struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame *frame;
1204 1203
1205 /* Get the destination address */ 1204 /* Get the destination address */
@@ -1209,19 +1208,23 @@ main (int argc, char *argv[])
1209 if (memcmp (&frame->addr1, &dev.pl_mac, 1208 if (memcmp (&frame->addr1, &dev.pl_mac,
1210 sizeof (struct GNUNET_TRANSPORT_WLAN_MacAddress)) == 0) 1209 sizeof (struct GNUNET_TRANSPORT_WLAN_MacAddress)) == 0)
1211 { 1210 {
1212 fprintf (stderr, "LOG : %s has a message for him:)\n", dev.iface); //FIXME: debugging message 1211 // fprintf (stderr, "LOG : %s has a message for him:)\n", dev.iface); //FIXME: debugging message
1213 memset (&write_pout, 0, sizeof (write_pout)); // clear the buffer 1212 memset (&write_pout, 0, sizeof (write_pout)); // clear the buffer
1214 } 1213 }
1215 else if (memcmp (&frame->addr1, &broadcast, 1214 else if (memcmp (&frame->addr1, &broadcast,
1216 sizeof (struct GNUNET_TRANSPORT_WLAN_MacAddress)) == 0) 1215 sizeof (struct GNUNET_TRANSPORT_WLAN_MacAddress)) == 0)
1217 { 1216 {
1218 fprintf (stderr, "LOG : %s has a broadcast message\n", dev.iface); //FIXME: debugging message 1217 // 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 1218 memset (&write_pout, 0, sizeof (write_pout)); //FIXME for now just clear the buffer
1220 send_broadcast(); 1219 send_broadcast();
1220 ok = 1;
1221 } 1221 }
1222 else 1222 else
1223 { 1223 {
1224 fprintf (stderr, "LOG : %s has a new message for %x:%x:%x:%x:%x:%x\n", dev.iface, 1224 int sendsocket, status;
1225 struct sockaddr_rc addr = { 0 };
1226
1227 fprintf (stderr, "LOG : %s has a new message for %.2X:%.2X:%.2X:%.2X:%.2X:%.2X\n", dev.iface,
1225 frame->addr1.mac[5], frame->addr1.mac[4], frame->addr1.mac[3], 1228 frame->addr1.mac[5], frame->addr1.mac[4], frame->addr1.mac[3],
1226 frame->addr1.mac[2], frame->addr1.mac[1], frame->addr1.mac[0]); //FIXME: debugging message 1229 frame->addr1.mac[2], frame->addr1.mac[1], frame->addr1.mac[0]); //FIXME: debugging message
1227 1230
@@ -1247,7 +1250,7 @@ main (int argc, char *argv[])
1247 status = connect (sendsocket, (struct sockaddr *) &addr, sizeof (addr)); 1250 status = connect (sendsocket, (struct sockaddr *) &addr, sizeof (addr));
1248 if (0 != status && errno != EAGAIN) 1251 if (0 != status && errno != EAGAIN)
1249 { 1252 {
1250 fprintf (stderr, "%s failed to connect\n", dev.iface); 1253 fprintf (stderr, "%s failed to connect : %s\n", dev.iface, strerror (errno));
1251 return -1; 1254 return -1;
1252 } 1255 }
1253 1256
@@ -1264,6 +1267,8 @@ main (int argc, char *argv[])
1264 } 1267 }
1265 } 1268 }
1266 } 1269 }
1270 //fprintf (stderr, "inainte de select\n");
1271 if (ok == 0)
1267 { 1272 {
1268 int retval = select (maxfd + 1, &rfds, &wfds, NULL, NULL); 1273 int retval = select (maxfd + 1, &rfds, &wfds, NULL, NULL);
1269 if ((-1 == retval) && (EINTR == errno)) 1274 if ((-1 == retval) && (EINTR == errno))
@@ -1273,135 +1278,139 @@ main (int argc, char *argv[])
1273 fprintf (stderr, "select failed: %s\n", strerror (errno)); 1278 fprintf (stderr, "select failed: %s\n", strerror (errno));
1274 break; 1279 break;
1275 } 1280 }
1276 } 1281
1277 for (i = maxfd; i >= 0; i--) 1282 // fprintf (stderr, "dupa select\n");
1278 { 1283 for (i = 0; i <= maxfd; i++) //FIXME it should be incremented
1279 if (FD_ISSET (i , &wfds))
1280 { 1284 {
1281 if (i == STDOUT_FILENO) 1285 if (FD_ISSET (i , &wfds))
1282 {
1283 ssize_t ret =
1284 write (STDOUT_FILENO, write_std.buf + write_std.pos,
1285 write_std.size - write_std.pos);
1286 if (0 > ret)
1287 {
1288 fprintf (stderr, "Failed to write to STDOUT: %s\n", strerror (errno));
1289 break;
1290 }
1291 write_std.pos += ret;
1292 if (write_std.pos == write_std.size)
1293 {
1294 write_std.pos = 0;
1295 write_std.size = 0;
1296 }
1297 fprintf(stderr, "LOG : %s sends a message to STDOUT\n", dev.iface); //FIXME: debugging message
1298 }
1299 else
1300 { 1286 {
1301 ssize_t ret = 1287 if (i == STDOUT_FILENO)
1302 write (i, write_pout.buf + write_std.pos,
1303 write_pout.size - write_pout.pos);
1304 if (0 > ret)
1305 { 1288 {
1306 fprintf (stderr, "Failed to write to bluetooth device: %s\n", 1289 ssize_t ret =
1307 strerror (errno)); 1290 write (STDOUT_FILENO, write_std.buf + write_std.pos,
1308 break; 1291 write_std.size - write_std.pos);
1309 } 1292 if (0 > ret)
1310 write_pout.pos += ret; 1293 {
1311 if ((write_pout.pos != write_pout.size) && (0 != ret)) 1294 fprintf (stderr, "Failed to write to STDOUT: %s\n", strerror (errno));
1312 { 1295 break;
1313 /* we should not get partial sends with packet-oriented devices... */ 1296 }
1314 fprintf (stderr, "Write error, partial send: %u/%u\n", 1297 write_std.pos += ret;
1315 (unsigned int) write_pout.pos, 1298 if (write_std.pos == write_std.size)
1316 (unsigned int) write_pout.size); 1299 {
1317 break; 1300 write_std.pos = 0;
1318 } 1301 write_std.size = 0;
1319 if (write_pout.pos == write_pout.size) 1302 }
1303 // fprintf(stderr, "LOG : %s sends a message to STDOUT\n", dev.iface); //FIXME: debugging message
1304 }
1305 else
1320 { 1306 {
1321 write_pout.pos = 0; 1307 ssize_t ret =
1322 write_pout.size = 0; 1308 write (i, write_pout.buf + write_std.pos,
1323 (void) close (i); 1309 write_pout.size - write_pout.pos);
1310 if (0 > ret)
1311 {
1312 fprintf (stderr, "Failed to write to bluetooth device: %s\n",
1313 strerror (errno));
1314 break;
1315 }
1316 write_pout.pos += ret;
1317 if ((write_pout.pos != write_pout.size) && (0 != ret))
1318 {
1319 /* we should not get partial sends with packet-oriented devices... */
1320 fprintf (stderr, "Write error, partial send: %u/%u\n",
1321 (unsigned int) write_pout.pos,
1322 (unsigned int) write_pout.size);
1323 break;
1324 }
1325 if (write_pout.pos == write_pout.size)
1326 {
1327 write_pout.pos = 0;
1328 write_pout.size = 0;
1329 //(void) close (i);
1330 }
1331 // fprintf(stderr, "LOG : %s sends a message to a DEVICE\n", dev.iface); //FIXME: debugging message
1324 } 1332 }
1325 fprintf(stderr, "LOG : %s sends a message to a DEVICE\n", dev.iface); //FIXME: debugging message 1333
1326 } 1334 }
1327
1328 }
1329 1335
1330 if (FD_ISSET (i, &rfds)) 1336 if (FD_ISSET (i, &rfds))
1331 {
1332 if (i == STDIN_FILENO)
1333 {
1334 ssize_t ret =
1335 read (i, readbuf, sizeof (readbuf));
1336 if (0 > ret)
1337 {
1338 fprintf (stderr, "Read error from STDIN: %s\n", strerror (errno));
1339 break;
1340 }
1341 if (0 == ret)
1342 {
1343 /* stop reading... */
1344 stdin_open = 0;
1345 }
1346 fprintf(stderr, "LOG : %s receives a message from STDIN\n", dev.iface); //FIXME: debugging message
1347 mst_receive (stdin_mst, readbuf, ret);
1348 }
1349 else if (i == dev.fd_rfcomm)
1350 { 1337 {
1351 int readsocket; 1338 if (i == STDIN_FILENO)
1352 struct sockaddr_rc addr = { 0 };
1353 unsigned int opt = sizeof (addr);
1354
1355 readsocket = accept (dev.fd_rfcomm, (struct sockaddr *) &addr, &opt);
1356 fprintf(stderr, "LOG : %s accepts a message\n", dev.iface); //FIXME: debugging message
1357 if (readsocket == -1)
1358 { 1339 {
1359 fprintf (stderr, "Failed to accept a connection on interface: %s\n", 1340 ssize_t ret =
1360 strerror (errno)); 1341 read (i, readbuf, sizeof (readbuf));
1361 return -1; 1342 if (0 > ret)
1362 } else {
1363 FD_SET (readsocket, &rfds);
1364 maxfd = MAX (maxfd, readsocket);
1365
1366 if (crt_rfds < MAX_PORTS)
1367 rfds_list[crt_rfds++] = readsocket;
1368 else
1369 { 1343 {
1370 fprintf (stderr, "The limit for the read file descriptors list was \ 1344 fprintf (stderr, "Read error from STDIN: %s\n", strerror (errno));
1371 reached\n");
1372 break; 1345 break;
1373 } 1346 }
1374 } 1347 if (0 == ret)
1375 1348 {
1376 } 1349 /* stop reading... */
1377 else 1350 stdin_open = 0;
1378 { 1351 }
1379 struct GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage *rrm; 1352 // fprintf(stderr, "LOG : %s receives a message from STDIN\n", dev.iface); //FIXME: debugging message
1380 ssize_t ret; 1353 mst_receive (stdin_mst, readbuf, ret);
1381 1354 }
1382 rrm = (struct GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage *) write_std.buf; 1355 else if (i == dev.fd_rfcomm)
1383 ret =
1384 read_from_the_socket (i, (unsigned char *) &rrm->frame,
1385 sizeof (write_std.buf)
1386 - sizeof (struct GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage)
1387 + sizeof (struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame),
1388 rrm);
1389 fprintf (stderr, "LOG: %s reads something from the socket\n", dev.iface);//FIXME : debugging message
1390 if (0 > ret)
1391 { 1356 {
1392 fprintf (stderr, "Read error from rfcomm socket: %s\n", strerror (errno)); 1357 int readsocket;
1393 break; 1358 struct sockaddr_rc addr = { 0 };
1394 } 1359 unsigned int opt = sizeof (addr);
1395 if ((0 < ret) && (0 == mac_test (&rrm->frame, &dev))) 1360
1361 readsocket = accept (dev.fd_rfcomm, (struct sockaddr *) &addr, &opt);
1362 fprintf(stderr, "LOG : %s accepts a message\n", dev.iface); //FIXME: debugging message
1363 if (readsocket == -1)
1364 {
1365 fprintf (stderr, "Failed to accept a connection on interface: %s\n",
1366 strerror (errno));
1367 return -1;
1368 } else {
1369 FD_SET (readsocket, &rfds);
1370 maxfd = MAX (maxfd, readsocket);
1371
1372 if (crt_rfds < MAX_PORTS)
1373 rfds_list[crt_rfds++] = readsocket;
1374 else
1375 {
1376 fprintf (stderr, "The limit for the read file descriptors list was \
1377 reached\n");
1378 break;
1379 }
1380 }
1381
1382 }
1383 else
1396 { 1384 {
1397 write_std.size = ret 1385 struct GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage *rrm;
1398 + sizeof (struct GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage) 1386 ssize_t ret;
1399 - sizeof (struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame); 1387
1400 rrm->header.size = htons (write_std.size); 1388 rrm = (struct GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage *) write_std.buf;
1401 rrm->header.type = htons (GNUNET_MESSAGE_TYPE_WLAN_DATA_FROM_HELPER); 1389 ret =
1390 read_from_the_socket (i, (unsigned char *) &rrm->frame,
1391 sizeof (write_std.buf)
1392 - sizeof (struct GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage)
1393 + sizeof (struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame),
1394 rrm);
1395 fprintf (stderr, "LOG: %s reads something from the socket\n", dev.iface);//FIXME : debugging message
1396 if (0 > ret)
1397 {
1398 fprintf (stderr, "Read error from rfcomm socket: %s\n", strerror (errno));
1399 break;
1400 }
1401 if ((0 < ret) && (0 == mac_test (&rrm->frame, &dev)))
1402 {
1403 write_std.size = ret
1404 + sizeof (struct GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage)
1405 - sizeof (struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame);
1406 rrm->header.size = htons (write_std.size);
1407 rrm->header.type = htons (GNUNET_MESSAGE_TYPE_WLAN_DATA_FROM_HELPER);
1408 }
1402 } 1409 }
1403 } 1410 }
1404 } 1411 }
1412 } else {
1413 ok = 0;
1405 } 1414 }
1406 } 1415 }
1407 /* Error handling, try to clean up a bit at least */ 1416 /* Error handling, try to clean up a bit at least */