return -1;
}
addr_len = sizeof(rth->local);
- if (getsockname(rth->fd, (struct sockaddr*)&rth->local, &addr_len) < 0) {
+ if (getsockname(rth->fd, (struct sockaddr*)&rth->local,
+ (socklen_t *) &addr_len) < 0) {
perror("Cannot getsockname");
return -1;
}
/*------------------------------------------------------------------*/
/*
+ * Dump a buffer as a serie of hex
+ * Maybe should go in iwlib...
+ * Maybe we should have better formatting like iw_print_key...
+ */
+static char *
+iw_hexdump(char * buf,
+ size_t buflen,
+ const unsigned char *data,
+ size_t datalen)
+{
+ size_t i;
+ char * pos = buf;
+
+ for(i = 0; i < datalen; i++)
+ pos += snprintf(pos, buf + buflen - pos, "%02X", data[i]);
+ return buf;
+}
+
+/*------------------------------------------------------------------*/
+/*
* Print one element from the scanning results
*/
static inline int
int has_range)
{
char buffer[128]; /* Temporary buffer */
+ char buffer2[30]; /* Temporary buffer */
char * prefix = (IW_IS_GET(event->cmd) ? "New" : "Set");
/* Now, let's decode the event */
case SIOCGIWESSID:
{
char essid[IW_ESSID_MAX_SIZE+1];
+ memset(essid, '\0', sizeof(essid));
if((event->u.essid.pointer) && (event->u.essid.length))
memcpy(essid, event->u.essid.pointer, event->u.essid.length);
- essid[event->u.essid.length] = '\0';
if(event->u.essid.flags)
{
/* Does it have an ESSID index ? */
{
unsigned char key[IW_ENCODING_TOKEN_MAX];
if(event->u.data.pointer)
- memcpy(key, event->u.essid.pointer, event->u.data.length);
+ memcpy(key, event->u.data.pointer, event->u.data.length);
else
event->u.data.flags |= IW_ENCODE_NOKEY;
printf("Set Encryption key:");
/* Events generated by the driver when something important happens */
case SIOCGIWAP:
printf("New Access Point/Cell address:%s\n",
- iw_pr_ether(buffer, event->u.ap_addr.sa_data));
+ iw_sawap_ntop(&event->u.ap_addr, buffer));
break;
case SIOCGIWSCAN:
printf("Scan request completed\n");
break;
case IWEVTXDROP:
printf("Tx packet dropped:%s\n",
- iw_pr_ether(buffer, event->u.addr.sa_data));
+ iw_saether_ntop(&event->u.addr, buffer));
break;
case IWEVCUSTOM:
{
char custom[IW_CUSTOM_MAX+1];
+ memset(custom, '\0', sizeof(custom));
if((event->u.data.pointer) && (event->u.data.length))
memcpy(custom, event->u.data.pointer, event->u.data.length);
- custom[event->u.data.length] = '\0';
printf("Custom driver event:%s\n", custom);
}
break;
case IWEVREGISTERED:
printf("Registered node:%s\n",
- iw_pr_ether(buffer, event->u.addr.sa_data));
+ iw_saether_ntop(&event->u.addr, buffer));
break;
case IWEVEXPIRED:
printf("Expired node:%s\n",
- iw_pr_ether(buffer, event->u.addr.sa_data));
+ iw_saether_ntop(&event->u.addr, buffer));
break;
case SIOCGIWTHRSPY:
{
memcpy(&threshold, event->u.data.pointer,
sizeof(struct iw_thrspy));
printf("Spy threshold crossed on address:%s\n",
- iw_pr_ether(buffer, threshold.addr.sa_data));
+ iw_saether_ntop(&threshold.addr, buffer));
iw_print_stats(buffer, sizeof(buffer),
&threshold.qual, iw_range, has_range);
printf(" Link %s\n", buffer);
printf("Invalid Spy Threshold event\n");
}
break;
+ /* ----- driver WPA events ----- */
+ /* Events generated by the driver, used for WPA operation */
+ case IWEVMICHAELMICFAILURE:
+ if(event->u.data.length >= sizeof(struct iw_michaelmicfailure))
+ {
+ struct iw_michaelmicfailure mf;
+ memcpy(&mf, event->u.data.pointer, sizeof(mf));
+ printf("Michael MIC failure flags:0x%X src_addr:%s tsc:%s\n",
+ mf.flags,
+ iw_saether_ntop(&mf.src_addr, buffer2),
+ iw_hexdump(buffer, sizeof(buffer),
+ mf.tsc, IW_ENCODE_SEQ_MAX_SIZE));
+ }
+ break;
+ case IWEVASSOCREQIE:
+ printf("Association Request IEs:%s\n",
+ iw_hexdump(buffer, sizeof(buffer),
+ event->u.data.pointer, event->u.data.length));
+ break;
+ case IWEVASSOCRESPIE:
+ printf("Association Response IEs:%s\n",
+ iw_hexdump(buffer, sizeof(buffer),
+ event->u.data.pointer, event->u.data.length));
+ break;
+ case IWEVPMKIDCAND:
+ if(event->u.data.length >= sizeof(struct iw_pmkid_cand))
+ {
+ struct iw_pmkid_cand cand;
+ memcpy(&cand, event->u.data.pointer, sizeof(cand));
+ printf("PMKID candidate flags:0x%X index:%d bssid:%s\n",
+ cand.flags, cand.index,
+ iw_saether_ntop(&cand.bssid, buffer));
+ }
+ break;
/* ----- junk ----- */
/* other junk not currently in use */
case SIOCGIWRATE:
int ret;
char buffer[64];
struct timeval recv_time;
+ struct timezone tz;
struct wireless_iface * wireless_data;
/* Get data from cache */
return(-1);
/* Print received time in readable form */
- gettimeofday(&recv_time, NULL);
- iw_print_timeval(buffer, sizeof(buffer), &recv_time);
+ gettimeofday(&recv_time, &tz);
+ iw_print_timeval(buffer, sizeof(buffer), &recv_time, &tz);
iw_init_event_stream(&stream, data, len);
do