Exemplo n.º 1
0
static int br_set_tx_csum(struct net_device *dev, u32 data)
{
	struct net_bridge *br = netdev_priv(dev);

	if (data)
		br->feature_mask |= NETIF_F_NO_CSUM;
	else
		br->feature_mask &= ~NETIF_F_ALL_CSUM;

	br_features_recompute(br);
	return 0;
}
Exemplo n.º 2
0
static int br_device_event(struct notifier_block *unused, unsigned long event, void *ptr)
{
    struct net_device *dev = ptr;
    struct net_bridge_port *p = dev->br_port;
    struct net_bridge *br;
    int err;

    /* not a port of a bridge */
    if (p == NULL)
        return NOTIFY_DONE;

    br = p->br;

    switch (event) {
    case NETDEV_CHANGEMTU:
        dev_set_mtu(br->dev, br_min_mtu(br));
        break;

    case NETDEV_CHANGEADDR:
        spin_lock_bh(&br->lock);
        br_fdb_changeaddr(p, dev->dev_addr);
        br_stp_recalculate_bridge_id(br);
        spin_unlock_bh(&br->lock);
        break;

    case NETDEV_CHANGE:
        br_port_carrier_check(p);
        break;

    case NETDEV_FEAT_CHANGE:
        spin_lock_bh(&br->lock);
        if (netif_running(br->dev))
            br_features_recompute(br);
        spin_unlock_bh(&br->lock);
        break;

    case NETDEV_DOWN:
        spin_lock_bh(&br->lock);
        if (br->dev->flags & IFF_UP)
            br_stp_disable_port(p);
        spin_unlock_bh(&br->lock);
        break;

    case NETDEV_UP:
        if (netif_carrier_ok(dev) && (br->dev->flags & IFF_UP)) {
            spin_lock_bh(&br->lock);
            br_stp_enable_port(p);
            spin_unlock_bh(&br->lock);
        }
        break;

    case NETDEV_UNREGISTER:
        br_del_if(br, dev);
        break;

    case NETDEV_CHANGENAME:
        err = br_sysfs_renameif(p);
        if (err)
            return notifier_from_errno(err);
        break;

    case NETDEV_PRE_TYPE_CHANGE:
        /* Forbid underlaying device to change its type. */
        return NOTIFY_BAD;
    }

    /* Events that may cause spanning tree to refresh */
    if (event == NETDEV_CHANGEADDR || event == NETDEV_UP ||
            event == NETDEV_CHANGE || event == NETDEV_DOWN)
        br_ifinfo_notify(RTM_NEWLINK, p);

    return NOTIFY_DONE;
}
Exemplo n.º 3
0
/*
 * Handle changes in state of network devices enslaved to a bridge.
 * 
 * Note: don't care about up/down if bridge itself is down, because
 *     port state is checked when bridge is brought up.
 */
static int br_device_event(struct notifier_block *unused, unsigned long event, void *ptr)
{
	struct net_device *dev = ptr;
	struct net_bridge_port *p = dev->br_port;
	struct net_bridge *br;

	/* not a port of a bridge */
	if (p == NULL)
		return NOTIFY_DONE;

	br = p->br;

	spin_lock_bh(&br->lock);
	switch (event) {
	case NETDEV_CHANGEMTU:
		dev_set_mtu(br->dev, br_min_mtu(br));
		break;

	case NETDEV_CHANGEADDR:
		br_fdb_changeaddr(p, dev->dev_addr);
		br_stp_recalculate_bridge_id(br);
		break;

	case NETDEV_CHANGE:	/* device is up but carrier changed */
		if (!(br->dev->flags & IFF_UP))
			break;

		if (netif_carrier_ok(dev)) {
			if (p->state == BR_STATE_DISABLED)
				br_stp_enable_port(p);
		} else {
			if (p->state != BR_STATE_DISABLED)
				br_stp_disable_port(p);
		}
		break;

	case NETDEV_FEAT_CHANGE:
		if (br->dev->flags & IFF_UP) 
			br_features_recompute(br);

		/* could do recursive feature change notification
		 * but who would care?? 
		 */
		break;

	case NETDEV_DOWN:
		if (br->dev->flags & IFF_UP)
			br_stp_disable_port(p);
		break;

	case NETDEV_UP:
		if (netif_carrier_ok(dev) && (br->dev->flags & IFF_UP)) 
			br_stp_enable_port(p);
		break;

	case NETDEV_UNREGISTER:
		spin_unlock_bh(&br->lock);
		br_del_if(br, dev);
		goto done;
	} 
	spin_unlock_bh(&br->lock);

 done:
	return NOTIFY_DONE;
}