void inet_add_protocol(struct inet_protocol *prot) { unsigned char hash; struct inet_protocol *p2; hash = prot->protocol & (MAX_INET_PROTOS - 1); br_write_lock_bh(BR_NETPROTO_LOCK); prot ->next = inet_protos[hash]; inet_protos[hash] = prot; prot->copy = 0; /* * Set the copy bit if we need to. */ p2 = (struct inet_protocol *) prot->next; while (p2) { if (p2->protocol == prot->protocol) { prot->copy = 1; break; } p2 = (struct inet_protocol *) p2->next; } br_write_unlock_bh(BR_NETPROTO_LOCK); }
static void del_ifs(struct net_bridge *br) { br_write_lock_bh(BR_NETPROTO_LOCK); write_lock(&br->lock); while (br->port_list != NULL) __br_del_if(br, br->port_list->dev); write_unlock(&br->lock); br_write_unlock_bh(BR_NETPROTO_LOCK); }
int inet_del_protocol(struct inet_protocol *prot) { struct inet_protocol *p; struct inet_protocol *lp = NULL; unsigned char hash; hash = prot->protocol & (MAX_INET_PROTOS - 1); br_write_lock_bh(BR_NETPROTO_LOCK); if (prot == inet_protos[hash]) { inet_protos[hash] = (struct inet_protocol *) inet_protos[hash]->next; br_write_unlock_bh(BR_NETPROTO_LOCK); return 0; } p = (struct inet_protocol *) inet_protos[hash]; if (p != NULL && p->protocol == prot->protocol) lp = p; while (p) { /* * We have to worry if the protocol being deleted is * the last one on the list, then we may need to reset * someone's copied bit. */ if (p->next && p->next == prot) { /* * if we are the last one with this protocol and * there is a previous one, reset its copy bit. */ if (prot->copy == 0 && lp != NULL) lp->copy = 0; p->next = prot->next; br_write_unlock_bh(BR_NETPROTO_LOCK); return 0; } if (p->next != NULL && p->next->protocol == prot->protocol) lp = p->next; p = (struct inet_protocol *) p->next; } br_write_unlock_bh(BR_NETPROTO_LOCK); return -1; }
/* Noone stores the protocol anywhere; simply delete it. */ void ip_nat_protocol_unregister(struct ip_nat_protocol *proto) { WRITE_LOCK(&ip_nat_lock); LIST_DELETE(&protos, proto); WRITE_UNLOCK(&ip_nat_lock); /* Someone could be still looking at the proto in a bh. */ br_write_lock_bh(BR_NETPROTO_LOCK); br_write_unlock_bh(BR_NETPROTO_LOCK); MOD_DEC_USE_COUNT; }
int br_del_if(struct net_bridge *br, struct net_device *dev) { int retval; br_write_lock_bh(BR_NETPROTO_LOCK); write_lock(&br->lock); retval = __br_del_if(br, dev); br_stp_recalculate_bridge_id(br); write_unlock(&br->lock); br_write_unlock_bh(BR_NETPROTO_LOCK); return retval; }
static void __exit br_deinit(void) { unregister_netdevice_notifier(&br_device_notifier); br_call_ioctl_atomic(__br_clear_ioctl_hook); br_write_lock_bh(BR_NETPROTO_LOCK); br_handle_frame_hook = NULL; br_write_unlock_bh(BR_NETPROTO_LOCK); #if defined(CONFIG_ATM_LANE) || defined(CONFIG_ATM_LANE_MODULE) br_fdb_get_hook = NULL; br_fdb_put_hook = NULL; #endif }
static void __exit br_deinit(void) { #if defined(CONFIG_BRIDGE_NF_EBTABLES) || defined(CONFIG_BRIDGE_NF_EBTABLES_MODULE) br_netfilter_fini(); #endif unregister_netdevice_notifier(&br_device_notifier); rtnl_lock(); br_ioctl_hook = NULL; rtnl_unlock(); br_write_lock_bh(BR_NETPROTO_LOCK); br_handle_frame_hook = NULL; br_write_unlock_bh(BR_NETPROTO_LOCK); #if defined(CONFIG_ATM_LANE) || defined(CONFIG_ATM_LANE_MODULE) br_fdb_get_hook = NULL; br_fdb_put_hook = NULL; #endif }