[PATCH] bonding: Validate probe replies in ARP monitor
Add logic to check ARP request / reply packets used for ARP monitor link integrity checking. The current method simply examines the slave device to see if it has sent and received traffic; this can be fooled by extraneous traffic. For example, if multiple hosts running bonding are behind a common switch, the probe traffic from the multiple instances of bonding will update the tx/rx times on each other's slave devices. Signed-off-by: Jay Vosburgh <fubar@us.ibm.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
This commit is contained in:

committed by
Jeff Garzik

parent
70298705bb
commit
f5b2b966f0
@@ -22,8 +22,8 @@
|
||||
#include "bond_3ad.h"
|
||||
#include "bond_alb.h"
|
||||
|
||||
#define DRV_VERSION "3.0.3"
|
||||
#define DRV_RELDATE "March 23, 2006"
|
||||
#define DRV_VERSION "3.1.0-test"
|
||||
#define DRV_RELDATE "September 9, 2006"
|
||||
#define DRV_NAME "bonding"
|
||||
#define DRV_DESCRIPTION "Ethernet Channel Bonding Driver"
|
||||
|
||||
@@ -126,6 +126,7 @@ struct bond_params {
|
||||
int xmit_policy;
|
||||
int miimon;
|
||||
int arp_interval;
|
||||
int arp_validate;
|
||||
int use_carrier;
|
||||
int updelay;
|
||||
int downdelay;
|
||||
@@ -151,6 +152,7 @@ struct slave {
|
||||
struct slave *prev;
|
||||
int delay;
|
||||
u32 jiffies;
|
||||
u32 last_arp_rx;
|
||||
s8 link; /* one of BOND_LINK_XXXX */
|
||||
s8 state; /* one of BOND_STATE_XXXX */
|
||||
u32 original_flags;
|
||||
@@ -198,6 +200,7 @@ struct bonding {
|
||||
struct bond_params params;
|
||||
struct list_head vlan_list;
|
||||
struct vlan_group *vlgrp;
|
||||
struct packet_type arp_mon_pt;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -228,6 +231,25 @@ static inline struct bonding *bond_get_bond_by_slave(struct slave *slave)
|
||||
return (struct bonding *)slave->dev->master->priv;
|
||||
}
|
||||
|
||||
#define BOND_ARP_VALIDATE_NONE 0
|
||||
#define BOND_ARP_VALIDATE_ACTIVE (1 << BOND_STATE_ACTIVE)
|
||||
#define BOND_ARP_VALIDATE_BACKUP (1 << BOND_STATE_BACKUP)
|
||||
#define BOND_ARP_VALIDATE_ALL (BOND_ARP_VALIDATE_ACTIVE | \
|
||||
BOND_ARP_VALIDATE_BACKUP)
|
||||
|
||||
extern inline int slave_do_arp_validate(struct bonding *bond, struct slave *slave)
|
||||
{
|
||||
return bond->params.arp_validate & (1 << slave->state);
|
||||
}
|
||||
|
||||
extern inline u32 slave_last_rx(struct bonding *bond, struct slave *slave)
|
||||
{
|
||||
if (slave_do_arp_validate(bond, slave))
|
||||
return slave->last_arp_rx;
|
||||
|
||||
return slave->dev->last_rx;
|
||||
}
|
||||
|
||||
static inline void bond_set_slave_inactive_flags(struct slave *slave)
|
||||
{
|
||||
struct bonding *bond = slave->dev->master->priv;
|
||||
@@ -235,12 +257,14 @@ static inline void bond_set_slave_inactive_flags(struct slave *slave)
|
||||
bond->params.mode != BOND_MODE_ALB)
|
||||
slave->state = BOND_STATE_BACKUP;
|
||||
slave->dev->priv_flags |= IFF_SLAVE_INACTIVE;
|
||||
if (slave_do_arp_validate(bond, slave))
|
||||
slave->dev->priv_flags |= IFF_SLAVE_NEEDARP;
|
||||
}
|
||||
|
||||
static inline void bond_set_slave_active_flags(struct slave *slave)
|
||||
{
|
||||
slave->state = BOND_STATE_ACTIVE;
|
||||
slave->dev->priv_flags &= ~IFF_SLAVE_INACTIVE;
|
||||
slave->dev->priv_flags &= ~(IFF_SLAVE_INACTIVE | IFF_SLAVE_NEEDARP);
|
||||
}
|
||||
|
||||
static inline void bond_set_master_3ad_flags(struct bonding *bond)
|
||||
@@ -284,6 +308,8 @@ int bond_parse_parm(char *mode_arg, struct bond_parm_tbl *tbl);
|
||||
const char *bond_mode_name(int mode);
|
||||
void bond_select_active_slave(struct bonding *bond);
|
||||
void bond_change_active_slave(struct bonding *bond, struct slave *new_active);
|
||||
void bond_register_arp(struct bonding *);
|
||||
void bond_unregister_arp(struct bonding *);
|
||||
|
||||
#endif /* _LINUX_BONDING_H */
|
||||
|
||||
|
Reference in New Issue
Block a user