Signalqualität eines APs mit RAW-sockets prüfen

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:

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
 
Zurück
Oben