File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / quagga / bgpd / bgp_encap_types.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Nov 2 10:09:10 2016 UTC (7 years, 8 months ago) by misho
Branches: quagga, MAIN
CVS tags: v1_0_20160315, HEAD
quagga 1.0.20160315

    1: /*
    2:  * Copyright 2015, LabN Consulting, L.L.C.
    3:  *
    4:  * This program is free software; you can redistribute it and/or
    5:  * modify it under the terms of the GNU General Public License
    6:  * as published by the Free Software Foundation; either version 2
    7:  * of the License, or (at your option) any later version.
    8:  *
    9:  * This program is distributed in the hope that it will be useful,
   10:  * but WITHOUT ANY WARRANTY; without even the implied warranty of
   11:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   12:  * GNU General Public License for more details.
   13:  *
   14:  * You should have received a copy of the GNU General Public License
   15:  * along with this program; if not, write to the Free Software
   16:  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
   17:  *
   18:  */
   19: 
   20: #ifndef _QUAGGA_BGP_ENCAP_TYPES_H
   21: #define _QUAGGA_BGP_ENCAP_TYPES_H
   22: 
   23: /* from http://www.iana.org/assignments/bgp-parameters/bgp-parameters.xhtml#tunnel-types */
   24: typedef enum {
   25:     BGP_ENCAP_TYPE_RESERVED=0,
   26:     BGP_ENCAP_TYPE_L2TPV3_OVER_IP=1,
   27:     BGP_ENCAP_TYPE_GRE=2,
   28:     BGP_ENCAP_TYPE_TRANSMIT_TUNNEL_ENDPOINT=3,
   29:     BGP_ENCAP_TYPE_IPSEC_IN_TUNNEL_MODE=4,
   30:     BGP_ENCAP_TYPE_IP_IN_IP_TUNNEL_WITH_IPSEC_TRANSPORT_MODE=5,
   31:     BGP_ENCAP_TYPE_MPLS_IN_IP_TUNNEL_WITH_IPSEC_TRANSPORT_MODE=6,
   32:     BGP_ENCAP_TYPE_IP_IN_IP=7,
   33:     BGP_ENCAP_TYPE_VXLAN=8,
   34:     BGP_ENCAP_TYPE_NVGRE=9,
   35:     BGP_ENCAP_TYPE_MPLS=10,
   36:     BGP_ENCAP_TYPE_MPLS_IN_GRE=11,
   37:     BGP_ENCAP_TYPE_VXLAN_GPE=12,
   38:     BGP_ENCAP_TYPE_MPLS_IN_UDP=13,
   39:     BGP_ENCAP_TYPE_PBB
   40: } bgp_encap_types;
   41: 
   42: typedef enum {
   43:     BGP_ENCAP_SUBTLV_TYPE_ENCAPSULATION=1,
   44:     BGP_ENCAP_SUBTLV_TYPE_PROTO_TYPE=2,
   45:     BGP_ENCAP_SUBTLV_TYPE_IPSEC_TA=3,
   46:     BGP_ENCAP_SUBTLV_TYPE_COLOR=4,
   47:     BGP_ENCAP_SUBTLV_TYPE_REMOTE_ENDPOINT=6 /* speculative, IANA assignment TBD */
   48: } bgp_encap_subtlv_types;
   49: 
   50: /*
   51:  * Tunnel Encapsulation Attribute subtlvs
   52:  */
   53: struct bgp_tea_subtlv_encap_l2tpv3_over_ip {
   54:     uint32_t	sessionid;
   55:     uint8_t	cookie_length;
   56:     uint8_t	cookie[8];
   57: };
   58: 
   59: struct bgp_tea_subtlv_encap_gre_key {
   60:     uint32_t	gre_key;
   61: };
   62: 
   63: struct bgp_tea_subtlv_encap_pbb {
   64:     uint32_t	flag_isid:1;
   65:     uint32_t	flag_vid:1;
   66:     uint32_t	isid:24;
   67:     uint16_t	vid:12;
   68:     uint8_t	macaddr[6];
   69: };
   70: 
   71: struct bgp_tea_subtlv_proto_type {
   72:     uint16_t	proto;			/* ether-type */
   73: };
   74: 
   75: struct bgp_tea_subtlv_color {
   76:     uint32_t	color;
   77: };
   78: 
   79: /* per draft-rosen-idr-tunnel-encaps */
   80: struct bgp_tea_subtlv_remote_endpoint {
   81:     u_char family;               /* IPv4 or IPv6 */
   82:     union {
   83:         struct in_addr  v4;
   84:         struct in6_addr v6;
   85:     } ip_address;
   86:     as_t	        as4;     /* always 4 bytes */
   87: };
   88: 
   89: /*
   90:  * This is the length of the value part of the ipsec tunnel authenticator
   91:  * subtlv. Currently we only support the length for authenticator type 1.
   92:  */
   93: #define BGP_ENCAP_SUBTLV_IPSEC_TA_SIZE	20
   94: 
   95: struct bgp_tea_subtlv_ipsec_ta {
   96:     uint16_t	authenticator_type;	/* only type 1 is supported so far */
   97:     uint8_t	authenticator_length;	/* octets in value field */
   98:     uint8_t	value[BGP_ENCAP_SUBTLV_IPSEC_TA_SIZE];
   99: };
  100: 
  101: /*
  102:  * Subtlv valid flags
  103:  * TBD change names to add "VALID"
  104:  */
  105: #define BGP_TEA_SUBTLV_ENCAP		0x00000001
  106: #define BGP_TEA_SUBTLV_PROTO_TYPE	0x00000002
  107: #define BGP_TEA_SUBTLV_COLOR		0x00000004
  108: #define BGP_TEA_SUBTLV_IPSEC_TA		0x00000008
  109: #define BGP_TEA_SUBTLV_REMOTE_ENDPOINT	0x00000010
  110: 
  111: #define CHECK_SUBTLV_FLAG(ptr, flag)  CHECK_FLAG((ptr)->valid_subtlvs, (flag))
  112: #define SET_SUBTLV_FLAG(ptr, flag)      SET_FLAG((ptr)->valid_subtlvs, (flag))
  113: #define UNSET_SUBTLV_FLAG(ptr, flag)  UNSET_FLAG((ptr)->valid_subtlvs, (flag))
  114: 
  115: /*
  116:  * Tunnel Type-specific APIs
  117:  */
  118: struct bgp_encap_type_reserved {
  119:     uint32_t					valid_subtlvs;
  120:     struct bgp_tea_subtlv_remote_endpoint       st_endpoint;    /* optional */
  121: };
  122: 
  123: struct bgp_encap_type_l2tpv3_over_ip {
  124:     uint32_t					valid_subtlvs;
  125:     struct bgp_tea_subtlv_encap_l2tpv3_over_ip	st_encap;
  126:     struct bgp_tea_subtlv_proto_type		st_proto;	/* optional */
  127:     struct bgp_tea_subtlv_color			st_color;	/* optional */
  128:     struct bgp_tea_subtlv_remote_endpoint       st_endpoint;    /* optional */
  129: };
  130: 
  131: struct bgp_encap_type_gre {
  132:     uint32_t					valid_subtlvs;
  133:     struct bgp_tea_subtlv_encap_gre_key		st_encap;	/* optional */
  134:     struct bgp_tea_subtlv_proto_type		st_proto;	/* optional */
  135:     struct bgp_tea_subtlv_color			st_color;	/* optional */
  136:     struct bgp_tea_subtlv_remote_endpoint       st_endpoint;    /* optional */
  137: };
  138: 
  139: struct bgp_encap_type_ip_in_ip {
  140:     uint32_t					valid_subtlvs;
  141:     struct bgp_tea_subtlv_proto_type		st_proto;	/* optional */
  142:     struct bgp_tea_subtlv_color			st_color;	/* optional */
  143:     struct bgp_tea_subtlv_remote_endpoint       st_endpoint;    /* optional */
  144: };
  145: 
  146: struct bgp_encap_type_transmit_tunnel_endpoint {
  147:     uint32_t					valid_subtlvs;
  148:     struct bgp_tea_subtlv_remote_endpoint       st_endpoint;    /* optional */
  149:     /* No subtlvs defined in spec? */
  150: };
  151: 
  152: struct bgp_encap_type_ipsec_in_tunnel_mode {
  153:     uint32_t					valid_subtlvs;
  154:     struct bgp_tea_subtlv_ipsec_ta		st_ipsec_ta;	/* optional */
  155:     struct bgp_tea_subtlv_remote_endpoint       st_endpoint;    /* optional */
  156: };
  157: 
  158: struct bgp_encap_type_ip_in_ip_tunnel_with_ipsec_transport_mode {
  159:     uint32_t					valid_subtlvs;
  160:     struct bgp_tea_subtlv_ipsec_ta		st_ipsec_ta;	/* optional */
  161:     struct bgp_tea_subtlv_remote_endpoint       st_endpoint;    /* optional */
  162: };
  163: 
  164: struct bgp_encap_type_mpls_in_ip_tunnel_with_ipsec_transport_mode {
  165:     uint32_t					valid_subtlvs;
  166:     struct bgp_tea_subtlv_ipsec_ta		st_ipsec_ta;	/* optional */
  167:     struct bgp_tea_subtlv_remote_endpoint       st_endpoint;    /* optional */
  168: };
  169: 
  170: struct bgp_encap_type_vxlan {
  171:     uint32_t					valid_subtlvs;
  172:     struct bgp_tea_subtlv_remote_endpoint       st_endpoint;    /* optional */
  173:     /* No subtlvs defined in spec? */
  174: };
  175: 
  176: struct bgp_encap_type_nvgre {
  177:     uint32_t					valid_subtlvs;
  178:     struct bgp_tea_subtlv_remote_endpoint       st_endpoint;    /* optional */
  179:     /* No subtlvs defined in spec? */
  180: };
  181: 
  182: struct bgp_encap_type_mpls {
  183:     uint32_t					valid_subtlvs;
  184:     struct bgp_tea_subtlv_remote_endpoint       st_endpoint;    /* optional */
  185:     /* No subtlvs defined in spec? */
  186: };
  187: 
  188: struct bgp_encap_type_mpls_in_gre {
  189:     uint32_t					valid_subtlvs;
  190:     struct bgp_tea_subtlv_remote_endpoint       st_endpoint;    /* optional */
  191:     /* No subtlvs defined in spec? */
  192: };
  193: 
  194: struct bgp_encap_type_vxlan_gpe {
  195:     uint32_t					valid_subtlvs;
  196:     struct bgp_tea_subtlv_remote_endpoint       st_endpoint;    /* optional */
  197:     /* No subtlvs defined in spec? */
  198: };
  199: 
  200: struct bgp_encap_type_mpls_in_udp {
  201:     uint32_t					valid_subtlvs;
  202:     struct bgp_tea_subtlv_remote_endpoint       st_endpoint;    /* optional */
  203:     /* No subtlvs defined in spec? */
  204: };
  205: 
  206: struct bgp_encap_type_pbb {
  207:     uint32_t					valid_subtlvs;
  208:     struct bgp_tea_subtlv_remote_endpoint       st_endpoint;    /* optional */
  209:     struct bgp_tea_subtlv_encap_pbb		st_encap;
  210: };
  211: 
  212: #endif /* _QUAGGA_BGP_ENCAP_TYPES_H */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>