vBulletin Search Engine Optimization
| |||||||
| Register | FAQ | Members List | Calendar | Search | Today's Posts | Mark Forums Read |
| ||||
| It has been discovered that some network drivers are not correctly sending the routing messages (RTM_IFINFO) expected when link status changes. These messages are used by dhclient to react properly to such link status changes, even more so in upcoming diffs. The diff below, which you are free to test, 'fixes' bge(4). It would be helpful to discover which drivers are currently misbehaving, if any other than bge do. Testing your network card/driver is easy and fun! As root or via sudo run route -n monitor and unplug and plug in your cable. You should see something like: $ sudo route -n monitor Password: got message of size 144 on Fri May 9 09:06:03 2008 RTM_IFINFO: iface status change: len 144, if# 2, link: no carrier, flags:<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> got message of size 144 on Fri May 9 09:06:05 2008 RTM_IFINFO: iface status change: len 144, if# 2, link: active, flags:<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> Some I(many?) cards and drivers can't detect link changes and can't be fixed easily but if we find drivers that are simply missing something easy we can make dhclient work better by fixing them. No need to report success, just cards that don't produce the messages. Thanks. ..... Ken Index: if_bge.c ================================================== ================= RCS file: /cvs/src/sys/dev/pci/if_bge.c,v retrieving revision 1.226 diff -u -p -r1.226 if_bge.c --- if_bge.c 20 Apr 2008 01:37:35 -0000 1.226 +++ if_bge.c 8 May 2008 16:35:31 -0000 @@ -3582,14 +3582,14 @@ bge_link_upd(struct bge_softc *sc) timeout_del(&sc->bge_timeout); bge_tick(sc); - if (!BGE_STS_BIT(sc, BGE_STS_LINK) && + if (BGE_STS_BIT(sc, BGE_STS_LINK)) + BGE_STS_CLRBIT(sc, BGE_STS_LINK); + + else if (!BGE_STS_BIT(sc, BGE_STS_LINK) && mii->mii_media_status & IFM_ACTIVE && - IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) + (IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) && + (IFM_SUBTYPE(mii->mii_media_active) != (IFM_ETHER|IFM_NONE))) BGE_STS_SETBIT(sc, BGE_STS_LINK); - else if (BGE_STS_BIT(sc, BGE_STS_LINK) && - (!(mii->mii_media_status & IFM_ACTIVE) || - IFM_SUBTYPE(mii->mii_media_active) == IFM_NONE)) - BGE_STS_CLRBIT(sc, BGE_STS_LINK); } } |