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  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
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/7.3/sys/net/bridgestp.h 177993 2008-04-08 06:55:09Z 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_RECIEVED      1               /* compat */
  175 #define BSTP_INFO_RECEIVED      1
  176 #define BSTP_INFO_MINE          2
  177 #define BSTP_INFO_AGED          3
  178 #define BSTP_INFO_DISABLED      4
  179 
  180 
  181 #define BSTP_MESSAGE_AGE_INCR   (1 * 256)       /* in 256ths of a second */
  182 #define BSTP_TICK_VAL           (1 * 256)       /* in 256ths of a second */
  183 #define BSTP_LINK_TIMER         (BSTP_TICK_VAL * 15)
  184 
  185 /*
  186  * Driver callbacks for STP state changes
  187  */
  188 typedef void (*bstp_state_cb_t)(struct ifnet *, int);
  189 typedef void (*bstp_rtage_cb_t)(struct ifnet *, int);
  190 struct bstp_cb_ops {
  191         bstp_state_cb_t bcb_state;
  192         bstp_rtage_cb_t bcb_rtage;
  193 };
  194 
  195 /*
  196  * Because BPDU's do not make nicely aligned structures, two different
  197  * declarations are used: bstp_?bpdu (wire representation, packed) and
  198  * bstp_*_unit (internal, nicely aligned version).
  199  */
  200 
  201 /* configuration bridge protocol data unit */
  202 struct bstp_cbpdu {
  203         uint8_t         cbu_dsap;               /* LLC: destination sap */
  204         uint8_t         cbu_ssap;               /* LLC: source sap */
  205         uint8_t         cbu_ctl;                /* LLC: control */
  206         uint16_t        cbu_protoid;            /* protocol id */
  207         uint8_t         cbu_protover;           /* protocol version */
  208         uint8_t         cbu_bpdutype;           /* message type */
  209         uint8_t         cbu_flags;              /* flags (below) */
  210 
  211         /* root id */
  212         uint16_t        cbu_rootpri;            /* root priority */
  213         uint8_t         cbu_rootaddr[6];        /* root address */
  214 
  215         uint32_t        cbu_rootpathcost;       /* root path cost */
  216 
  217         /* bridge id */
  218         uint16_t        cbu_bridgepri;          /* bridge priority */
  219         uint8_t         cbu_bridgeaddr[6];      /* bridge address */
  220 
  221         uint16_t        cbu_portid;             /* port id */
  222         uint16_t        cbu_messageage;         /* current message age */
  223         uint16_t        cbu_maxage;             /* maximum age */
  224         uint16_t        cbu_hellotime;          /* hello time */
  225         uint16_t        cbu_forwarddelay;       /* forwarding delay */
  226         uint8_t         cbu_versionlen;         /* version 1 length */
  227 } __packed;
  228 #define BSTP_BPDU_STP_LEN       (3 + 35)        /* LLC + STP pdu */
  229 #define BSTP_BPDU_RSTP_LEN      (3 + 36)        /* LLC + RSTP pdu */
  230 
  231 /* topology change notification bridge protocol data unit */
  232 struct bstp_tbpdu {
  233         uint8_t         tbu_dsap;               /* LLC: destination sap */
  234         uint8_t         tbu_ssap;               /* LLC: source sap */
  235         uint8_t         tbu_ctl;                /* LLC: control */
  236         uint16_t        tbu_protoid;            /* protocol id */
  237         uint8_t         tbu_protover;           /* protocol version */
  238         uint8_t         tbu_bpdutype;           /* message type */
  239 } __packed;
  240 
  241 /*
  242  * Timekeeping structure used in spanning tree code.
  243  */
  244 struct bstp_timer {
  245         int             active;
  246         int             latched;
  247         int             value;
  248 };
  249 
  250 struct bstp_pri_vector {
  251         uint64_t                pv_root_id;
  252         uint32_t                pv_cost;
  253         uint64_t                pv_dbridge_id;
  254         uint16_t                pv_dport_id;
  255         uint16_t                pv_port_id;
  256 };
  257 
  258 struct bstp_config_unit {
  259         struct bstp_pri_vector  cu_pv;
  260         uint16_t        cu_message_age;
  261         uint16_t        cu_max_age;
  262         uint16_t        cu_forward_delay;
  263         uint16_t        cu_hello_time;
  264         uint8_t         cu_message_type;
  265         uint8_t         cu_topology_change_ack;
  266         uint8_t         cu_topology_change;
  267         uint8_t         cu_proposal;
  268         uint8_t         cu_agree;
  269         uint8_t         cu_learning;
  270         uint8_t         cu_forwarding;
  271         uint8_t         cu_role;
  272 };
  273 
  274 struct bstp_tcn_unit {
  275         uint8_t         tu_message_type;
  276 };
  277 
  278 struct bstp_port {
  279         LIST_ENTRY(bstp_port)   bp_next;
  280         struct ifnet            *bp_ifp;        /* parent if */
  281         struct bstp_state       *bp_bs;
  282         uint8_t                 bp_active;
  283         uint8_t                 bp_protover;
  284         uint32_t                bp_flags;
  285         uint32_t                bp_path_cost;
  286         uint16_t                bp_port_msg_age;
  287         uint16_t                bp_port_max_age;
  288         uint16_t                bp_port_fdelay;
  289         uint16_t                bp_port_htime;
  290         uint16_t                bp_desg_msg_age;
  291         uint16_t                bp_desg_max_age;
  292         uint16_t                bp_desg_fdelay;
  293         uint16_t                bp_desg_htime;
  294         struct bstp_timer       bp_edge_delay_timer;
  295         struct bstp_timer       bp_forward_delay_timer;
  296         struct bstp_timer       bp_hello_timer;
  297         struct bstp_timer       bp_message_age_timer;
  298         struct bstp_timer       bp_migrate_delay_timer;
  299         struct bstp_timer       bp_recent_backup_timer;
  300         struct bstp_timer       bp_recent_root_timer;
  301         struct bstp_timer       bp_tc_timer;
  302         struct bstp_config_unit bp_msg_cu;
  303         struct bstp_pri_vector  bp_desg_pv;
  304         struct bstp_pri_vector  bp_port_pv;
  305         uint16_t                bp_port_id;
  306         uint8_t                 bp_state;
  307         uint8_t                 bp_tcstate;
  308         uint8_t                 bp_role;
  309         uint8_t                 bp_infois;
  310         uint8_t                 bp_tc_ack;
  311         uint8_t                 bp_tc_prop;
  312         uint8_t                 bp_fdbflush;
  313         uint8_t                 bp_priority;
  314         uint8_t                 bp_ptp_link;
  315         uint8_t                 bp_agree;
  316         uint8_t                 bp_agreed;
  317         uint8_t                 bp_sync;
  318         uint8_t                 bp_synced;
  319         uint8_t                 bp_proposing;
  320         uint8_t                 bp_proposed;
  321         uint8_t                 bp_operedge;
  322         uint8_t                 bp_reroot;
  323         uint8_t                 bp_rcvdtc;
  324         uint8_t                 bp_rcvdtca;
  325         uint8_t                 bp_rcvdtcn;
  326         uint32_t                bp_forward_transitions;
  327         uint8_t                 bp_txcount;
  328         struct task             bp_statetask;
  329         struct task             bp_rtagetask;
  330 };
  331 
  332 /*
  333  * Software state for each bridge STP.
  334  */
  335 struct bstp_state {
  336         LIST_ENTRY(bstp_state)  bs_list;
  337         uint8_t                 bs_running;
  338         struct mtx              bs_mtx;
  339         struct bstp_pri_vector  bs_bridge_pv;
  340         struct bstp_pri_vector  bs_root_pv;
  341         struct bstp_port        *bs_root_port;
  342         uint8_t                 bs_protover;
  343         uint16_t                bs_migration_delay;
  344         uint16_t                bs_edge_delay;
  345         uint16_t                bs_bridge_max_age;
  346         uint16_t                bs_bridge_fdelay;
  347         uint16_t                bs_bridge_htime;
  348         uint16_t                bs_root_msg_age;
  349         uint16_t                bs_root_max_age;
  350         uint16_t                bs_root_fdelay;
  351         uint16_t                bs_root_htime;
  352         uint16_t                bs_hold_time;
  353         uint16_t                bs_bridge_priority;
  354         uint8_t                 bs_txholdcount;
  355         uint8_t                 bs_allsynced;
  356         struct callout          bs_bstpcallout; /* STP callout */
  357         struct bstp_timer       bs_link_timer;
  358         struct timeval          bs_last_tc_time;
  359         LIST_HEAD(, bstp_port)  bs_bplist;
  360         bstp_state_cb_t         bs_state_cb;
  361         bstp_rtage_cb_t         bs_rtage_cb;
  362 };
  363 
  364 #define BSTP_LOCK_INIT(_bs)     mtx_init(&(_bs)->bs_mtx, "bstp", NULL, MTX_DEF)
  365 #define BSTP_LOCK_DESTROY(_bs)  mtx_destroy(&(_bs)->bs_mtx)
  366 #define BSTP_LOCK(_bs)          mtx_lock(&(_bs)->bs_mtx)
  367 #define BSTP_UNLOCK(_bs)        mtx_unlock(&(_bs)->bs_mtx)
  368 #define BSTP_LOCK_ASSERT(_bs)   mtx_assert(&(_bs)->bs_mtx, MA_OWNED)
  369 
  370 extern const uint8_t bstp_etheraddr[];
  371 
  372 extern  void (*bstp_linkstate_p)(struct ifnet *ifp, int state);
  373 
  374 void    bstp_attach(struct bstp_state *, struct bstp_cb_ops *);
  375 void    bstp_detach(struct bstp_state *);
  376 void    bstp_init(struct bstp_state *);
  377 void    bstp_stop(struct bstp_state *);
  378 int     bstp_create(struct bstp_state *, struct bstp_port *, struct ifnet *);
  379 int     bstp_enable(struct bstp_port *);
  380 void    bstp_disable(struct bstp_port *);
  381 void    bstp_destroy(struct bstp_port *);
  382 void    bstp_linkstate(struct ifnet *, int);
  383 int     bstp_set_htime(struct bstp_state *, int);
  384 int     bstp_set_fdelay(struct bstp_state *, int);
  385 int     bstp_set_maxage(struct bstp_state *, int);
  386 int     bstp_set_holdcount(struct bstp_state *, int);
  387 int     bstp_set_protocol(struct bstp_state *, int);
  388 int     bstp_set_priority(struct bstp_state *, int);
  389 int     bstp_set_port_priority(struct bstp_port *, int);
  390 int     bstp_set_path_cost(struct bstp_port *, uint32_t);
  391 int     bstp_set_edge(struct bstp_port *, int);
  392 int     bstp_set_autoedge(struct bstp_port *, int);
  393 int     bstp_set_ptp(struct bstp_port *, int);
  394 int     bstp_set_autoptp(struct bstp_port *, int);
  395 struct mbuf *bstp_input(struct bstp_port *, struct ifnet *, struct mbuf *);
  396 
  397 #endif /* _KERNEL */

Cache object: 672e8b1c67af3d71cb22f7908c524c73


[ 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.