Herakles
Profifragensteller
Moin!
Ich möchte die Signaklstärke eines Accesspoints aus dem WLAN abgreifen, also quasi wissen, wie stark ein Accesspoint ist. Mit UDP klappt das wunderbar:
Weiche ich nun aber von meinem UDP ab und möchte das ganze auf IP Ebene machen, bekomme ich eine "Operation not supported" Meldung beim absetzen des ioctl()-Befehls innerhalb iw_get_ext().
Die socket-Adresse sieht bei RAW ja so aus:
Setze ich für den hier erstellten socket ein iw_get_ext() ab, kommt die genannte Fehlermeldung und Statistiken bekomme ich keine. SIOCGIWSTATS wird also offenbar von RAW nicht gemocht. Wieso ist das so? Und vor allem: wie funktioniert's? Wie bekomme ich die Signalstärke eines APs, wenn ich nur Beacons von ihm empfange und nicht assoziiert bin?
Danke, Herakles
Ich möchte die Signaklstärke eines Accesspoints aus dem WLAN abgreifen, also quasi wissen, wie stark ein Accesspoint ist. Mit UDP klappt das wunderbar:
Code:
struct sockaddr_in server_address;
server_address.sin_family = AF_INET;
server_address.sin_port = htons( port );
inet_aton( argv[2], &server_address.sin_addr );
fd_socket = socket ( AF_INET, SOCK_DGRAM, 0 );
/* endless loop */
while(1) {
memset(&data_packet.wli, 0, sizeof(wireless_info));
struct iwreq wrq;
wrq.u.data.pointer = (caddr_t) &data_packet.wli.stats;
if(iw_get_ext(fd_socket, device, SIOCGIWSTATS, &wrq) < 0)
return(-1);
printf("signal level.: %d dBm\n", data_packet.wli.stats.qual.level - 256);
printf("noise level..: %d dBm\n", data_packet.wli.stats.qual.noise - 256);
}
Weiche ich nun aber von meinem UDP ab und möchte das ganze auf IP Ebene machen, bekomme ich eine "Operation not supported" Meldung beim absetzen des ioctl()-Befehls innerhalb iw_get_ext().
Die socket-Adresse sieht bei RAW ja so aus:
Code:
struct ifreq ifr;
struct packet_mreq mr;
struct sockaddr_ll sll;
/* find the interface index */
memset( &ifr, 0, sizeof( ifr ) );
strncpy( ifr.ifr_name, iface, sizeof( ifr.ifr_name ) - 1 );
if( ioctl( fd, SIOCGIFINDEX, &ifr ) < 0 ) {
perror( "ioctl(SIOCGIFINDEX) failed" );
return( 1 );
}
/* bind the raw socket to the interface */
memset( &sll, 0, sizeof( sll ) );
sll.sll_family = AF_PACKET;
sll.sll_ifindex = ifr.ifr_ifindex;
sll.sll_protocol = htons( ETH_P_ALL );
if( bind( fd, (struct sockaddr *) &sll, sizeof( sll ) ) < 0 ) {
perror( "bind(ETH_P_ALL) failed" );
return( 1 );
}
Setze ich für den hier erstellten socket ein iw_get_ext() ab, kommt die genannte Fehlermeldung und Statistiken bekomme ich keine. SIOCGIWSTATS wird also offenbar von RAW nicht gemocht. Wieso ist das so? Und vor allem: wie funktioniert's? Wie bekomme ich die Signalstärke eines APs, wenn ich nur Beacons von ihm empfange und nicht assoziiert bin?
Danke, Herakles