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