setting bssid in adhoc mode

John Hay jhay at meraka.org.za
Mon Sep 29 13:49:58 UTC 2008


On Sat, Sep 27, 2008 at 12:16:00PM -0700, Sam Leffler wrote:
> John Hay wrote:
> >>>>>>>I'm trying out the new ath/wlan stuff in current. Should one still be
> >>>>>>>able to set the bssid in adhoc mode? We normally lock the bssid in
> >>>>>>>an adhoc network because of problems that the network split and does
> >>>>>>>not merge, if you do not do it.
> >>>>>>>
> >>>>>>>What I have done is this:
> >>>>>>>
> >>>>>>># ifconfig wlan0 create wlandev ath0 wlanmode adhoc
> >>>>>>># ifconfig wlan0 ssid ptamesh up
> >>>>>>>
> >>>>>>>Up to here works well. It will scan and if it finds another node with
> >>>>>>>the
> >>>>>>>same ssid, it will "lock" on that channel and use the correct bssid.
> >>>>>>>
> >>>>>>>If it does not find another node with the same ssid, it will start it
> >>>>>>>own thing on channel 10. But it looks like one cannot set the bssid.
> >>>>>>>
> >>>>>>># ifconfig wlan0 bssid 02:07:ca:fe:ba:be
> >>>>>>>ifconfig: 02:07:ca:fe:ba:be: bad value
> >>>>>>>         
> >>>>>>>              
> >>>>>>I had similar experience with STA mode, instead I use ap (ap is alias
> >>>>>>for bssid, at least it works in STA mode)
> >>>>>>I never bothered is this bug in manual page, ifconfig or in something 
> >>>>>>else
> >>>>>>...
> >>>>>>       
> >>>>>>            
> >>>>>Ah, thanks yes, "ifconfig wlan0 ap 02:07:ca:fe:ba:be" works just fine.
> >>>>>Just do not try to unset it with "ifconfig wlan0 ap -". That is an
> >>>>>alias for "panic now" :-)
> >>>>>     
> >>>>>          
> >>>>Well, on my system it doesnt panic here.
> >>>>So more info to debug "your" panic is required ...
> >>>>   
> >>>>        
> >>>I'll have to see if I can reproduce it.
> >>>
> >>> 
> >>>      
> >>>>>So it looks like ifconfig is getting confused with the many different
> >>>>>uses of the keyword bssid.
> >>>>>
> >>>>>I must say I still do not understand what the other use for bssid is.
> >>>>>Close to the end of ifconfig/ifieee80211.c there are these:
> >>>>>
> >>>>>DEF_CMD_ARG("bssid",            set80211bssid),
> >>>>>DEF_CMD_ARG("ap",               set80211bssid),
> >>>>>...
> >>>>>DEF_CLONE_CMD("bssid",  1,      set80211clone_bssid),
> >>>>>DEF_CLONE_CMD("-bssid", 0,      set80211clone_bssid),
> >>>>>
> >>>>>So my guess is that I was hitting the clone version when in fact I
> >>>>>needed the other version. Luckily ap does not have a clone version.
> >>>>>So when should the clone version be used? And how does ifconfig
> >>>>>decide which one to use?
> >>>>>     
> >>>>>          
> >>>I looked into the ifconfig code a bit more. I think that with the
> >>>current code in the ifconfig() and cmd_lookup() functions, it is
> >>>imposssible to have two different keywords that share the same
> >>>keyword. cmd_lookup() will always search until it finds the first
> >>>instance in the list and return that. The first instance in this
> >>>case being the last one added.
> >>> 
> >>>      
> >>Correct.
> >>
> >>    
> >>>So either the code must change or one of the bssid keywords have
> >>>to change. My suggestion would be to keep the bssid for which ap
> >>>is an alias and change the other one. Anybody have a suggestion
> >>>of what to change it to?
> >>>
> >>> 
> >>>      
> >>I prefer to change the code to handle this ambiguity within 
> >>ifieee80211.c.  You cannot use both together or at least they are 
> >>redundant.  I'll look at it when I've got time; but don't let me 
> >>distract you.
> >>    
> >
> >So what should the behaviour be? How should ifconfig know which bssid
> >function to use? Should the clone variant be used when it is used on
> >the same line as create? And the other if there is not a create on the
> >line? Or some other way? And should the other DEF_CLONE... keywords
> >also be handled the same way?
> >
> >John
> >  
> Try the attached change.  It looked easier to fix this for all possible 
> usage instead of complicating the 802.11 stuff.  The change forces all 
> keywords marked "DEF_CLONE" to come first on the command line followed 
> by keywords that are marked !DEF_CLONE.  At some point it's likely we'll 
> need to stick a real parser in ifconfig but I think this change is small 
> enough to just do it this way (it also slightly cleans up the hack for 
> pushing the clone operation out before parsing/handling subsequent cmd 
> line args).

Thanks, I have tried it on my notebook and some Avila ARM boards and
it works well. Together with your fix for resetting the bssid, things
are looking well. Scanning in adhoc mode is also working again.

BTW. I have tried my 4 atheros cards in an Avila again and it is working!
I think it was the interrupt fixes by Rafal.

John

>    Sam
> 

> Index: ifconfig.c
> ===================================================================
> --- ifconfig.c	(revision 183416)
> +++ ifconfig.c	(working copy)
> @@ -392,14 +392,21 @@
>  }
>  
>  static const struct cmd *
> -cmd_lookup(const char *name)
> +cmd_lookup(const char *name, int iscreate)
>  {
>  #define	N(a)	(sizeof(a)/sizeof(a[0]))
>  	const struct cmd *p;
>  
>  	for (p = cmds; p != NULL; p = p->c_next)
> -		if (strcmp(name, p->c_name) == 0)
> -			return p;
> +		if (strcmp(name, p->c_name) == 0) {
> +			if (iscreate) {
> +				if (p->c_iscloneop)
> +					return p;
> +			} else {
> +				if (!p->c_iscloneop)
> +					return p;
> +			}
> +		}
>  	return NULL;
>  #undef N
>  }
> @@ -437,6 +444,7 @@
>  ifconfig(int argc, char *const *argv, int iscreate, const struct afswtch *afp)
>  {
>  	const struct afswtch *nafp;
> +	const struct cmd *p;
>  	struct callback *cb;
>  	int s;
>  
> @@ -452,9 +460,38 @@
>  		err(1, "socket(family %u,SOCK_DGRAM", ifr.ifr_addr.sa_family);
>  
>  	while (argc > 0) {
> -		const struct cmd *p;
> -
> -		p = cmd_lookup(*argv);
> +		p = cmd_lookup(*argv, iscreate);
> +		if (iscreate && p == NULL) {
> +			/*
> +			 * Push the clone create callback so the new
> +			 * device is created and can be used for any
> +			 * remaining arguments.
> +			 */
> +			cb = callbacks;
> +			if (cb == NULL)
> +				errx(1, "internal error, no callback");
> +			callbacks = cb->cb_next;
> +			cb->cb_func(s, cb->cb_arg);
> +			iscreate = 0;
> +			/*
> +			 * Handle any address family spec that
> +			 * immediately follows and potentially
> +			 * recreate the socket.
> +			 */
> +			nafp = af_getbyname(*argv);
> +			if (nafp != NULL) {
> +				argc--, argv++;
> +				if (nafp != afp) {
> +					close(s);
> +					afp = nafp;
> +					goto top;
> +				}
> +			}
> +			/*
> +			 * Look for a normal parameter.
> +			 */
> +			continue;
> +		}
>  		if (p == NULL) {
>  			/*
>  			 * Not a recognized command, choose between setting
> @@ -463,33 +500,6 @@
>  			p = (setaddr ? &setifdstaddr_cmd : &setifaddr_cmd);
>  		}
>  		if (p->c_u.c_func || p->c_u.c_func2) {
> -			if (iscreate && !p->c_iscloneop) { 
> -				/*
> -				 * Push the clone create callback so the new
> -				 * device is created and can be used for any
> -				 * remaining arguments.
> -				 */
> -				cb = callbacks;
> -				if (cb == NULL)
> -					errx(1, "internal error, no callback");
> -				callbacks = cb->cb_next;
> -				cb->cb_func(s, cb->cb_arg);
> -				iscreate = 0;
> -				/*
> -				 * Handle any address family spec that
> -				 * immediately follows and potentially
> -				 * recreate the socket.
> -				 */
> -				nafp = af_getbyname(*argv);
> -				if (nafp != NULL) {
> -					argc--, argv++;
> -					if (nafp != afp) {
> -						close(s);
> -						afp = nafp;
> -						goto top;
> -					}
> -				}
> -			}
>  			if (p->c_parameter == NEXTARG) {
>  				if (argv[1] == NULL)
>  					errx(1, "'%s' requires argument",


-- 
John Hay -- John.Hay at meraka.csir.co.za / jhay at FreeBSD.org


More information about the freebsd-mobile mailing list