我的interface在收送上本來沒有問題,但是當它和其他interface作bridge之後就發生crash了,後來才發現是head不夠大,於是參考這篇文章"关于bridge中hard_header_len值的问题",做了些修改,原因是因為我的device在預留head room時,是hard_header_len+needed_headroom。而且有些local generate的packet會使用LL_RESERVED_SPACE()這macro來保留head room,而LL_RESERVED_SPACE()也會使用到needed_headroom,所以最保險的作法就是同時設定bridge的hard_header_len和needed_headroom。
--- a/net/bridge/br_if.c +++ b/net/bridge/br_if.c @@ -369,6 +369,10 @@ void br_features_recompute(struct net_bridge *br) { struct net_bridge_port *p; unsigned long features, mask; +#if 1 // Brook. + unsigned short max_hard_header_len = ETH_HLEN; + unsigned short max_needed_headroom = 0; +#endif features = mask = br->feature_mask; if (list_empty(&br->port_list)) @@ -379,8 +383,22 @@ void br_features_recompute(struct net_bridge *br) list_for_each_entry(p, &br->port_list, list) { features = netdev_increment_features(features, p->dev->features, mask); +#if 1 // Brook. + if (p->dev->hard_header_len > max_hard_header_len) { + max_hard_header_len = p->dev->hard_header_len; + } + + if (p->dev->needed_headroom > max_needed_headroom) { + max_needed_headroom = p->dev->needed_headroom; + } +#endif } +#if 1 // Brook. + br->dev->hard_header_len = max_hard_header_len; + br->dev->needed_headroom = max_needed_headroom; +#endif + done: br->dev->features = netdev_fix_features(features, NULL); }