/* called under bridge lock */ static struct net_bridge_port *new_nbp(struct net_bridge *br, struct net_device *dev) { int i; struct net_bridge_port *p; p = kmalloc(sizeof(*p), GFP_KERNEL); if (p == NULL) return p; memset(p, 0, sizeof(*p)); p->br = br; p->dev = dev; p->path_cost = br_initial_port_cost(dev); p->priority = 0x80; dev->br_port = p; for (i=1;i<255;i++) if (br_get_port(br, i) == NULL) break; if (i == 255) { kfree(p); return NULL; } p->port_no = i; br_init_port(p); p->state = BR_STATE_DISABLED; p->next = br->port_list; br->port_list = p; return p; }
void br_init(void) { /* (4.8.1) */ int port_no; debug_print("NET4: Ethernet Bridge 007 for NET4.0\r\n"); /* Set up brg device information */ bridge_info.instance = 0; /* * Form initial topology change time. * The topology change timer is only used if this is the root bridge. */ bridge_info.topology_change_time = BRIDGE_MAX_AGE + BRIDGE_FORWARD_DELAY; /* (4.5.3.13) */ bridge_info.designated_root = bridge_info.bridge_id; /* (4.8.1.1) */ bridge_info.root_path_cost = Zero; bridge_info.root_port = No_port; bridge_info.bridge_max_age = BRIDGE_MAX_AGE; bridge_info.bridge_hello_time = BRIDGE_HELLO_TIME; bridge_info.bridge_forward_delay = BRIDGE_FORWARD_DELAY; bridge_info.hold_time = HOLD_TIME; bridge_info.max_age = bridge_info.bridge_max_age; /* (4.8.1.2) */ bridge_info.hello_time = bridge_info.bridge_hello_time; bridge_info.forward_delay = bridge_info.bridge_forward_delay; bridge_info.top_change_detected = 0; bridge_info.top_change = 0; max_port_used = One; for (port_no = One; port_no <= No_of_ports; port_no++) { /* (4.8.1.4) */ /* initial state = Disable */ br_init_port(port_no); } br_stats.flags = 0; /*BR_UP | BR_DEBUG*/; /* enable bridge */ br_stats.policy = BR_ACCEPT; /* Enable bridge to accpet all protocols */ br_stats.exempt_protocols = 0; /* Vova Oksman: register the function for the PROCfs "bridge" file */ }
/* called under bridge lock */ void br_stp_enable_port(struct net_bridge_port *p) { br_init_port(p); br_port_state_selection(p->br); }