forked from FRRouting/frr
-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
bgpd: prefix-sid srv6 l3vpn service tlv
bgpd already supports BGP Prefix-SID path attribute and there are some sub-types of Prefix-SID path attribute. This commits makes bgpd to support additional sub-types. sub-Type-4 and sub-Type-5 for construct the VPNv4 SRv6 backend with vpnv4-unicast address family. This path attributes is already supported by Ciscos IOS-XR and NX-OS. Prefix-SID sub-Type-4 and sub-Type-5 is defined on following IETF-drafts. Supports(A-part-of): - https://tools.ietf.org/html/draft-dawra-idr-srv6-vpn-04 - https://tools.ietf.org/html/draft-dawra-idr-srv6-vpn-05 Signed-off-by: Hiroki Shirokura <slank.dev@gmail.com>
- Loading branch information
Showing
10 changed files
with
647 additions
and
13 deletions.
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,116 @@ | ||
/* | ||
* SRv6 definitions | ||
* Copyright (C) 2020 Hiroki Shirokura, LINE Corporation | ||
* | ||
* This program is free software; you can redistribute it and/or modify it | ||
* under the terms of the GNU General Public License as published by the Free | ||
* Software Foundation; either version 2 of the License, or (at your option) | ||
* any later version. | ||
* | ||
* This program is distributed in the hope that it will be useful, but WITHOUT | ||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
* more details. | ||
* | ||
* You should have received a copy of the GNU General Public License along | ||
* with this program; see the file COPYING; if not, write to the Free Software | ||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
*/ | ||
|
||
#include "srv6.h" | ||
#include "log.h" | ||
|
||
const char *seg6local_action2str(uint32_t action) | ||
{ | ||
switch (action) { | ||
case ZEBRA_SEG6_LOCAL_ACTION_END: | ||
return "End"; | ||
case ZEBRA_SEG6_LOCAL_ACTION_END_X: | ||
return "End.X"; | ||
case ZEBRA_SEG6_LOCAL_ACTION_END_T: | ||
return "End.T"; | ||
case ZEBRA_SEG6_LOCAL_ACTION_END_DX2: | ||
return "End.DX2"; | ||
case ZEBRA_SEG6_LOCAL_ACTION_END_DX6: | ||
return "End.DX6"; | ||
case ZEBRA_SEG6_LOCAL_ACTION_END_DX4: | ||
return "End.DX4"; | ||
case ZEBRA_SEG6_LOCAL_ACTION_END_DT6: | ||
return "End.DT6"; | ||
case ZEBRA_SEG6_LOCAL_ACTION_END_DT4: | ||
return "End.DT4"; | ||
case ZEBRA_SEG6_LOCAL_ACTION_END_B6: | ||
return "End.B6"; | ||
case ZEBRA_SEG6_LOCAL_ACTION_END_B6_ENCAP: | ||
return "End.B6.Encap"; | ||
case ZEBRA_SEG6_LOCAL_ACTION_END_BM: | ||
return "End.BM"; | ||
case ZEBRA_SEG6_LOCAL_ACTION_END_S: | ||
return "End.S"; | ||
case ZEBRA_SEG6_LOCAL_ACTION_END_AS: | ||
return "End.AS"; | ||
case ZEBRA_SEG6_LOCAL_ACTION_END_AM: | ||
return "End.AM"; | ||
case ZEBRA_SEG6_LOCAL_ACTION_UNSPEC: | ||
return "unspec"; | ||
default: | ||
return "unknown"; | ||
} | ||
} | ||
|
||
int snprintf_seg6_segs(char *str, | ||
size_t size, const struct seg6_segs *segs) | ||
{ | ||
str[0] = '\0'; | ||
for (size_t i = 0; i < segs->num_segs; i++) { | ||
char addr[INET6_ADDRSTRLEN]; | ||
bool not_last = (i + 1) < segs->num_segs; | ||
|
||
inet_ntop(AF_INET6, &segs->segs[i], addr, sizeof(addr)); | ||
strlcat(str, addr, size); | ||
strlcat(str, not_last ? "," : "", size); | ||
} | ||
return strlen(str); | ||
} | ||
|
||
const char *seg6local_context2str(char *str, size_t size, | ||
struct seg6local_context *ctx, uint32_t action) | ||
{ | ||
char b0[128]; | ||
|
||
switch (action) { | ||
|
||
case ZEBRA_SEG6_LOCAL_ACTION_END: | ||
snprintf(str, size, "USP"); | ||
return str; | ||
|
||
case ZEBRA_SEG6_LOCAL_ACTION_END_X: | ||
case ZEBRA_SEG6_LOCAL_ACTION_END_DX6: | ||
inet_ntop(AF_INET6, &ctx->nh6, b0, 128); | ||
snprintf(str, size, "nh6 %s", b0); | ||
return str; | ||
|
||
case ZEBRA_SEG6_LOCAL_ACTION_END_DX4: | ||
inet_ntop(AF_INET, &ctx->nh4, b0, 128); | ||
snprintf(str, size, "nh4 %s", b0); | ||
return str; | ||
|
||
case ZEBRA_SEG6_LOCAL_ACTION_END_T: | ||
case ZEBRA_SEG6_LOCAL_ACTION_END_DT6: | ||
case ZEBRA_SEG6_LOCAL_ACTION_END_DT4: | ||
snprintf(str, size, "table %u", ctx->table); | ||
return str; | ||
|
||
case ZEBRA_SEG6_LOCAL_ACTION_END_DX2: | ||
case ZEBRA_SEG6_LOCAL_ACTION_END_B6: | ||
case ZEBRA_SEG6_LOCAL_ACTION_END_B6_ENCAP: | ||
case ZEBRA_SEG6_LOCAL_ACTION_END_BM: | ||
case ZEBRA_SEG6_LOCAL_ACTION_END_S: | ||
case ZEBRA_SEG6_LOCAL_ACTION_END_AS: | ||
case ZEBRA_SEG6_LOCAL_ACTION_END_AM: | ||
case ZEBRA_SEG6_LOCAL_ACTION_UNSPEC: | ||
default: | ||
snprintf(str, size, "unknown(%s)", __func__); | ||
return str; | ||
} | ||
} |
Oops, something went wrong.