1 /* 2 * Linux ethernet bridge 3 * 4 * Authors: 5 * Lennert Buytenhek <buytenh@gnu.org> 6 * 7 * $Id: br_private.h,v 1.7 2001/12/24 00:59:55 davem Exp $ 8 * 9 * This program is free software; you can redistribute it and/or 10 * modify it under the terms of the GNU General Public License 11 * as published by the Free Software Foundation; either version 12 * 2 of the License, or (at your option) any later version. 13 */ 14 15 #ifndef _BR_PRIVATE_H 16 #define _BR_PRIVATE_H 17 18 #include <linux/netdevice.h> 19 #include <linux/miscdevice.h> 20 #include <linux/if_bridge.h> 21 22 #define BR_HASH_BITS 8 23 #define BR_HASH_SIZE (1 << BR_HASH_BITS) 24 25 #define BR_HOLD_TIME (1*HZ) 26 27 #define BR_PORT_BITS 10 28 #define BR_MAX_PORTS (1<<BR_PORT_BITS) 29 30 typedef struct bridge_id bridge_id; 31 typedef struct mac_addr mac_addr; 32 typedef __u16 port_id; 33 34 struct bridge_id 35 { 36 unsigned char prio[2]; 37 unsigned char addr[6]; 38 }; 39 40 struct mac_addr 41 { 42 unsigned char addr[6]; 43 }; 44 45 struct net_bridge_fdb_entry 46 { 47 struct hlist_node hlist; 48 struct net_bridge_port *dst; 49 50 struct rcu_head rcu; 51 atomic_t use_count; 52 unsigned long ageing_timer; 53 mac_addr addr; 54 unsigned char is_local; 55 unsigned char is_static; 56 }; 57 58 struct net_bridge_port 59 { 60 struct net_bridge *br; 61 struct net_device *dev; 62 struct list_head list; 63 64 /* STP */ 65 u8 priority; 66 u8 state; 67 u16 port_no; 68 unsigned char topology_change_ack; 69 unsigned char config_pending; 70 port_id port_id; 71 port_id designated_port; 72 bridge_id designated_root; 73 bridge_id designated_bridge; 74 u32 path_cost; 75 u32 designated_cost; 76 77 struct timer_list forward_delay_timer; 78 struct timer_list hold_timer; 79 struct timer_list message_age_timer; 80 struct kobject kobj; 81 struct rcu_head rcu; 82 }; 83 84 struct net_bridge 85 { 86 spinlock_t lock; 87 struct list_head port_list; 88 struct net_device *dev; 89 struct net_device_stats statistics; 90 spinlock_t hash_lock; 91 struct hlist_head hash[BR_HASH_SIZE]; 92 struct list_head age_list; 93 94 /* STP */ 95 bridge_id designated_root; 96 bridge_id bridge_id; 97 u32 root_path_cost; 98 unsigned long max_age; 99 unsigned long hello_time; 100 unsigned long forward_delay; 101 unsigned long bridge_max_age; 102 unsigned long ageing_time; 103 unsigned long bridge_hello_time; 104 unsigned long bridge_forward_delay; 105 106 u16 root_port; 107 unsigned char stp_enabled; 108 unsigned char topology_change; 109 unsigned char topology_change_detected; 110 111 struct timer_list hello_timer; 112 struct timer_list tcn_timer; 113 struct timer_list topology_change_timer; 114 struct timer_list gc_timer; 115 struct kobject ifobj; 116 }; 117 118 extern struct notifier_block br_device_notifier; 119 extern const unsigned char bridge_ula[6]; 120 121 /* called under bridge lock */ 122 static inline int br_is_root_bridge(const struct net_bridge *br) 123 { 124 return !memcmp(&br->bridge_id, &br->designated_root, 8); 125 } 126 127 128 /* br_device.c */ 129 extern void br_dev_setup(struct net_device *dev); 130 extern int br_dev_xmit(struct sk_buff *skb, struct net_device *dev); 131 132 /* br_fdb.c */ 133 extern void br_fdb_init(void); 134 extern void br_fdb_fini(void); 135 extern void br_fdb_changeaddr(struct net_bridge_port *p, 136 const unsigned char *newaddr); 137 extern void br_fdb_cleanup(unsigned long arg); 138 extern void br_fdb_delete_by_port(struct net_bridge *br, 139 struct net_bridge_port *p); 140 extern struct net_bridge_fdb_entry *__br_fdb_get(struct net_bridge *br, 141 const unsigned char *addr); 142 extern struct net_bridge_fdb_entry *br_fdb_get(struct net_bridge *br, 143 unsigned char *addr); 144 extern void br_fdb_put(struct net_bridge_fdb_entry *ent); 145 extern int br_fdb_fillbuf(struct net_bridge *br, void *buf, 146 unsigned long count, unsigned long off); 147 extern int br_fdb_insert(struct net_bridge *br, 148 struct net_bridge_port *source, 149 const unsigned char *addr); 150 extern void br_fdb_update(struct net_bridge *br, 151 struct net_bridge_port *source, 152 const unsigned char *addr); 153 154 /* br_forward.c */ 155 extern void br_deliver(const struct net_bridge_port *to, 156 struct sk_buff *skb); 157 extern int br_dev_queue_push_xmit(struct sk_buff *skb); 158 extern void br_forward(const struct net_bridge_port *to, 159 struct sk_buff *skb); 160 extern int br_forward_finish(struct sk_buff *skb); 161 extern void br_flood_deliver(struct net_bridge *br, 162 struct sk_buff *skb, 163 int clone); 164 extern void br_flood_forward(struct net_bridge *br, 165 struct sk_buff *skb, 166 int clone); 167 168 /* br_if.c */ 169 extern int br_add_bridge(const char *name); 170 extern int br_del_bridge(const char *name); 171 extern void br_cleanup_bridges(void); 172 extern int br_add_if(struct net_bridge *br, 173 struct net_device *dev); 174 extern int br_del_if(struct net_bridge *br, 175 struct net_device *dev); 176 extern int br_min_mtu(const struct net_bridge *br); 177 extern void br_features_recompute(struct net_bridge *br); 178 179 /* br_input.c */ 180 extern int br_handle_frame_finish(struct sk_buff *skb); 181 extern int br_handle_frame(struct net_bridge_port *p, struct sk_buff **pskb); 182 183 /* br_ioctl.c */ 184 extern int br_dev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); 185 extern int br_ioctl_deviceless_stub(unsigned int cmd, void __user *arg); 186 187 /* br_netfilter.c */ 188 extern int br_netfilter_init(void); 189 extern void br_netfilter_fini(void); 190 191 /* br_stp.c */ 192 extern void br_log_state(const struct net_bridge_port *p); 193 extern struct net_bridge_port *br_get_port(struct net_bridge *br, 194 u16 port_no); 195 extern void br_init_port(struct net_bridge_port *p); 196 extern void br_become_designated_port(struct net_bridge_port *p); 197 198 /* br_stp_if.c */ 199 extern void br_stp_enable_bridge(struct net_bridge *br); 200 extern void br_stp_disable_bridge(struct net_bridge *br); 201 extern void br_stp_enable_port(struct net_bridge_port *p); 202 extern void br_stp_disable_port(struct net_bridge_port *p); 203 extern void br_stp_recalculate_bridge_id(struct net_bridge *br); 204 extern void br_stp_change_bridge_id(struct net_bridge *br, const unsigned char *a); 205 extern void br_stp_set_bridge_priority(struct net_bridge *br, 206 u16 newprio); 207 extern void br_stp_set_port_priority(struct net_bridge_port *p, 208 u8 newprio); 209 extern void br_stp_set_path_cost(struct net_bridge_port *p, 210 u32 path_cost); 211 extern ssize_t br_show_bridge_id(char *buf, const struct bridge_id *id); 212 213 /* br_stp_bpdu.c */ 214 extern int br_stp_handle_bpdu(struct sk_buff *skb); 215 216 /* br_stp_timer.c */ 217 extern void br_stp_timer_init(struct net_bridge *br); 218 extern void br_stp_port_timer_init(struct net_bridge_port *p); 219 extern unsigned long br_timer_value(const struct timer_list *timer); 220 221 /* br.c */ 222 extern struct net_bridge_fdb_entry *(*br_fdb_get_hook)(struct net_bridge *br, 223 unsigned char *addr); 224 extern void (*br_fdb_put_hook)(struct net_bridge_fdb_entry *ent); 225 226 227 #ifdef CONFIG_SYSFS 228 /* br_sysfs_if.c */ 229 extern int br_sysfs_addif(struct net_bridge_port *p); 230 extern void br_sysfs_removeif(struct net_bridge_port *p); 231 extern void br_sysfs_freeif(struct net_bridge_port *p); 232 233 /* br_sysfs_br.c */ 234 extern int br_sysfs_addbr(struct net_device *dev); 235 extern void br_sysfs_delbr(struct net_device *dev); 236 237 #else 238 239 #define br_sysfs_addif(p) (0) 240 #define br_sysfs_removeif(p) do { } while(0) 241 #define br_sysfs_freeif(p) kfree(p) 242 #define br_sysfs_addbr(dev) (0) 243 #define br_sysfs_delbr(dev) do { } while(0) 244 #endif /* CONFIG_SYSFS */ 245 246 #endif 247