The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/net/bridgestp.h

Version: -  FREEBSD  -  FREEBSD11  -  FREEBSD10  -  FREEBSD9  -  FREEBSD92  -  FREEBSD91  -  FREEBSD90  -  FREEBSD8  -  FREEBSD82  -  FREEBSD81  -  FREEBSD80  -  FREEBSD7  -  FREEBSD74  -  FREEBSD73  -  FREEBSD72  -  FREEBSD71  -  FREEBSD70  -  FREEBSD6  -  FREEBSD64  -  FREEBSD63  -  FREEBSD62  -  FREEBSD61  -  FREEBSD60  -  FREEBSD5  -  FREEBSD55  -  FREEBSD54  -  FREEBSD53  -  FREEBSD52  -  FREEBSD51  -  FREEBSD50  -  FREEBSD4  -  FREEBSD3  -  FREEBSD22  -  linux-2.6  -  linux-2.4.22  -  MK83  -  MK84  -  PLAN9  -  DFBSD  -  NETBSD  -  NETBSD5  -  NETBSD4  -  NETBSD3  -  NETBSD20  -  OPENBSD  -  xnu-517  -  xnu-792  -  xnu-792.6.70  -  xnu-1228  -  xnu-1456.1.26  -  xnu-1699.24.8  -  xnu-2050.18.24  -  OPENSOLARIS  -  minix-3-1-1 
SearchContext: -  none  -  3  -  10 

    1 /*      $NetBSD: if_bridgevar.h,v 1.4 2003/07/08 07:13:50 itojun Exp $  */
    2 
    3 /*
    4  * Copyright 2001 Wasabi Systems, Inc.
    5  * All rights reserved.
    6  *
    7  * Written by Jason R. Thorpe for Wasabi Systems, Inc.
    8  *
    9  * Redistribution and use in source and binary forms, with or without
   10  * modification, are permitted provided that the following conditions
   11  * are met:
   12  * 1. Redistributions of source code must retain the above copyright
   13  *    notice, this list of conditions and the following disclaimer.
   14  * 2. Redistributions in binary form must reproduce the above copyright
   15  *    notice, this list of conditions and the following disclaimer in the
   16  *    documentation and/or other materials provided with the distribution.
   17  * 3. All advertising materials mentioning features or use of this software
   18  *    must display the following acknowledgement:
   19  *      This product includes software developed for the NetBSD Project by
   20  *      Wasabi Systems, Inc.
   21  * 4. The name of Wasabi Systems, Inc. may not be used to endorse
   22  *    or promote products derived from this software without specific prior
   23  *    written permission.
   24  *
   25  * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
   26  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
   27  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   28  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL WASABI SYSTEMS, INC
   29  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   30  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   31  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   32  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   33  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   34  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   35  * POSSIBILITY OF SUCH DAMAGE.
   36  */
   37 
   38 /*
   39  * Copyright (c) 1999, 2000 Jason L. Wright (jason@thought.net)
   40  * All rights reserved.
   41  *
   42  * Redistribution and use in source and binary forms, with or without
   43  * modification, are permitted provided that the following conditions
   44  * are met:
   45  * 1. Redistributions of source code must retain the above copyright
   46  *    notice, this list of conditions and the following disclaimer.
   47  * 2. Redistributions in binary form must reproduce the above copyright
   48  *    notice, this list of conditions and the following disclaimer in the
   49  *    documentation and/or other materials provided with the distribution.
   50  * 3. All advertising materials mentioning features or use of this software
   51  *    must display the following acknowledgement:
   52  *      This product includes software developed by Jason L. Wright
   53  * 4. The name of the author may not be used to endorse or promote products
   54  *    derived from this software without specific prior written permission.
   55  *
   56  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
   57  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
   58  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   59  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
   60  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
   61  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
   62  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   63  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
   64  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
   65  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   66  * POSSIBILITY OF SUCH DAMAGE.
   67  *
   68  * OpenBSD: if_bridge.h,v 1.14 2001/03/22 03:48:29 jason Exp
   69  *
   70  * $FreeBSD: releng/8.1/sys/net/bridgestp.h 174493 2007-12-09 20:47:12Z thompsa $
   71  */
   72 
   73 /*
   74  * Data structure and control definitions for STP interfaces.
   75  */
   76 
   77 #include <sys/callout.h>
   78 #include <sys/queue.h>
   79 
   80 /* STP port states */
   81 #define BSTP_IFSTATE_DISABLED   0
   82 #define BSTP_IFSTATE_LISTENING  1
   83 #define BSTP_IFSTATE_LEARNING   2
   84 #define BSTP_IFSTATE_FORWARDING 3
   85 #define BSTP_IFSTATE_BLOCKING   4
   86 #define BSTP_IFSTATE_DISCARDING 5
   87 
   88 #define BSTP_TCSTATE_ACTIVE     1
   89 #define BSTP_TCSTATE_DETECTED   2
   90 #define BSTP_TCSTATE_INACTIVE   3
   91 #define BSTP_TCSTATE_LEARNING   4
   92 #define BSTP_TCSTATE_PROPAG     5
   93 #define BSTP_TCSTATE_ACK        6
   94 #define BSTP_TCSTATE_TC         7
   95 #define BSTP_TCSTATE_TCN        8
   96 
   97 #define BSTP_ROLE_DISABLED      0
   98 #define BSTP_ROLE_ROOT          1
   99 #define BSTP_ROLE_DESIGNATED    2
  100 #define BSTP_ROLE_ALTERNATE     3
  101 #define BSTP_ROLE_BACKUP        4
  102 
  103 #ifdef _KERNEL
  104 
  105 /* STP port flags */
  106 #define BSTP_PORT_CANMIGRATE    0x0001
  107 #define BSTP_PORT_NEWINFO       0x0002
  108 #define BSTP_PORT_DISPUTED      0x0004
  109 #define BSTP_PORT_ADMCOST       0x0008
  110 #define BSTP_PORT_AUTOEDGE      0x0010
  111 #define BSTP_PORT_AUTOPTP       0x0020
  112 #define BSTP_PORT_ADMEDGE       0x0040
  113 #define BSTP_PORT_PNDCOST       0x0080
  114 
  115 /* BPDU priority */
  116 #define BSTP_PDU_SUPERIOR       1
  117 #define BSTP_PDU_REPEATED       2
  118 #define BSTP_PDU_INFERIOR       3
  119 #define BSTP_PDU_INFERIORALT    4
  120 #define BSTP_PDU_OTHER          5
  121 
  122 /* BPDU flags */
  123 #define BSTP_PDU_PRMASK         0x0c            /* Port Role */
  124 #define BSTP_PDU_PRSHIFT        2               /* Port Role offset */
  125 #define BSTP_PDU_F_UNKN         0x00            /* Unknown port    (00) */
  126 #define BSTP_PDU_F_ALT          0x01            /* Alt/Backup port (01) */
  127 #define BSTP_PDU_F_ROOT         0x02            /* Root port       (10) */
  128 #define BSTP_PDU_F_DESG         0x03            /* Designated port (11) */
  129 
  130 #define BSTP_PDU_STPMASK        0x81            /* strip unused STP flags */
  131 #define BSTP_PDU_RSTPMASK       0x7f            /* strip unused RSTP flags */
  132 #define BSTP_PDU_F_TC           0x01            /* Topology change */
  133 #define BSTP_PDU_F_P            0x02            /* Proposal flag */
  134 #define BSTP_PDU_F_L            0x10            /* Learning flag */
  135 #define BSTP_PDU_F_F            0x20            /* Forwarding flag */
  136 #define BSTP_PDU_F_A            0x40            /* Agreement flag */
  137 #define BSTP_PDU_F_TCA          0x80            /* Topology change ack */
  138 
  139 /*
  140  * Spanning tree defaults.
  141  */
  142 #define BSTP_DEFAULT_MAX_AGE            (20 * 256)
  143 #define BSTP_DEFAULT_HELLO_TIME         (2 * 256)
  144 #define BSTP_DEFAULT_FORWARD_DELAY      (15 * 256)
  145 #define BSTP_DEFAULT_HOLD_TIME          (1 * 256)
  146 #define BSTP_DEFAULT_MIGRATE_DELAY      (3 * 256)
  147 #define BSTP_DEFAULT_HOLD_COUNT         6
  148 #define BSTP_DEFAULT_BRIDGE_PRIORITY    0x8000
  149 #define BSTP_DEFAULT_PORT_PRIORITY      0x80
  150 #define BSTP_DEFAULT_PATH_COST          55
  151 #define BSTP_MIN_HELLO_TIME             (1 * 256)
  152 #define BSTP_MIN_MAX_AGE                (6 * 256)
  153 #define BSTP_MIN_FORWARD_DELAY          (4 * 256)
  154 #define BSTP_MIN_HOLD_COUNT             1
  155 #define BSTP_MAX_HELLO_TIME             (2 * 256)
  156 #define BSTP_MAX_MAX_AGE                (40 * 256)
  157 #define BSTP_MAX_FORWARD_DELAY          (30 * 256)
  158 #define BSTP_MAX_HOLD_COUNT             10
  159 #define BSTP_MAX_PRIORITY               61440
  160 #define BSTP_MAX_PORT_PRIORITY          240
  161 #define BSTP_MAX_PATH_COST              200000000
  162 
  163 /* BPDU message types */
  164 #define BSTP_MSGTYPE_CFG        0x00            /* Configuration */
  165 #define BSTP_MSGTYPE_RSTP       0x02            /* Rapid STP */
  166 #define BSTP_MSGTYPE_TCN        0x80            /* Topology chg notification */
  167 
  168 /* Protocol versions */
  169 #define BSTP_PROTO_ID           0x00
  170 #define BSTP_PROTO_STP          0x00
  171 #define BSTP_PROTO_RSTP         0x02
  172 #define BSTP_PROTO_MAX          BSTP_PROTO_RSTP
  173 
  174 #define BSTP_INFO_RECEIVED      1
  175 #define BSTP_INFO_MINE          2
  176 #define BSTP_INFO_AGED          3
  177 #define BSTP_INFO_DISABLED      4
  178 
  179 
  180 #define BSTP_MESSAGE_AGE_INCR   (1 * 256)       /* in 256ths of a second */
  181 #define BSTP_TICK_VAL           (1 * 256)       /* in 256ths of a second */
  182 #define BSTP_LINK_TIMER         (BSTP_TICK_VAL * 15)
  183 
  184 /*
  185  * Driver callbacks for STP state changes
  186  */
  187 typedef void (*bstp_state_cb_t)(struct ifnet *, int);
  188 typedef void (*bstp_rtage_cb_t)(struct ifnet *, int);
  189 struct bstp_cb_ops {
  190         bstp_state_cb_t bcb_state;
  191         bstp_rtage_cb_t bcb_rtage;
  192 };
  193 
  194 /*
  195  * Because BPDU's do not make nicely aligned structures, two different
  196  * declarations are used: bstp_?bpdu (wire representation, packed) and
  197  * bstp_*_unit (internal, nicely aligned version).
  198  */
  199 
  200 /* configuration bridge protocol data unit */
  201 struct bstp_cbpdu {
  202         uint8_t         cbu_dsap;               /* LLC: destination sap */
  203         uint8_t         cbu_ssap;               /* LLC: source sap */
  204         uint8_t         cbu_ctl;                /* LLC: control */
  205         uint16_t        cbu_protoid;            /* protocol id */
  206         uint8_t         cbu_protover;           /* protocol version */
  207         uint8_t         cbu_bpdutype;           /* message type */
  208         uint8_t         cbu_flags;              /* flags (below) */
  209 
  210         /* root id */
  211         uint16_t        cbu_rootpri;            /* root priority */
  212         uint8_t         cbu_rootaddr[6];        /* root address */
  213 
  214         uint32_t        cbu_rootpathcost;       /* root path cost */
  215 
  216         /* bridge id */
  217         uint16_t        cbu_bridgepri;          /* bridge priority */
  218         uint8_t         cbu_bridgeaddr[6];      /* bridge address */
  219 
  220         uint16_t        cbu_portid;             /* port id */
  221         uint16_t        cbu_messageage;         /* current message age */
  222         uint16_t        cbu_maxage;             /* maximum age */
  223         uint16_t        cbu_hellotime;          /* hello time */
  224         uint16_t        cbu_forwarddelay;       /* forwarding delay */
  225         uint8_t         cbu_versionlen;         /* version 1 length */
  226 } __packed;
  227 #define BSTP_BPDU_STP_LEN       (3 + 35)        /* LLC + STP pdu */
  228 #define BSTP_BPDU_RSTP_LEN      (3 + 36)        /* LLC + RSTP pdu */
  229 
  230 /* topology change notification bridge protocol data unit */
  231 struct bstp_tbpdu {
  232         uint8_t         tbu_dsap;               /* LLC: destination sap */
  233         uint8_t         tbu_ssap;               /* LLC: source sap */
  234         uint8_t         tbu_ctl;                /* LLC: control */
  235         uint16_t        tbu_protoid;            /* protocol id */
  236         uint8_t         tbu_protover;           /* protocol version */
  237         uint8_t         tbu_bpdutype;           /* message type */
  238 } __packed;
  239 
  240 /*
  241  * Timekeeping structure used in spanning tree code.
  242  */
  243 struct bstp_timer {
  244         int             active;
  245         int             latched;
  246         int             value;
  247 };
  248 
  249 struct bstp_pri_vector {
  250         uint64_t                pv_root_id;
  251         uint32_t                pv_cost;
  252         uint64_t                pv_dbridge_id;
  253         uint16_t                pv_dport_id;
  254         uint16_t                pv_port_id;
  255 };
  256 
  257 struct bstp_config_unit {
  258         struct bstp_pri_vector  cu_pv;
  259         uint16_t        cu_message_age;
  260         uint16_t        cu_max_age;
  261         uint16_t        cu_forward_delay;
  262         uint16_t        cu_hello_time;
  263         uint8_t         cu_message_type;
  264         uint8_t         cu_topology_change_ack;
  265         uint8_t         cu_topology_change;
  266         uint8_t         cu_proposal;
  267         uint8_t         cu_agree;
  268         uint8_t         cu_learning;
  269         uint8_t         cu_forwarding;
  270         uint8_t         cu_role;
  271 };
  272 
  273 struct bstp_tcn_unit {
  274         uint8_t         tu_message_type;
  275 };
  276 
  277 struct bstp_port {
  278         LIST_ENTRY(bstp_port)   bp_next;
  279         struct ifnet            *bp_ifp;        /* parent if */
  280         struct bstp_state       *bp_bs;
  281         uint8_t                 bp_active;
  282         uint8_t                 bp_protover;
  283         uint32_t                bp_flags;
  284         uint32_t                bp_path_cost;
  285         uint16_t                bp_port_msg_age;
  286         uint16_t                bp_port_max_age;
  287         uint16_t                bp_port_fdelay;
  288         uint16_t                bp_port_htime;
  289         uint16_t                bp_desg_msg_age;
  290         uint16_t                bp_desg_max_age;
  291         uint16_t                bp_desg_fdelay;
  292         uint16_t                bp_desg_htime;
  293         struct bstp_timer       bp_edge_delay_timer;
  294         struct bstp_timer       bp_forward_delay_timer;
  295         struct bstp_timer       bp_hello_timer;
  296         struct bstp_timer       bp_message_age_timer;
  297         struct bstp_timer       bp_migrate_delay_timer;
  298         struct bstp_timer       bp_recent_backup_timer;
  299         struct bstp_timer       bp_recent_root_timer;
  300         struct bstp_timer       bp_tc_timer;
  301         struct bstp_config_unit bp_msg_cu;
  302         struct bstp_pri_vector  bp_desg_pv;
  303         struct bstp_pri_vector  bp_port_pv;
  304         uint16_t                bp_port_id;
  305         uint8_t                 bp_state;
  306         uint8_t                 bp_tcstate;
  307         uint8_t                 bp_role;
  308         uint8_t                 bp_infois;
  309         uint8_t                 bp_tc_ack;
  310         uint8_t                 bp_tc_prop;
  311         uint8_t                 bp_fdbflush;
  312         uint8_t                 bp_priority;
  313         uint8_t                 bp_ptp_link;
  314         uint8_t                 bp_agree;
  315         uint8_t                 bp_agreed;
  316         uint8_t                 bp_sync;
  317         uint8_t                 bp_synced;
  318         uint8_t                 bp_proposing;
  319         uint8_t                 bp_proposed;
  320         uint8_t                 bp_operedge;
  321         uint8_t                 bp_reroot;
  322         uint8_t                 bp_rcvdtc;
  323         uint8_t                 bp_rcvdtca;
  324         uint8_t                 bp_rcvdtcn;
  325         uint32_t                bp_forward_transitions;
  326         uint8_t                 bp_txcount;
  327         struct task             bp_statetask;
  328         struct task             bp_rtagetask;
  329 };
  330 
  331 /*
  332  * Software state for each bridge STP.
  333  */
  334 struct bstp_state {
  335         LIST_ENTRY(bstp_state)  bs_list;
  336         uint8_t                 bs_running;
  337         struct mtx              bs_mtx;
  338         struct bstp_pri_vector  bs_bridge_pv;
  339         struct bstp_pri_vector  bs_root_pv;
  340         struct bstp_port        *bs_root_port;
  341         uint8_t                 bs_protover;
  342         uint16_t                bs_migration_delay;
  343         uint16_t                bs_edge_delay;
  344         uint16_t                bs_bridge_max_age;
  345         uint16_t                bs_bridge_fdelay;
  346         uint16_t                bs_bridge_htime;
  347         uint16_t                bs_root_msg_age;
  348         uint16_t                bs_root_max_age;
  349         uint16_t                bs_root_fdelay;
  350         uint16_t                bs_root_htime;
  351         uint16_t                bs_hold_time;
  352         uint16_t                bs_bridge_priority;
  353         uint8_t                 bs_txholdcount;
  354         uint8_t                 bs_allsynced;
  355         struct callout          bs_bstpcallout; /* STP callout */
  356         struct bstp_timer       bs_link_timer;
  357         struct timeval          bs_last_tc_time;
  358         LIST_HEAD(, bstp_port)  bs_bplist;
  359         bstp_state_cb_t         bs_state_cb;
  360         bstp_rtage_cb_t         bs_rtage_cb;
  361 };
  362 
  363 #define BSTP_LOCK_INIT(_bs)     mtx_init(&(_bs)->bs_mtx, "bstp", NULL, MTX_DEF)
  364 #define BSTP_LOCK_DESTROY(_bs)  mtx_destroy(&(_bs)->bs_mtx)
  365 #define BSTP_LOCK(_bs)          mtx_lock(&(_bs)->bs_mtx)
  366 #define BSTP_UNLOCK(_bs)        mtx_unlock(&(_bs)->bs_mtx)
  367 #define BSTP_LOCK_ASSERT(_bs)   mtx_assert(&(_bs)->bs_mtx, MA_OWNED)
  368 
  369 extern const uint8_t bstp_etheraddr[];
  370 
  371 extern  void (*bstp_linkstate_p)(struct ifnet *ifp, int state);
  372 
  373 void    bstp_attach(struct bstp_state *, struct bstp_cb_ops *);
  374 void    bstp_detach(struct bstp_state *);
  375 void    bstp_init(struct bstp_state *);
  376 void    bstp_stop(struct bstp_state *);
  377 int     bstp_create(struct bstp_state *, struct bstp_port *, struct ifnet *);
  378 int     bstp_enable(struct bstp_port *);
  379 void    bstp_disable(struct bstp_port *);
  380 void    bstp_destroy(struct bstp_port *);
  381 void    bstp_linkstate(struct ifnet *, int);
  382 int     bstp_set_htime(struct bstp_state *, int);
  383 int     bstp_set_fdelay(struct bstp_state *, int);
  384 int     bstp_set_maxage(struct bstp_state *, int);
  385 int     bstp_set_holdcount(struct bstp_state *, int);
  386 int     bstp_set_protocol(struct bstp_state *, int);
  387 int     bstp_set_priority(struct bstp_state *, int);
  388 int     bstp_set_port_priority(struct bstp_port *, int);
  389 int     bstp_set_path_cost(struct bstp_port *, uint32_t);
  390 int     bstp_set_edge(struct bstp_port *, int);
  391 int     bstp_set_autoedge(struct bstp_port *, int);
  392 int     bstp_set_ptp(struct bstp_port *, int);
  393 int     bstp_set_autoptp(struct bstp_port *, int);
  394 struct mbuf *bstp_input(struct bstp_port *, struct ifnet *, struct mbuf *);
  395 
  396 #endif /* _KERNEL */

Cache object: a565e8e26b3b03c21b869cf4d3183c1b


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.