Update for vaps:

o do not force monitor mode; the wlanX ifnet must be an ahdemo mode vap
o move channel change work before marking ifnet up to avoid churning
  the state machine
o change default ifnet name to "wlan0"

Approved by:	re (kensmith)
This commit is contained in:
sam 2009-07-24 15:31:22 +00:00
parent 671d3b45e2
commit 33f3a67bc1
9 changed files with 32 additions and 114 deletions

View File

@ -275,9 +275,14 @@ void set_chan(int c) {
void setup_if(char *dev) {
struct ifreq ifr;
unsigned int flags;
struct ifmediareq ifmr;
int *mwords;
// set chan
memset(&chaninfo.ireq, 0, sizeof(chaninfo.ireq));
strcpy(chaninfo.ireq.i_name, dev);
chaninfo.ireq.i_type = IEEE80211_IOC_CHANNEL;
set_chan(1);
// set iface up and promisc
memset(&ifr, 0, sizeof(ifr));
strcpy(ifr.ifr_name, dev);
@ -293,39 +298,6 @@ void setup_if(char *dev) {
ifr.ifr_flagshigh = flags >> 16;
if (ioctl(ioctl_s, SIOCSIFFLAGS, &ifr) == -1)
die(1, "ioctl(SIOCSIFFLAGS)");
// set monitor mode
memset(&ifmr, 0, sizeof(ifmr));
strcpy(ifmr.ifm_name, dev);
if (ioctl(ioctl_s, SIOCGIFMEDIA, &ifmr) == -1)
die(1, "ioctl(SIOCGIFMEDIA)");
if (ifmr.ifm_count == 0)
die(0, "0 media thinggies...\n");
mwords = (int *)malloc(ifmr.ifm_count * sizeof(int));
if (!mwords)
die(1, "malloc()");
ifmr.ifm_ulist = mwords;
if (ioctl(ioctl_s, SIOCGIFMEDIA, &ifmr) == -1)
die(1, "ioctl(SIOCGIFMEDIA)");
free(mwords);
memset(&ifr, 0, sizeof(ifr));
strcpy(ifr.ifr_name, dev);
ifr.ifr_media = ifmr.ifm_current | IFM_IEEE80211_MONITOR;
if (ioctl(ioctl_s, SIOCSIFMEDIA, &ifr) == -1)
die(1, "ioctl(SIOCSIFMEDIA)");
// set chan
memset(&chaninfo.ireq, 0, sizeof(chaninfo.ireq));
strcpy(chaninfo.ireq.i_name, dev);
chaninfo.ireq.i_type = IEEE80211_IOC_CHANNEL;
set_chan(1);
}
void open_bpf(char *dev, int dlt) {

View File

@ -4,7 +4,7 @@ This is a collection of tools that use raw 802.11 packet injection.
None of the tools configure the interface, so be sure to run something
like:
ifconfig ath0 channel 7 mediaopt monitor promisc up
ifconfig wlan create wlandev ath0 wlanmode ahdemo channel 7 promisc up
beforehand. The following tools are found here:

View File

@ -846,7 +846,7 @@ void next_event(struct params *p)
int main(int argc, char *argv[])
{
char *iface = "ath0";
char *iface = "wlan0";
char *tap = "tap0";
struct params p;
int ch;

View File

@ -710,7 +710,7 @@ int main(int argc, char *argv[])
char mac[] = { 0x00, 0x00, 0xde, 0xfa, 0xce, 0xd };
int ch;
struct params p;
char *iface = "ath0";
char *iface = "wlan0";
char *tap = "tap0";
int timeout = 50*1000;
struct timeval start;

View File

@ -421,7 +421,7 @@ void usage(char *name)
int main(int argc, char *argv[])
{
struct params p;
char *iface = "ath0";
char *iface = "wlan0";
char *tap = "tap0";
int ch;

View File

@ -602,7 +602,7 @@ void transmit(struct params *p)
int main(int argc, char *argv[])
{
struct params p;
char *iface = "ath0";
char *iface = "wlan0";
char *tap = "tap0";
int ch;

View File

@ -631,7 +631,7 @@ void usage(char *name)
int main(int argc, char *argv[])
{
struct params p;
char *iface = "ath0";
char *iface = "wlan0";
char *tap = "tap0";
int ch;

View File

@ -384,6 +384,15 @@ void setup_if(char *dev) {
exit(1);
}
// set chan
memset(&chaninfo.ireq, 0, sizeof(chaninfo.ireq));
strcpy(chaninfo.ireq.i_name, dev);
chaninfo.ireq.i_type = IEEE80211_IOC_CHANNEL;
chaninfo.chan = 0;
chaninfo.s = s;
set_chan(1);
// set iface up and promisc
memset(&ifr, 0, sizeof(ifr));
strcpy(ifr.ifr_name, dev);
@ -404,49 +413,6 @@ void setup_if(char *dev) {
exit(1);
}
// set monitor mode
memset(&ifmr, 0, sizeof(ifmr));
strcpy(ifmr.ifm_name, dev);
if (ioctl(s, SIOCGIFMEDIA, &ifmr) == -1) {
perror("ioctl(SIOCGIFMEDIA)");
exit(1);
}
if (ifmr.ifm_count == 0) {
time_print("0 media thinggies...\n");
exit(1);
}
mwords = (int *)malloc(ifmr.ifm_count * sizeof(int));
if (!mwords) {
perror("malloc()");
exit(1);
}
ifmr.ifm_ulist = mwords;
if (ioctl(s, SIOCGIFMEDIA, &ifmr) == -1) {
perror("ioctl(SIOCGIFMEDIA)");
exit(1);
}
free(mwords);
memset(&ifr, 0, sizeof(ifr));
strcpy(ifr.ifr_name, dev);
ifr.ifr_media = ifmr.ifm_current | IFM_IEEE80211_MONITOR;
if (ioctl(s, SIOCSIFMEDIA, &ifr) == -1) {
perror("ioctl(SIOCSIFMEDIA)");
exit(1);
}
// set chan
memset(&chaninfo.ireq, 0, sizeof(chaninfo.ireq));
strcpy(chaninfo.ireq.i_name, dev);
chaninfo.ireq.i_type = IEEE80211_IOC_CHANNEL;
chaninfo.chan = 0;
chaninfo.s = s;
set_chan(1);
printf("done\n");
}

View File

@ -58,6 +58,14 @@ void setup_if(char *dev, int chan) {
if ((s = socket(PF_INET, SOCK_DGRAM, 0)) == -1)
err(1, "socket()");
/* chan */
memset(&ireq, 0, sizeof(ireq));
snprintf(ireq.i_name, sizeof(ireq.i_name), "%s", dev);
ireq.i_type = IEEE80211_IOC_CHANNEL;
ireq.i_val = chan;
if (ioctl(s, SIOCS80211, &ireq) == -1)
err(1, "ioctl(SIOCS80211)");
/* UP & PROMISC */
memset(&ifr, 0, sizeof(ifr));
snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%s", dev);
@ -70,34 +78,6 @@ void setup_if(char *dev, int chan) {
if (ioctl(s, SIOCSIFFLAGS, &ifr) == -1)
err(1, "ioctl(SIOCSIFFLAGS)");
/* set monitor mode */
memset(&ifmr, 0, sizeof(ifmr));
snprintf(ifmr.ifm_name, sizeof(ifmr.ifm_name), "%s", dev);
if (ioctl(s, SIOCGIFMEDIA, &ifmr) == -1)
err(1, "ioctl(SIOCGIFMEDIA)");
if (ifmr.ifm_count == 0) {
printf("0 media thinggies...\n");
exit(1);
}
mwords = (int *)malloc(ifmr.ifm_count * sizeof(int));
if (!mwords)
err(1, "malloc()");
ifmr.ifm_ulist = mwords;
if (ioctl(s, SIOCGIFMEDIA, &ifmr) == -1)
err(1, "ioctl(SIOCGIFMEDIA)");
free(mwords);
ifr.ifr_media = ifmr.ifm_current | IFM_IEEE80211_MONITOR;
if (ioctl(s, SIOCSIFMEDIA, &ifr) == -1)
err(1, "ioctl(SIOCSIFMEDIA)");
/* chan */
memset(&ireq, 0, sizeof(ireq));
snprintf(ireq.i_name, sizeof(ireq.i_name), "%s", dev);
ireq.i_type = IEEE80211_IOC_CHANNEL;
ireq.i_val = chan;
if (ioctl(s, SIOCS80211, &ireq) == -1)
err(1, "ioctl(SIOCS80211)");
close(s);
}
@ -546,7 +526,7 @@ int do_verify(struct ieee80211_frame *sent, int slen, void *got, int glen)
int main(int argc, char *argv[])
{
int fd, fd2;
char *iface = "ath0";
char *iface = "wlan0";
char *verify = NULL;
int chan = 1;
struct {