|
@@ -346,14 +346,18 @@ static void rlb_update_entry_from_arp(struct bonding *bond, struct arp_pkt *arp)
|
|
|
|
|
|
static int rlb_arp_recv(struct sk_buff *skb, struct net_device *bond_dev, struct packet_type *ptype, struct net_device *orig_dev)
|
|
|
{
|
|
|
- struct bonding *bond = bond_dev->priv;
|
|
|
+ struct bonding *bond;
|
|
|
struct arp_pkt *arp = (struct arp_pkt *)skb->data;
|
|
|
int res = NET_RX_DROP;
|
|
|
|
|
|
if (dev_net(bond_dev) != &init_net)
|
|
|
goto out;
|
|
|
|
|
|
- if (!(bond_dev->flags & IFF_MASTER))
|
|
|
+ while (bond_dev->priv_flags & IFF_802_1Q_VLAN)
|
|
|
+ bond_dev = vlan_dev_real_dev(bond_dev);
|
|
|
+
|
|
|
+ if (!(bond_dev->priv_flags & IFF_BONDING) ||
|
|
|
+ !(bond_dev->flags & IFF_MASTER))
|
|
|
goto out;
|
|
|
|
|
|
if (!arp) {
|
|
@@ -368,6 +372,9 @@ static int rlb_arp_recv(struct sk_buff *skb, struct net_device *bond_dev, struct
|
|
|
|
|
|
if (arp->op_code == htons(ARPOP_REPLY)) {
|
|
|
/* update rx hash table for this ARP */
|
|
|
+ printk("rar: update orig %s bond_dev %s\n", orig_dev->name,
|
|
|
+ bond_dev->name);
|
|
|
+ bond = bond_dev->priv;
|
|
|
rlb_update_entry_from_arp(bond, arp);
|
|
|
dprintk("Server received an ARP Reply from client\n");
|
|
|
}
|
|
@@ -818,7 +825,7 @@ static int rlb_initialize(struct bonding *bond)
|
|
|
|
|
|
/*initialize packet type*/
|
|
|
pk_type->type = __constant_htons(ETH_P_ARP);
|
|
|
- pk_type->dev = bond->dev;
|
|
|
+ pk_type->dev = NULL;
|
|
|
pk_type->func = rlb_arp_recv;
|
|
|
|
|
|
/* register to receive ARPs */
|