2 * Copyright 2015-2016, LabN Consulting, L.L.C.
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.
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.
14 * You should have received a copy of the GNU General Public License along
15 * with this program; see the file COPYING; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 #include "lib/zebra.h"
21 #include "lib/memory.h"
22 #include "lib/prefix.h"
23 #include "lib/table.h"
26 #include "bgpd/bgpd.h"
27 #include "bgpd/bgp_attr.h"
29 #include "bgpd/bgp_encap_types.h"
30 #include "bgpd/bgp_encap_tlv.h"
32 #include "bgpd/rfapi/rfapi.h"
33 #include "bgpd/rfapi/rfapi_encap_tlv.h"
34 #include "bgpd/rfapi/rfapi_private.h"
35 #include "bgpd/rfapi/rfapi_monitor.h"
36 #include "bgpd/rfapi/rfapi_vty.h"
37 #include "bgpd/rfapi/bgp_rfapi_cfg.h"
38 #include "bgpd/rfapi/vnc_debug.h"
40 static void rfapi_add_endpoint_address_to_subtlv(
41 struct bgp
*bgp
, struct rfapi_ip_addr
*ea
,
42 struct bgp_tea_subtlv_remote_endpoint
*subtlv
)
44 subtlv
->family
= ea
->addr_family
;
45 if (subtlv
->family
== AF_INET
)
46 subtlv
->ip_address
.v4
= ea
->addr
.v4
;
48 subtlv
->ip_address
.v6
= ea
->addr
.v6
;
49 subtlv
->as4
= htonl(bgp
->as
);
53 rfapi_tunneltype_option_to_tlv(struct bgp
*bgp
, struct rfapi_ip_addr
*ea
,
54 struct rfapi_tunneltype_option
*tto
,
55 struct attr
*attr
, int always_add
)
58 #define _RTTO_MAYBE_ADD_ENDPOINT_ADDRESS(ttype) \
61 && !CHECK_FLAG(bgp->rfapi_cfg->flags, \
62 BGP_VNC_CONFIG_ADV_UN_METHOD_ENCAP))) \
64 && !CHECK_SUBTLV_FLAG(&tto->bgpinfo.ttype, \
65 BGP_TEA_SUBTLV_REMOTE_ENDPOINT)) { \
66 rfapi_add_endpoint_address_to_subtlv( \
67 bgp, ea, &tto->bgpinfo.ttype.st_endpoint); \
68 SET_SUBTLV_FLAG(&tto->bgpinfo.ttype, \
69 BGP_TEA_SUBTLV_REMOTE_ENDPOINT); \
72 struct rfapi_tunneltype_option dto
;
73 if (tto
== NULL
) { /* create default type */
75 memset(tto
, 0, sizeof(dto
));
76 tto
->type
= RFAPI_BGP_ENCAP_TYPE_DEFAULT
;
79 case BGP_ENCAP_TYPE_L2TPV3_OVER_IP
:
80 _RTTO_MAYBE_ADD_ENDPOINT_ADDRESS(l2tpv3_ip
);
81 bgp_encap_type_l2tpv3overip_to_tlv(&tto
->bgpinfo
.l2tpv3_ip
,
85 case BGP_ENCAP_TYPE_GRE
:
86 _RTTO_MAYBE_ADD_ENDPOINT_ADDRESS(gre
);
87 bgp_encap_type_gre_to_tlv(&tto
->bgpinfo
.gre
, attr
);
90 case BGP_ENCAP_TYPE_TRANSMIT_TUNNEL_ENDPOINT
:
91 _RTTO_MAYBE_ADD_ENDPOINT_ADDRESS(transmit_tunnel_endpoint
);
92 bgp_encap_type_transmit_tunnel_endpoint(
93 &tto
->bgpinfo
.transmit_tunnel_endpoint
, attr
);
96 case BGP_ENCAP_TYPE_IPSEC_IN_TUNNEL_MODE
:
97 _RTTO_MAYBE_ADD_ENDPOINT_ADDRESS(ipsec_tunnel
);
98 bgp_encap_type_ipsec_in_tunnel_mode_to_tlv(
99 &tto
->bgpinfo
.ipsec_tunnel
, attr
);
102 case BGP_ENCAP_TYPE_IP_IN_IP_TUNNEL_WITH_IPSEC_TRANSPORT_MODE
:
103 _RTTO_MAYBE_ADD_ENDPOINT_ADDRESS(ip_ipsec
);
104 bgp_encap_type_ip_in_ip_tunnel_with_ipsec_transport_mode_to_tlv(
105 &tto
->bgpinfo
.ip_ipsec
, attr
);
108 case BGP_ENCAP_TYPE_MPLS_IN_IP_TUNNEL_WITH_IPSEC_TRANSPORT_MODE
:
109 _RTTO_MAYBE_ADD_ENDPOINT_ADDRESS(mpls_ipsec
);
110 bgp_encap_type_mpls_in_ip_tunnel_with_ipsec_transport_mode_to_tlv(
111 &tto
->bgpinfo
.mpls_ipsec
, attr
);
114 case BGP_ENCAP_TYPE_IP_IN_IP
:
115 _RTTO_MAYBE_ADD_ENDPOINT_ADDRESS(ip_ip
);
116 bgp_encap_type_ip_in_ip_to_tlv(&tto
->bgpinfo
.ip_ip
, attr
);
119 case BGP_ENCAP_TYPE_VXLAN
:
120 _RTTO_MAYBE_ADD_ENDPOINT_ADDRESS(vxlan
);
121 bgp_encap_type_vxlan_to_tlv(&tto
->bgpinfo
.vxlan
, attr
);
124 case BGP_ENCAP_TYPE_NVGRE
:
125 _RTTO_MAYBE_ADD_ENDPOINT_ADDRESS(nvgre
);
126 bgp_encap_type_nvgre_to_tlv(&tto
->bgpinfo
.nvgre
, attr
);
129 case BGP_ENCAP_TYPE_MPLS
:
130 /* nothing to do for MPLS */
133 case BGP_ENCAP_TYPE_MPLS_IN_GRE
:
134 _RTTO_MAYBE_ADD_ENDPOINT_ADDRESS(mpls_gre
);
135 bgp_encap_type_mpls_in_gre_to_tlv(&tto
->bgpinfo
.mpls_gre
, attr
);
138 case BGP_ENCAP_TYPE_VXLAN_GPE
:
139 _RTTO_MAYBE_ADD_ENDPOINT_ADDRESS(vxlan_gpe
);
140 bgp_encap_type_vxlan_gpe_to_tlv(&tto
->bgpinfo
.vxlan_gpe
, attr
);
143 case BGP_ENCAP_TYPE_MPLS_IN_UDP
:
144 _RTTO_MAYBE_ADD_ENDPOINT_ADDRESS(mpls_udp
);
145 bgp_encap_type_mpls_in_udp_to_tlv(&tto
->bgpinfo
.mpls_udp
, attr
);
148 case BGP_ENCAP_TYPE_PBB
:
149 _RTTO_MAYBE_ADD_ENDPOINT_ADDRESS(pbb
);
150 bgp_encap_type_pbb_to_tlv(&tto
->bgpinfo
.pbb
, attr
);
159 struct rfapi_un_option
*rfapi_encap_tlv_to_un_option(struct attr
*attr
)
161 struct rfapi_un_option
*uo
= NULL
;
162 struct rfapi_tunneltype_option
*tto
;
164 struct bgp_attr_encap_subtlv
*stlv
;
166 /* no tunnel encap attr stored */
167 if (!attr
->encap_tunneltype
)
170 stlv
= attr
->encap_subtlvs
;
172 uo
= XCALLOC(MTYPE_RFAPI_UN_OPTION
, sizeof(struct rfapi_un_option
));
174 uo
->type
= RFAPI_UN_OPTION_TYPE_TUNNELTYPE
;
175 uo
->v
.tunnel
.type
= attr
->encap_tunneltype
;
178 switch (attr
->encap_tunneltype
) {
179 case BGP_ENCAP_TYPE_L2TPV3_OVER_IP
:
180 rc
= tlv_to_bgp_encap_type_l2tpv3overip(
181 stlv
, &tto
->bgpinfo
.l2tpv3_ip
);
184 case BGP_ENCAP_TYPE_GRE
:
185 rc
= tlv_to_bgp_encap_type_gre(stlv
, &tto
->bgpinfo
.gre
);
188 case BGP_ENCAP_TYPE_TRANSMIT_TUNNEL_ENDPOINT
:
189 rc
= tlv_to_bgp_encap_type_transmit_tunnel_endpoint(
190 stlv
, &tto
->bgpinfo
.transmit_tunnel_endpoint
);
193 case BGP_ENCAP_TYPE_IPSEC_IN_TUNNEL_MODE
:
194 rc
= tlv_to_bgp_encap_type_ipsec_in_tunnel_mode(
195 stlv
, &tto
->bgpinfo
.ipsec_tunnel
);
198 case BGP_ENCAP_TYPE_IP_IN_IP_TUNNEL_WITH_IPSEC_TRANSPORT_MODE
:
199 rc
= tlv_to_bgp_encap_type_ip_in_ip_tunnel_with_ipsec_transport_mode(
200 stlv
, &tto
->bgpinfo
.ip_ipsec
);
203 case BGP_ENCAP_TYPE_MPLS_IN_IP_TUNNEL_WITH_IPSEC_TRANSPORT_MODE
:
204 rc
= tlv_to_bgp_encap_type_mpls_in_ip_tunnel_with_ipsec_transport_mode(
205 stlv
, &tto
->bgpinfo
.mpls_ipsec
);
208 case BGP_ENCAP_TYPE_IP_IN_IP
:
209 rc
= tlv_to_bgp_encap_type_ip_in_ip(stlv
, &tto
->bgpinfo
.ip_ip
);
212 case BGP_ENCAP_TYPE_VXLAN
:
213 rc
= tlv_to_bgp_encap_type_vxlan(stlv
, &tto
->bgpinfo
.vxlan
);
216 case BGP_ENCAP_TYPE_NVGRE
:
217 rc
= tlv_to_bgp_encap_type_nvgre(stlv
, &tto
->bgpinfo
.nvgre
);
220 case BGP_ENCAP_TYPE_MPLS
:
221 rc
= tlv_to_bgp_encap_type_mpls(stlv
, &tto
->bgpinfo
.mpls
);
224 case BGP_ENCAP_TYPE_MPLS_IN_GRE
:
225 rc
= tlv_to_bgp_encap_type_mpls_in_gre(stlv
,
226 &tto
->bgpinfo
.mpls_gre
);
229 case BGP_ENCAP_TYPE_VXLAN_GPE
:
230 rc
= tlv_to_bgp_encap_type_vxlan_gpe(stlv
,
231 &tto
->bgpinfo
.vxlan_gpe
);
234 case BGP_ENCAP_TYPE_MPLS_IN_UDP
:
235 rc
= tlv_to_bgp_encap_type_mpls_in_udp(stlv
,
236 &tto
->bgpinfo
.mpls_udp
);
239 case BGP_ENCAP_TYPE_PBB
:
240 rc
= tlv_to_bgp_encap_type_pbb(stlv
, &tto
->bgpinfo
.pbb
);
244 vnc_zlog_debug_verbose("%s: unknown tunnel type %d", __func__
,
245 attr
->encap_tunneltype
);
250 XFREE(MTYPE_RFAPI_UN_OPTION
, uo
);
255 /***********************************************************************
257 ***********************************************************************/
259 static void subtlv_print_encap_l2tpv3_over_ip(
260 void *stream
, int column_offset
,
261 struct bgp_tea_subtlv_encap_l2tpv3_over_ip
*st
)
263 int (*fp
)(void *, const char *, ...);
266 const char *vty_newline
;
268 if (rfapiStream2Vty(stream
, &fp
, &vty
, &out
, &vty_newline
) == 0)
273 fp(out
, "%*s%s%s", column_offset
, "", "SubTLV: Encap(L2TPv3 over IP)",
275 fp(out
, "%*s SessionID: %d%s", column_offset
, "", st
->sessionid
,
277 fp(out
, "%*s Cookie: (length %d)%s", column_offset
, "",
278 st
->cookie_length
, vty_newline
);
281 static void subtlv_print_encap_gre(void *stream
, int column_offset
,
282 struct bgp_tea_subtlv_encap_gre_key
*st
)
284 int (*fp
)(void *, const char *, ...);
287 const char *vty_newline
;
289 if (rfapiStream2Vty(stream
, &fp
, &vty
, &out
, &vty_newline
) == 0)
294 fp(out
, "%*s%s%s", column_offset
, "", "SubTLV: Encap(GRE)",
296 fp(out
, "%*s GRE key: %d (0x%x)%s", column_offset
, "", st
->gre_key
,
297 st
->gre_key
, vty_newline
);
300 static void subtlv_print_encap_pbb(void *stream
, int column_offset
,
301 struct bgp_tea_subtlv_encap_pbb
*st
)
303 int (*fp
)(void *, const char *, ...);
306 const char *vty_newline
;
308 if (rfapiStream2Vty(stream
, &fp
, &vty
, &out
, &vty_newline
) == 0)
313 fp(out
, "%*s%s%s", column_offset
, "", "SubTLV: Encap(PBB)",
316 fp(out
, "%*s ISID: %d (0x%x)%s", column_offset
, "", st
->isid
,
317 st
->isid
, vty_newline
);
320 fp(out
, "%*s VID: %d (0x%x)%s", column_offset
, "", st
->vid
,
321 st
->vid
, vty_newline
);
323 fp(out
, "%*s MACADDR %02x:%02x:%02x:%02x:%02x:%02x%s", column_offset
,
324 "", st
->macaddr
[0], st
->macaddr
[1], st
->macaddr
[2], st
->macaddr
[3],
325 st
->macaddr
[4], st
->macaddr
[5], vty_newline
);
328 static void subtlv_print_proto_type(void *stream
, int column_offset
,
329 struct bgp_tea_subtlv_proto_type
*st
)
331 int (*fp
)(void *, const char *, ...);
334 const char *vty_newline
;
336 if (rfapiStream2Vty(stream
, &fp
, &vty
, &out
, &vty_newline
) == 0)
341 fp(out
, "%*s%s%s", column_offset
, "", "SubTLV: Encap(Proto Type)",
343 fp(out
, "%*s Proto %d (0x%x)%s", column_offset
, "", st
->proto
,
344 st
->proto
, vty_newline
);
347 static void subtlv_print_color(void *stream
, int column_offset
,
348 struct bgp_tea_subtlv_color
*st
)
350 int (*fp
)(void *, const char *, ...);
353 const char *vty_newline
;
355 if (rfapiStream2Vty(stream
, &fp
, &vty
, &out
, &vty_newline
) == 0)
360 fp(out
, "%*s%s%s", column_offset
, "", "SubTLV: Color", vty_newline
);
361 fp(out
, "%*s Color: %d (0x%x)", column_offset
, "", st
->color
,
362 st
->color
, vty_newline
);
365 static void subtlv_print_ipsec_ta(void *stream
, int column_offset
,
366 struct bgp_tea_subtlv_ipsec_ta
*st
)
368 int (*fp
)(void *, const char *, ...);
371 const char *vty_newline
;
373 if (rfapiStream2Vty(stream
, &fp
, &vty
, &out
, &vty_newline
) == 0)
378 fp(out
, "%*s%s%s", column_offset
, "", "SubTLV: IPSEC TA", vty_newline
);
379 fp(out
, "%*s Authenticator Type: %d (0x%x)", column_offset
, "",
380 st
->authenticator_type
, st
->authenticator_type
, vty_newline
);
381 fp(out
, "%*s Authenticator: (length %d)", column_offset
, "",
382 st
->authenticator_length
, vty_newline
);
385 /***********************************************************************
387 ***********************************************************************/
390 print_encap_type_l2tpv3overip(void *stream
, int column_offset
,
391 struct bgp_encap_type_l2tpv3_over_ip
*bet
)
393 const char *type
= "L2TPv3 over IP";
394 int (*fp
)(void *, const char *, ...);
397 const char *vty_newline
;
399 if (rfapiStream2Vty(stream
, &fp
, &vty
, &out
, &vty_newline
) == 0)
404 fp(out
, "%*sTEA type %s%s", column_offset
, "", type
, vty_newline
);
406 subtlv_print_encap_l2tpv3_over_ip(stream
, column_offset
+ 2,
408 subtlv_print_proto_type(stream
, column_offset
+ 2, &bet
->st_proto
);
409 subtlv_print_color(stream
, column_offset
+ 2, &bet
->st_color
);
412 static void print_encap_type_gre(void *stream
, int column_offset
,
413 struct bgp_encap_type_gre
*bet
)
415 const char *type
= "GRE";
416 int (*fp
)(void *, const char *, ...);
419 const char *vty_newline
;
421 if (rfapiStream2Vty(stream
, &fp
, &vty
, &out
, &vty_newline
) == 0)
426 fp(out
, "%*sTEA type %s%s", column_offset
, "", type
, vty_newline
);
428 subtlv_print_encap_gre(stream
, column_offset
+ 2, &bet
->st_encap
);
429 subtlv_print_proto_type(stream
, column_offset
+ 2, &bet
->st_proto
);
430 subtlv_print_color(stream
, column_offset
+ 2, &bet
->st_color
);
433 static void print_encap_type_ip_in_ip(void *stream
, int column_offset
,
434 struct bgp_encap_type_ip_in_ip
*bet
)
436 const char *type
= "IP in IP";
437 int (*fp
)(void *, const char *, ...);
440 const char *vty_newline
;
442 if (rfapiStream2Vty(stream
, &fp
, &vty
, &out
, &vty_newline
) == 0)
447 fp(out
, "%*sTEA type %s%s", column_offset
, "", type
, vty_newline
);
449 subtlv_print_proto_type(stream
, column_offset
+ 2, &bet
->st_proto
);
450 subtlv_print_color(stream
, column_offset
+ 2, &bet
->st_color
);
453 static void print_encap_type_transmit_tunnel_endpoint(
454 void *stream
, int column_offset
,
455 struct bgp_encap_type_transmit_tunnel_endpoint
*bet
)
457 const char *type
= "Transmit Tunnel Endpoint";
458 int (*fp
)(void *, const char *, ...);
461 const char *vty_newline
;
463 if (rfapiStream2Vty(stream
, &fp
, &vty
, &out
, &vty_newline
) == 0)
468 fp(out
, "%*sTEA type %s%s", column_offset
, "", type
, vty_newline
);
470 /* no subtlvs for this type */
473 static void print_encap_type_ipsec_in_tunnel_mode(
474 void *stream
, int column_offset
,
475 struct bgp_encap_type_ipsec_in_tunnel_mode
*bet
)
477 const char *type
= "IPSEC in Tunnel mode";
478 int (*fp
)(void *, const char *, ...);
481 const char *vty_newline
;
483 if (rfapiStream2Vty(stream
, &fp
, &vty
, &out
, &vty_newline
) == 0)
488 fp(out
, "%*sTEA type %s%s", column_offset
, "", type
, vty_newline
);
489 subtlv_print_ipsec_ta(stream
, column_offset
+ 2, &bet
->st_ipsec_ta
);
492 static void print_encap_type_ip_in_ip_tunnel_with_ipsec_transport_mode(
493 void *stream
, int column_offset
,
494 struct bgp_encap_type_ip_in_ip_tunnel_with_ipsec_transport_mode
*bet
)
496 const char *type
= "IP in IP Tunnel with IPSEC transport mode";
497 int (*fp
)(void *, const char *, ...);
500 const char *vty_newline
;
502 if (rfapiStream2Vty(stream
, &fp
, &vty
, &out
, &vty_newline
) == 0)
507 fp(out
, "%*sTEA type %s%s", column_offset
, "", type
, vty_newline
);
509 subtlv_print_ipsec_ta(stream
, column_offset
+ 2, &bet
->st_ipsec_ta
);
512 static void print_encap_type_mpls_in_ip_tunnel_with_ipsec_transport_mode(
513 void *stream
, int column_offset
,
514 struct bgp_encap_type_mpls_in_ip_tunnel_with_ipsec_transport_mode
*bet
)
516 const char *type
= "MPLS in IP Tunnel with IPSEC transport mode";
517 int (*fp
)(void *, const char *, ...);
520 const char *vty_newline
;
522 if (rfapiStream2Vty(stream
, &fp
, &vty
, &out
, &vty_newline
) == 0)
527 fp(out
, "%*sTEA type %s%s", column_offset
, "", type
, vty_newline
);
529 subtlv_print_ipsec_ta(stream
, column_offset
+ 2, &bet
->st_ipsec_ta
);
533 static void print_encap_type_pbb(void *stream
, int column_offset
,
534 struct bgp_encap_type_pbb
*bet
)
536 const char *type
= "PBB";
537 int (*fp
)(void *, const char *, ...);
540 const char *vty_newline
;
542 if (rfapiStream2Vty(stream
, &fp
, &vty
, &out
, &vty_newline
) == 0)
547 fp(out
, "%*sTEA type %s%s", column_offset
, "", type
, vty_newline
);
549 subtlv_print_encap_pbb(stream
, column_offset
+ 2, &bet
->st_encap
);
553 static void print_encap_type_vxlan(void *stream
, int column_offset
,
554 struct bgp_encap_type_vxlan
*bet
)
556 const char *type
= "VXLAN";
557 int (*fp
)(void *, const char *, ...);
560 const char *vty_newline
;
562 if (rfapiStream2Vty(stream
, &fp
, &vty
, &out
, &vty_newline
) == 0)
567 fp(out
, "%*sTEA type %s%s", column_offset
, "", type
, vty_newline
);
569 /* no subtlvs for this type */
573 static void print_encap_type_nvgre(void *stream
, int column_offset
,
574 struct bgp_encap_type_nvgre
*bet
)
576 const char *type
= "NVGRE";
577 int (*fp
)(void *, const char *, ...);
580 const char *vty_newline
;
582 if (rfapiStream2Vty(stream
, &fp
, &vty
, &out
, &vty_newline
) == 0)
587 fp(out
, "%*sTEA type %s%s", column_offset
, "", type
, vty_newline
);
589 /* no subtlvs for this type */
592 static void print_encap_type_mpls(void *stream
, int column_offset
,
593 struct bgp_encap_type_mpls
*bet
)
595 const char *type
= "MPLS";
596 int (*fp
)(void *, const char *, ...);
599 const char *vty_newline
;
601 if (rfapiStream2Vty(stream
, &fp
, &vty
, &out
, &vty_newline
) == 0)
606 fp(out
, "%*sTEA type %s%s", column_offset
, "", type
, vty_newline
);
608 /* no subtlvs for this type */
611 static void print_encap_type_mpls_in_gre(void *stream
, int column_offset
,
612 struct bgp_encap_type_mpls_in_gre
*bet
)
614 const char *type
= "MPLS in GRE";
615 int (*fp
)(void *, const char *, ...);
618 const char *vty_newline
;
620 if (rfapiStream2Vty(stream
, &fp
, &vty
, &out
, &vty_newline
) == 0)
625 fp(out
, "%*sTEA type %s%s", column_offset
, "", type
, vty_newline
);
627 /* no subtlvs for this type */
630 static void print_encap_type_vxlan_gpe(void *stream
, int column_offset
,
631 struct bgp_encap_type_vxlan_gpe
*bet
)
633 const char *type
= "VXLAN GPE";
634 int (*fp
)(void *, const char *, ...);
637 const char *vty_newline
;
639 if (rfapiStream2Vty(stream
, &fp
, &vty
, &out
, &vty_newline
) == 0)
644 fp(out
, "%*sTEA type %s%s", column_offset
, "", type
, vty_newline
);
646 /* no subtlvs for this type */
649 static void print_encap_type_mpls_in_udp(void *stream
, int column_offset
,
650 struct bgp_encap_type_mpls_in_udp
*bet
)
652 const char *type
= "MPLS in UDP";
653 int (*fp
)(void *, const char *, ...);
656 const char *vty_newline
;
658 if (rfapiStream2Vty(stream
, &fp
, &vty
, &out
, &vty_newline
) == 0)
663 fp(out
, "%*sTEA type %s%s", column_offset
, "", type
, vty_newline
);
665 /* no subtlvs for this type */
668 void rfapi_print_tunneltype_option(void *stream
, int column_offset
,
669 struct rfapi_tunneltype_option
*tto
)
672 case BGP_ENCAP_TYPE_L2TPV3_OVER_IP
:
673 print_encap_type_l2tpv3overip(stream
, column_offset
,
674 &tto
->bgpinfo
.l2tpv3_ip
);
677 case BGP_ENCAP_TYPE_GRE
:
678 print_encap_type_gre(stream
, column_offset
, &tto
->bgpinfo
.gre
);
681 case BGP_ENCAP_TYPE_TRANSMIT_TUNNEL_ENDPOINT
:
682 print_encap_type_transmit_tunnel_endpoint(
683 stream
, column_offset
,
684 &tto
->bgpinfo
.transmit_tunnel_endpoint
);
687 case BGP_ENCAP_TYPE_IPSEC_IN_TUNNEL_MODE
:
688 print_encap_type_ipsec_in_tunnel_mode(
689 stream
, column_offset
, &tto
->bgpinfo
.ipsec_tunnel
);
692 case BGP_ENCAP_TYPE_IP_IN_IP_TUNNEL_WITH_IPSEC_TRANSPORT_MODE
:
693 print_encap_type_ip_in_ip_tunnel_with_ipsec_transport_mode(
694 stream
, column_offset
, &tto
->bgpinfo
.ip_ipsec
);
697 case BGP_ENCAP_TYPE_MPLS_IN_IP_TUNNEL_WITH_IPSEC_TRANSPORT_MODE
:
698 print_encap_type_mpls_in_ip_tunnel_with_ipsec_transport_mode(
699 stream
, column_offset
, &tto
->bgpinfo
.mpls_ipsec
);
702 case BGP_ENCAP_TYPE_IP_IN_IP
:
703 print_encap_type_ip_in_ip(stream
, column_offset
,
704 &tto
->bgpinfo
.ip_ip
);
707 case BGP_ENCAP_TYPE_VXLAN
:
708 print_encap_type_vxlan(stream
, column_offset
,
709 &tto
->bgpinfo
.vxlan
);
712 case BGP_ENCAP_TYPE_NVGRE
:
713 print_encap_type_nvgre(stream
, column_offset
,
714 &tto
->bgpinfo
.nvgre
);
717 case BGP_ENCAP_TYPE_MPLS
:
718 print_encap_type_mpls(stream
, column_offset
,
722 case BGP_ENCAP_TYPE_MPLS_IN_GRE
:
723 print_encap_type_mpls_in_gre(stream
, column_offset
,
724 &tto
->bgpinfo
.mpls_gre
);
727 case BGP_ENCAP_TYPE_VXLAN_GPE
:
728 print_encap_type_vxlan_gpe(stream
, column_offset
,
729 &tto
->bgpinfo
.vxlan_gpe
);
732 case BGP_ENCAP_TYPE_MPLS_IN_UDP
:
733 print_encap_type_mpls_in_udp(stream
, column_offset
,
734 &tto
->bgpinfo
.mpls_udp
);
737 case BGP_ENCAP_TYPE_PBB
:
738 print_encap_type_pbb(stream
, column_offset
, &tto
->bgpinfo
.pbb
);