Robert N. M. Watson wrote:
On Mar 12, 2010, at 8:30 AM, Qing Li wrote:

I believe what Julian means is the following:

1. in the driver, I do this

    ifp->if_flags |= IFF_KNOWS_LINK_STATE;

2. In route.h, I do this

   if (ifp->flags & IFF_KNOWS_LINK_STATE) && (ifp->if_link_state ==
LINK_STATE_UP)
      return 1;

Please do *NOT* do this:

(1) Do not overload if_flags with more run-time set flags without well-defined 
atomicity properties
(2) Why isn't LINK_STATE_UNKNOWN already sufficient here?

The only change I think would be useful is adding a new IFCAP flag that allows 
a driver to statically declare that it will someday set the link state. But I 
don't think that helps with ECMP, that's just for the benefit of programs like 
dhclient that care about future events rather than current state.

Robert

I think that any driver that can set link stats will set it to 1 or 2 and that we can treat a state of 0 as "I don't know what the heck you are talking about".

My comment on a flag for this purpose was in the abstract. I didn't
necessarily mean that a particular bit in a particular register be used for this purpose.. The aim is to be able to discern a driver that
will not give a useful result and should therefore be assumed to be
online at all times. It looks to me that this can be achieved
several ways, including looking for the UNKNOWN link state, or adding a bit in the word to indicate it is valid, to adding a bit somewhere else.



-- Qing


On Fri, Mar 12, 2010 at 12:26 AM, Robert N. M. Watson
<rwat...@freebsd.org> wrote:
On Mar 12, 2010, at 8:11 AM, Qing Li wrote:

I like Julian's suggestion because it is simple and very low risk.
And there isn't a need to check for interface type any more.
Here is why:

1. The interfaces that are popular and modern are already supporting
   link_state. So for these drivers, and there are just a few, I will go set
   its if_flags to include "can change link_state".

2. For the existing dated drivers, because that flag bit is never set,
   no check is done.

3. In the mean time, we try to convert the drivers progressively.

4. If one wants to do ECMP and not having packets go into a black
   hole when the physical link is down, that person can ping the ML
   and ask for driver compatibility list. If we haven't converted that
   particular driver by then, we will update the driver if it's capable
   at that time.

Today, we support three link state values:

170 /*
171  * Values for if_link_state.
172  */
173 #define LINK_STATE_UNKNOWN      0       /* link invalid/unknown */
174 #define LINK_STATE_DOWN         1       /* link is down */
175 #define LINK_STATE_UP           2       /* link is up */

I'm confused about Julian's proposal because it seems to me that we already 
know when a driver hasn't set or is unable to determine the link state: it will 
(should) be set to LINK_STATE_UNKNOWN by default.

So the only question we don't know the answer to, at run-time, is whether a 
driver may *ever* set the link state (i.e., it thinks it knows how to), and 
hence whether or not tools like dhclient should try to wait for that to happen. 
That is the problem that an interface capability would solve.

For the purposes of ECMP, you just need to decide on your policy: map UNKNOWN 
to either UP or DOWN for your purposes.

Robert

_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to