2007-06-14 09:06:10

by Johannes Berg

[permalink] [raw]
Subject: more nl80211/iw tool code comments

Hi,

Just briefly looked at your iw tool. Code looks really good, very
readable and understandable :)

A few thoughts/comments:

get_phymode should probably be more strict and not accept things like
"IEEEabg" as A mode. IMHO the only valid things should be
"IEEE<space>802.11<single char>"
"802.11<single char>"
"<single char>"


get_iftype should accept "ap-vlan" which str_iftype returns, although
it's not really useful for use by hand anyway, I think.


You have

iw phy set [ phy ] DEVICE [ CHANSPEC ] [ name NEWNAME ]

and we discussed on IRC that it might make sense to have the same for
nl80211. On the surface, that makes sense, however, it does add a
complication in that we need to either specify that you cannot combine
some attributes (which doesn't really make sense), or we need to take
quite a bit of care with atomicity; setting the channel and changing the
phy name can both fail individually but having them in one netlink
message implies that it's one transaction. I'm not sure the somewhat
cleaner API and saving one command number is worth the additional
transactional safety we need to be careful with then.

So I'd like to reverse my previously stated opinion and say that I now
think that putting these orthogonal things into different commands would
be better so that we don't run into this transaction problem.

Of course, that doesn't counter the other thing, namely that commands
could (should?) be named NL80211_CMD_WIPHY_NAME_{SET,GET,NEW} (del?) and
occur in groups etc.


Another thing: Maybe it should be possible to say "phy# 1" in addition
to "phy phy1" so that it's easier to write scripts that don't care about
concurrent phy name changes? Just a thought.




johannes


Attachments:
signature.asc (190.00 B)
This is a digitally signed message part

2007-06-16 12:17:13

by Johannes Berg

[permalink] [raw]
Subject: Re: more nl80211/iw tool code comments

Hi David,

> The entire iw tool is really just a hack btw...

doesn't look too bad to me, unlike my python tool... :)

> > iw phy set [ phy ] DEVICE [ CHANSPEC ] [ name NEWNAME ]
> >
> > and we discussed on IRC that it might make sense to have the same for
> > nl80211. On the surface, that makes sense, however, it does add a
> > complication in that we need to either specify that you cannot combine
> > some attributes (which doesn't really make sense),
> Hmm, I can't come up with any example other than using some 11n attribute
> with a 11abg phymode... care to hit me with a hint?

I was thinking of the name vs. phy parameters.

> if (err < 0 && modified && net_ratelimit())
> printk(KERN_WARNING "A link change request failed with "
> "some changes comitted already. Interface %s may "
> "have been left with an inconsistent configuration, "
> "please check.\n", dev->name);
>
> So, if rtnetlink doesn't bother too much about "transaction safety" either,
> why should we?

Heh, dunno, I just like to think that one thing posted to the kernel is
done atomically. We can drop that requirement and document it, but that
won't be easy since we'd have to document exactly what is done
atomically.

> If an app wants to know what failed, it can still send SET
> requests broken down into pieces, so they will know which piece failed.
> Obviously they need to leave some stuff grouped (e.g. PHYMODE and CHANNEL),
> but I don't think it's useful to force them do so by breaking stuff into
> multiple commands...
>
> (There is no difference really between
> CMD_SET_PHY name=myphy
> CMD_SET_PHY phymode=a channel=1
> and
> CMD_SET_PHYNAME name=myphy
> CMD_SET_CHANNEL phymode=a channel=1
> but the former allows, if we don't care, to just batch it.)

True. I guess we can leave it as-is and see if we run into problems with
some software or something and if we do document it better ;)

johannes


Attachments:
signature.asc (190.00 B)
This is a digitally signed message part

2007-06-14 14:29:31

by David Lamparter

[permalink] [raw]
Subject: Re: more nl80211/iw tool code comments

Hi!

On Wed, Jun 13, 2007 at 08:23:37PM +0200, Johannes Berg wrote:
> get_phymode should probably be more strict and not accept things like
> "IEEEabg" as A mode.
Changed.

> get_iftype should accept "ap-vlan" which str_iftype returns, although
> it's not really useful for use by hand anyway, I think.
"Oups."

> Another thing: Maybe it should be possible to say "phy# 1" in addition
> to "phy phy1" so that it's easier to write scripts that don't care about
> concurrent phy name changes? Just a thought.
Added, using "phy %0" syntax.

The entire iw tool is really just a hack btw...


> iw phy set [ phy ] DEVICE [ CHANSPEC ] [ name NEWNAME ]
>
> and we discussed on IRC that it might make sense to have the same for
> nl80211. On the surface, that makes sense, however, it does add a
> complication in that we need to either specify that you cannot combine
> some attributes (which doesn't really make sense),
Hmm, I can't come up with any example other than using some 11n attribute
with a 11abg phymode... care to hit me with a hint?

> or we need to take
> quite a bit of care with atomicity; setting the channel and changing the
> phy name can both fail individually but having them in one netlink
> message implies that it's one transaction. I'm not sure the somewhat
> cleaner API and saving one command number is worth the additional
> transactional safety we need to be careful with then.
>
> So I'd like to reverse my previously stated opinion and say that I now
> think that putting these orthogonal things into different commands would
> be better so that we don't run into this transaction problem.

Well, ... take a look at net/core/rtnetlink.c line 716:

if (err < 0 && modified && net_ratelimit())
printk(KERN_WARNING "A link change request failed with "
"some changes comitted already. Interface %s may "
"have been left with an inconsistent configuration, "
"please check.\n", dev->name);

So, if rtnetlink doesn't bother too much about "transaction safety" either,
why should we? If an app wants to know what failed, it can still send SET
requests broken down into pieces, so they will know which piece failed.
Obviously they need to leave some stuff grouped (e.g. PHYMODE and CHANNEL),
but I don't think it's useful to force them do so by breaking stuff into
multiple commands...

(There is no difference really between
CMD_SET_PHY name=myphy
CMD_SET_PHY phymode=a channel=1
and
CMD_SET_PHYNAME name=myphy
CMD_SET_CHANNEL phymode=a channel=1
but the former allows, if we don't care, to just batch it.)


-David

P.S.: I'm a bit busy and won't have time to work on stuff until approx.
next Monday. Oh and I overdid a bit on the "documentation"...
http://git.spaceboyz.net/nl80211/nl80211-meta.git/master:/nl80211doc.html
(note the quad'ified attempt at associating ;)