[BACK]Return to if_trunk.h CVS log [TXT][DIR] Up to [local] / sys / net

Annotation of sys/net/if_trunk.h, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: if_trunk.h,v 1.12 2007/04/26 08:57:59 reyk Exp $      */
                      2:
                      3: /*
                      4:  * Copyright (c) 2005, 2006 Reyk Floeter <reyk@openbsd.org>
                      5:  *
                      6:  * Permission to use, copy, modify, and distribute this software for any
                      7:  * purpose with or without fee is hereby granted, provided that the above
                      8:  * copyright notice and this permission notice appear in all copies.
                      9:  *
                     10:  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
                     11:  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
                     12:  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
                     13:  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
                     14:  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
                     15:  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
                     16:  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
                     17:  */
                     18:
                     19: #ifndef _NET_TRUNK_H
                     20: #define _NET_TRUNK_H
                     21:
                     22: /*
                     23:  * Global definitions
                     24:  */
                     25:
                     26: #define TRUNK_MAX_PORTS                32      /* logically */
                     27: #define TRUNK_MAX_NAMESIZE     32      /* name of a protocol */
                     28: #define TRUNK_MAX_STACKING     4       /* maximum number of stacked trunks */
                     29:
                     30: /* Port flags */
                     31: #define TRUNK_PORT_SLAVE       0x00000000      /* normal enslaved port */
                     32: #define TRUNK_PORT_MASTER      0x00000001      /* primary port */
                     33: #define TRUNK_PORT_STACK       0x00000002      /* stacked trunk port */
                     34: #define TRUNK_PORT_ACTIVE      0x00000004      /* port is active */
                     35: #define TRUNK_PORT_GLOBAL      0x80000000      /* IOCTL: global flag */
                     36: #define TRUNK_PORT_BITS                                                        \
                     37:        "\20\01MASTER\02STACK\03ACTIVE"
                     38:
                     39: /* Supported trunk PROTOs */
                     40: enum trunk_proto {
                     41:        TRUNK_PROTO_NONE        = 0,            /* no trunk protocol defined */
                     42:        TRUNK_PROTO_ROUNDROBIN  = 1,            /* simple round robin */
                     43:        TRUNK_PROTO_FAILOVER    = 2,            /* active failover */
                     44:        TRUNK_PROTO_LOADBALANCE = 3,            /* loadbalance */
                     45:        TRUNK_PROTO_MAX         = 4
                     46: };
                     47:
                     48: struct trunk_protos {
                     49:        const char              *tpr_name;
                     50:        enum trunk_proto        tpr_proto;
                     51: };
                     52:
                     53: #define        TRUNK_PROTO_DEFAULT     TRUNK_PROTO_ROUNDROBIN
                     54: #define TRUNK_PROTOS   {                                               \
                     55:        { "roundrobin",         TRUNK_PROTO_ROUNDROBIN },               \
                     56:        { "failover",           TRUNK_PROTO_FAILOVER },                 \
                     57:        { "loadbalance",        TRUNK_PROTO_LOADBALANCE },              \
                     58:        { "none",               TRUNK_PROTO_NONE },                     \
                     59:        { "default",            TRUNK_PROTO_DEFAULT }                   \
                     60: }
                     61:
                     62: /*
                     63:  * Trunk ioctls.
                     64:  */
                     65:
                     66: /* Trunk port settings */
                     67: struct trunk_reqport {
                     68:        char                    rp_ifname[IFNAMSIZ];    /* name of the trunk */
                     69:        char                    rp_portname[IFNAMSIZ];  /* name of the port */
                     70:        u_int32_t               rp_prio;                /* port priority */
                     71:        u_int32_t               rp_flags;               /* port flags */
                     72: };
                     73:
                     74: #define SIOCGTRUNKPORT         _IOWR('i', 140, struct trunk_reqport)
                     75: #define SIOCSTRUNKPORT          _IOW('i', 141, struct trunk_reqport)
                     76: #define SIOCSTRUNKDELPORT       _IOW('i', 142, struct trunk_reqport)
                     77:
                     78: /* Trunk, ports and options */
                     79: struct trunk_reqall {
                     80:        char                    ra_ifname[IFNAMSIZ];    /* name of the trunk */
                     81:        u_int                   ra_proto;               /* trunk protocol */
                     82:
                     83:        size_t                  ra_size;                /* size of buffer */
                     84:        struct trunk_reqport    *ra_port;               /* allocated buffer */
                     85:        int                     ra_ports;               /* total port count */
                     86: };
                     87:
                     88: #define SIOCGTRUNK             _IOWR('i', 143, struct trunk_reqall)
                     89: #define SIOCSTRUNK              _IOW('i', 144, struct trunk_reqall)
                     90:
                     91: #ifdef _KERNEL
                     92: /*
                     93:  * Internal kernel part
                     94:  */
                     95: struct trunk_softc;
                     96: struct trunk_port {
                     97:        struct ifnet                    *tp_if;         /* physical interface */
                     98:        struct trunk_softc              *tp_trunk;      /* parent trunk */
                     99:        u_int8_t                        tp_lladdr[ETHER_ADDR_LEN];
                    100:        caddr_t                         tp_psc;         /* protocol data */
                    101:
                    102:        u_char                          tp_iftype;      /* interface type */
                    103:        u_int32_t                       tp_prio;        /* port priority */
                    104:        u_int32_t                       tp_flags;       /* port flags */
                    105:        void                            *lh_cookie;     /* if state hook */
                    106:
                    107:        /* Redirected callbacks */
                    108:        void    (*tp_watchdog)(struct ifnet *);
                    109:        int     (*tp_ioctl)(struct ifnet *, u_long, caddr_t);
                    110:
                    111:        SLIST_ENTRY(trunk_port)         tp_entries;
                    112: };
                    113:
                    114: #define tp_ifname              tp_if->if_xname         /* interface name */
                    115: #define tp_ifflags             tp_if->if_flags         /* interface flags */
                    116: #define tp_link_state          tp_if->if_link_state    /* link state */
                    117: #define tp_capabilities                tp_if->if_capabilities  /* capabilities */
                    118:
                    119: #define TRUNK_PORTACTIVE(_tp)  (                                       \
                    120:        (LINK_STATE_IS_UP((_tp)->tp_link_state)) &&                     \
                    121:        ((_tp)->tp_ifflags & IFF_UP)                                    \
                    122: )
                    123:
                    124: struct trunk_mc {
                    125:        union {
                    126:                struct ether_multi      *mcu_enm;
                    127:        } mc_u;
                    128:        struct sockaddr_storage         mc_addr;
                    129:
                    130:        SLIST_ENTRY(trunk_mc)           mc_entries;
                    131: };
                    132:
                    133: #define mc_enm mc_u.mcu_enm
                    134:
                    135: struct trunk_ifreq {
                    136:        union {
                    137:                struct ifreq ifreq;
                    138:                struct {
                    139:                        char ifr_name[IFNAMSIZ];
                    140:                        struct sockaddr_storage ifr_ss;
                    141:                } ifreq_storage;
                    142:        } ifreq;
                    143: };
                    144:
                    145: struct trunk_softc {
                    146:        struct arpcom                   tr_ac;          /* virtual interface */
                    147:        int                             tr_unit;        /* trunk unit */
                    148:        enum trunk_proto                tr_proto;       /* trunk protocol */
                    149:        u_int                           tr_count;       /* number of ports */
                    150:        struct trunk_port               *tr_primary;    /* primary port */
                    151:        struct ifmedia                  tr_media;       /* media config */
                    152:        caddr_t                         tr_psc;         /* protocol data */
                    153:
                    154:        SLIST_HEAD(__tplhd, trunk_port) tr_ports;       /* list of interfaces */
                    155:        SLIST_ENTRY(trunk_softc)        tr_entries;
                    156:
                    157:        SLIST_HEAD(__mclhd, trunk_mc)   tr_mc_head;     /* multicast addresses */
                    158:
                    159:        /* Trunk protocol callbacks */
                    160:        int     (*tr_detach)(struct trunk_softc *);
                    161:        int     (*tr_start)(struct trunk_softc *, struct mbuf *);
                    162:        int     (*tr_watchdog)(struct trunk_softc *);
                    163:        int     (*tr_input)(struct trunk_softc *, struct trunk_port *,
                    164:                    struct ether_header *, struct mbuf *);
                    165:        int     (*tr_port_create)(struct trunk_port *);
                    166:        void    (*tr_port_destroy)(struct trunk_port *);
                    167:        void    (*tr_linkstate)(struct trunk_port *);
                    168:        void    (*tr_init)(struct trunk_softc *);
                    169:        void    (*tr_stop)(struct trunk_softc *);
                    170: };
                    171:
                    172: #define tr_ifflags             tr_ac.ac_if.if_flags            /* flags */
                    173: #define tr_ifname              tr_ac.ac_if.if_xname            /* name */
                    174: #define tr_capabilities                tr_ac.ac_if.if_capabilities     /* capabilities */
                    175: #define tr_ifindex             tr_ac.ac_if.if_index            /* int index */
                    176: #define tr_lladdr              tr_ac.ac_enaddr                 /* lladdr */
                    177:
                    178: #define IFCAP_TRUNK_MASK       0xffff0000      /* private capabilities */
                    179: #define IFCAP_TRUNK_FULLDUPLEX 0x00010000      /* full duplex with >1 ports */
                    180:
                    181: /* Private data used by the loadbalancing protocol */
                    182: #define TRUNK_LB_MAXKEYS       8
                    183: struct trunk_lb {
                    184:        u_int32_t               lb_key;
                    185:        struct trunk_port       *lb_ports[TRUNK_MAX_PORTS];
                    186: };
                    187:
                    188: void           trunk_port_ifdetach(struct ifnet *);
                    189: int            trunk_input(struct ifnet *, struct ether_header *,
                    190:                    struct mbuf *);
                    191: int            trunk_enqueue(struct ifnet *, struct mbuf *);
                    192: u_int32_t      trunk_hashmbuf(struct mbuf *, u_int32_t);
                    193: #endif /* _KERNEL */
                    194:
                    195: #endif /* _NET_TRUNK_H */

CVSweb