[openib-general] [PATCH] IB/ipoib get net_device from ipoib_neigh instead of linux neighbour
Moni Shoua
monis at voltaire.com
Tue Feb 6 08:24:10 PST 2007
Michael S. Tsirkin wrote:
>>------------------------------------------------------------------------------
>>IPoIB uses a two layer neighboring scheme, such that for each struct neighbour
>>whose device is an ipoib one, there is a struct ipoib_neigh buddy which is
>>created on demand at the tx flow by an ipoib_neigh_alloc(skb->dst->neighbour)
>>call.
>>
>>When using the bonding driver, neighbours are created by the net stack on behalf
>>of the bonding (master) device. On the tx flow the bonding code gets an skb such
>>that skb->dev points to the master device, it changes this skb to point on the
>>slave device and calls the slave hard_start_xmit function.
>>
>>Combing these two flows, there is a hole if some code at ipoib
>>(ipoib_neigh_destructor) assumes that for each struct neighbour it gets, n->dev
>>is an ipoib device so for example netdev_priv(n->dev) would be of type struct
>>ipoib_dev_priv.
>
>
> Could you plese elaborate how ipoib_neigh_destructor comes to be called at all?
> At what point does ipoib_neigh_setup_dev get called?
>
>
The bond device uses its slave's neigh_setup function.
Please look at line 19 below from the bonding code.
static void bond_setup_by_slave(struct net_device *bond_dev,
11 + struct net_device *slave_dev)
12 +{
13 + bond_dev->hard_header = slave_dev->hard_header;
14 + bond_dev->rebuild_header = slave_dev->rebuild_header;
15 + bond_dev->hard_header_cache = slave_dev->hard_header_cache;
16 + bond_dev->header_cache_update = slave_dev->header_cache_update;
17 + bond_dev->hard_header_parse = slave_dev->hard_header_parse;
18 +
19 + bond_dev->neigh_setup = slave_dev->neigh_setup;
20 +
21 + bond_dev->type = slave_dev->type;
22 + bond_dev->hard_header_len = slave_dev->hard_header_len;
23 + bond_dev->addr_len = slave_dev->addr_len;
24 +
25 + memcpy(bond_dev->broadcast, slave_dev->broadcast,
26 + slave_dev->addr_len);
27 +}
>>To fix it, this patch adds a dev field to struct ipoib_neigh which is used
>>instead of the struct neighbour dev one.
>
>
> What I am concerned with is - if the master is not an IPoIB device,
> what guarantee do we have that to_ipoib_neigh will return 0
> and not part of an actual hardware address?
>
> Without bonding, the reason is that dev points to an ipoib device,
> so we know hw address is 20 bytes.
>
I guess you meant "if the slave is not an IPoIB device"...
The bond device doesn't allow devices of different types to be grouped
together as its slaves. Furthermore, bond_setup_by_slave is called only for non
Ethernet devices (we consider to change the logic to "called only for
IPoIB devices just for safety).
More information about the general
mailing list