mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-14 16:04:49 +00:00
commit
71ef4ee49a
@ -4425,7 +4425,9 @@ int bgp_evpn_local_vni_del(struct bgp *bgp, vni_t vni)
|
||||
/* Locate VNI hash */
|
||||
vpn = bgp_evpn_lookup_vni(bgp, vni);
|
||||
if (!vpn) {
|
||||
zlog_warn("%u: VNI hash entry for VNI %u not found at DEL",
|
||||
if (bgp_debug_zebra(NULL))
|
||||
zlog_warn(
|
||||
"%u: VNI hash entry for VNI %u not found at DEL",
|
||||
bgp->vrf_id, vni);
|
||||
return 0;
|
||||
}
|
||||
|
@ -311,7 +311,7 @@ static void bgp_evpn_show_route_rd_header(struct vty *vty,
|
||||
}
|
||||
|
||||
static void bgp_evpn_show_route_header(struct vty *vty, struct bgp *bgp,
|
||||
json_object *json)
|
||||
uint64_t tbl_ver, json_object *json)
|
||||
{
|
||||
char ri_header[] =
|
||||
" Network Next Hop Metric LocPrf Weight Path\n";
|
||||
@ -319,9 +319,8 @@ static void bgp_evpn_show_route_header(struct vty *vty, struct bgp *bgp,
|
||||
if (json)
|
||||
return;
|
||||
|
||||
|
||||
vty_out(vty, "BGP table version is 0, local router ID is %s\n",
|
||||
inet_ntoa(bgp->router_id));
|
||||
vty_out(vty, "BGP table version is %" PRIu64 ", local router ID is %s\n",
|
||||
tbl_ver, inet_ntoa(bgp->router_id));
|
||||
vty_out(vty,
|
||||
"Status codes: s suppressed, d damped, h history, "
|
||||
"* valid, > best, i - internal\n");
|
||||
@ -494,12 +493,16 @@ static void show_vni_routes(struct bgp *bgp, struct bgpevpn *vpn, int type,
|
||||
{
|
||||
struct bgp_node *rn;
|
||||
struct bgp_info *ri;
|
||||
struct bgp_table *table;
|
||||
int header = 1;
|
||||
uint64_t tbl_ver;
|
||||
uint32_t prefix_cnt, path_cnt;
|
||||
|
||||
prefix_cnt = path_cnt = 0;
|
||||
|
||||
for (rn = bgp_table_top(vpn->route_table); rn;
|
||||
table = vpn->route_table;
|
||||
tbl_ver = table->version;
|
||||
for (rn = bgp_table_top(table); rn;
|
||||
rn = bgp_route_next(rn)) {
|
||||
struct prefix_evpn *evp = (struct prefix_evpn *)&rn->p;
|
||||
int add_prefix_to_json = 0;
|
||||
@ -519,7 +522,8 @@ static void show_vni_routes(struct bgp *bgp, struct bgpevpn *vpn, int type,
|
||||
if (rn->info) {
|
||||
/* Overall header/legend displayed once. */
|
||||
if (header) {
|
||||
bgp_evpn_show_route_header(vty, bgp, json);
|
||||
bgp_evpn_show_route_header(vty, bgp,
|
||||
tbl_ver, json);
|
||||
header = 0;
|
||||
}
|
||||
|
||||
@ -603,9 +607,9 @@ static void show_vni_routes_hash(struct hash_backet *backet, void *arg)
|
||||
static void show_l3vni_entry(struct vty *vty, struct bgp *bgp,
|
||||
json_object *json)
|
||||
{
|
||||
json_object *json_vni;
|
||||
json_object *json_import_rtl;
|
||||
json_object *json_export_rtl;
|
||||
json_object *json_vni = NULL;
|
||||
json_object *json_import_rtl = NULL;
|
||||
json_object *json_export_rtl = NULL;
|
||||
char buf1[10];
|
||||
char buf2[INET6_ADDRSTRLEN];
|
||||
char rt_buf[25];
|
||||
@ -862,6 +866,8 @@ static int bgp_show_ethernet_vpn(struct vty *vty, struct prefix_rd *prd,
|
||||
|
||||
for (rn = bgp_table_top(bgp->rib[afi][SAFI_EVPN]); rn;
|
||||
rn = bgp_route_next(rn)) {
|
||||
uint64_t tbl_ver;
|
||||
|
||||
if (use_json)
|
||||
continue; /* XXX json TODO */
|
||||
|
||||
@ -872,6 +878,7 @@ static int bgp_show_ethernet_vpn(struct vty *vty, struct prefix_rd *prd,
|
||||
continue;
|
||||
|
||||
rd_header = 1;
|
||||
tbl_ver = table->version;
|
||||
|
||||
for (rm = bgp_table_top(table); rm; rm = bgp_route_next(rm))
|
||||
for (ri = rm->info; ri; ri = ri->next) {
|
||||
@ -891,7 +898,7 @@ static int bgp_show_ethernet_vpn(struct vty *vty, struct prefix_rd *prd,
|
||||
json_object_int_add(
|
||||
json,
|
||||
"bgpTableVersion",
|
||||
0);
|
||||
tbl_ver);
|
||||
json_object_string_add(
|
||||
json,
|
||||
"bgpLocalRouterId",
|
||||
@ -917,7 +924,8 @@ static int bgp_show_ethernet_vpn(struct vty *vty, struct prefix_rd *prd,
|
||||
V4_HEADER_OVERLAY);
|
||||
else {
|
||||
vty_out(vty,
|
||||
"BGP table version is 0, local router ID is %s\n",
|
||||
"BGP table version is %" PRIu64 ", local router ID is %s\n",
|
||||
tbl_ver,
|
||||
inet_ntoa(
|
||||
bgp->router_id));
|
||||
vty_out(vty,
|
||||
@ -2201,11 +2209,13 @@ static void evpn_show_all_routes(struct vty *vty, struct bgp *bgp, int type,
|
||||
char rd_str[RD_ADDRSTRLEN];
|
||||
json_object *json_rd = NULL; /* contains routes for an RD */
|
||||
int add_rd_to_json = 0;
|
||||
uint64_t tbl_ver;
|
||||
|
||||
table = (struct bgp_table *)rd_rn->info;
|
||||
if (table == NULL)
|
||||
continue;
|
||||
|
||||
tbl_ver = table->version;
|
||||
prefix_rd2str((struct prefix_rd *)&rd_rn->p, rd_str,
|
||||
sizeof(rd_str));
|
||||
|
||||
@ -2236,6 +2246,7 @@ static void evpn_show_all_routes(struct vty *vty, struct bgp *bgp, int type,
|
||||
/* Overall header/legend displayed once. */
|
||||
if (header) {
|
||||
bgp_evpn_show_route_header(vty, bgp,
|
||||
tbl_ver,
|
||||
json);
|
||||
header = 0;
|
||||
}
|
||||
@ -2873,7 +2884,7 @@ DEFUN (no_bgp_evpn_advertise_type5,
|
||||
if (CHECK_FLAG(bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN],
|
||||
BGP_L2VPN_EVPN_ADVERTISE_IPV6_UNICAST)) {
|
||||
bgp_evpn_withdraw_type5_routes(bgp_vrf, afi, safi);
|
||||
UNSET_FLAG(bgp_vrf->vrf_flags,
|
||||
UNSET_FLAG(bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN],
|
||||
BGP_L2VPN_EVPN_ADVERTISE_IPV6_UNICAST);
|
||||
}
|
||||
}
|
||||
@ -4382,12 +4393,22 @@ void bgp_config_write_evpn_info(struct vty *vty, struct bgp *bgp, afi_t afi,
|
||||
vty_out(vty, " advertise-default-gw\n");
|
||||
|
||||
if (CHECK_FLAG(bgp->af_flags[AFI_L2VPN][SAFI_EVPN],
|
||||
BGP_L2VPN_EVPN_ADVERTISE_IPV4_UNICAST))
|
||||
BGP_L2VPN_EVPN_ADVERTISE_IPV4_UNICAST)) {
|
||||
if (bgp->adv_cmd_rmap[AFI_IP][SAFI_UNICAST].name)
|
||||
vty_out(vty, " advertise ipv4 unicast route-map %s\n",
|
||||
bgp->adv_cmd_rmap[AFI_IP][SAFI_UNICAST].name);
|
||||
else
|
||||
vty_out(vty, " advertise ipv4 unicast\n");
|
||||
}
|
||||
|
||||
if (CHECK_FLAG(bgp->af_flags[AFI_L2VPN][SAFI_EVPN],
|
||||
BGP_L2VPN_EVPN_ADVERTISE_IPV6_UNICAST))
|
||||
BGP_L2VPN_EVPN_ADVERTISE_IPV6_UNICAST)) {
|
||||
if (bgp->adv_cmd_rmap[AFI_IP6][SAFI_UNICAST].name)
|
||||
vty_out(vty, " advertise ipv6 unicast route-map %s\n",
|
||||
bgp->adv_cmd_rmap[AFI_IP6][SAFI_UNICAST].name);
|
||||
else
|
||||
vty_out(vty, " advertise ipv6 unicast\n");
|
||||
}
|
||||
|
||||
if (CHECK_FLAG(bgp->af_flags[AFI_L2VPN][SAFI_EVPN],
|
||||
BGP_L2VPN_EVPN_DEFAULT_ORIGINATE_IPV4))
|
||||
|
@ -1336,6 +1336,8 @@ static void subgroup_announce_reset_nhop(uint8_t family, struct attr *attr)
|
||||
}
|
||||
if (family == AF_INET6)
|
||||
memset(&attr->mp_nexthop_global, 0, IPV6_MAX_BYTELEN);
|
||||
if (family == AF_EVPN)
|
||||
memset(&attr->mp_nexthop_global_in, 0, BGP_ATTR_NHLEN_IPV4);
|
||||
}
|
||||
|
||||
int subgroup_announce_check(struct bgp_node *rn, struct bgp_info *ri,
|
||||
@ -2336,10 +2338,18 @@ static void bgp_process_main_one(struct bgp *bgp, struct bgp_node *rn,
|
||||
if (new_select && new_select->type == ZEBRA_ROUTE_BGP
|
||||
&& (new_select->sub_type == BGP_ROUTE_NORMAL
|
||||
|| new_select->sub_type == BGP_ROUTE_AGGREGATE
|
||||
|| new_select->sub_type == BGP_ROUTE_IMPORTED))
|
||||
|| new_select->sub_type == BGP_ROUTE_IMPORTED)) {
|
||||
|
||||
/* if this is an evpn imported type-5 prefix,
|
||||
* we need to withdraw the route first to clear
|
||||
* the nh neigh and the RMAC entry.
|
||||
*/
|
||||
if (old_select &&
|
||||
is_route_parent_evpn(old_select))
|
||||
bgp_zebra_withdraw(p, old_select, bgp, safi);
|
||||
|
||||
bgp_zebra_announce(rn, p, new_select, bgp, afi, safi);
|
||||
else {
|
||||
} else {
|
||||
/* Withdraw the route from the kernel. */
|
||||
if (old_select && old_select->type == ZEBRA_ROUTE_BGP
|
||||
&& (old_select->sub_type == BGP_ROUTE_NORMAL
|
||||
@ -2353,11 +2363,27 @@ static void bgp_process_main_one(struct bgp *bgp, struct bgp_node *rn,
|
||||
/* advertise/withdraw type-5 routes */
|
||||
if ((afi == AFI_IP || afi == AFI_IP6) && (safi == SAFI_UNICAST)) {
|
||||
if (advertise_type5_routes(bgp, afi) && new_select &&
|
||||
(!new_select->extra || !new_select->extra->parent))
|
||||
bgp_evpn_advertise_type5_route(bgp, &rn->p,
|
||||
(!new_select->extra || !new_select->extra->parent)) {
|
||||
|
||||
/* apply the route-map */
|
||||
if (bgp->adv_cmd_rmap[afi][safi].map) {
|
||||
int ret = 0;
|
||||
|
||||
ret = route_map_apply(
|
||||
bgp->adv_cmd_rmap[afi][safi].map,
|
||||
&rn->p, RMAP_BGP, new_select);
|
||||
if (ret == RMAP_MATCH)
|
||||
bgp_evpn_advertise_type5_route(
|
||||
bgp, &rn->p, new_select->attr,
|
||||
afi, safi);
|
||||
} else {
|
||||
bgp_evpn_advertise_type5_route(bgp,
|
||||
&rn->p,
|
||||
new_select->attr,
|
||||
afi, safi);
|
||||
else if (advertise_type5_routes(bgp, afi) && old_select &&
|
||||
|
||||
}
|
||||
} else if (advertise_type5_routes(bgp, afi) && old_select &&
|
||||
(!old_select->extra || !old_select->extra->parent))
|
||||
bgp_evpn_withdraw_type5_route(bgp, &rn->p, afi, safi);
|
||||
}
|
||||
|
@ -467,13 +467,12 @@ struct stream *bpacket_reformat_for_peer(struct bpacket *pkt,
|
||||
nh_modified = 1;
|
||||
} else if (
|
||||
peer->sort == BGP_PEER_EBGP
|
||||
&& paf->safi != SAFI_EVPN
|
||||
&& (bgp_multiaccess_check_v4(v4nh, peer) == 0)
|
||||
&& !CHECK_FLAG(
|
||||
vec->flags,
|
||||
BPKT_ATTRVEC_FLAGS_RMAP_NH_UNCHANGED)
|
||||
&& !peer_af_flag_check(
|
||||
peer, nhafi, paf->safi,
|
||||
peer, paf->afi, paf->safi,
|
||||
PEER_FLAG_NEXTHOP_UNCHANGED)) {
|
||||
/* NOTE: not handling case where NH has new AFI
|
||||
*/
|
||||
|
@ -12587,6 +12587,8 @@ void bgp_vty_init(void)
|
||||
install_element(BGP_VPNV4_NODE, &no_neighbor_nexthop_self_cmd);
|
||||
install_element(BGP_VPNV6_NODE, &neighbor_nexthop_self_cmd);
|
||||
install_element(BGP_VPNV6_NODE, &no_neighbor_nexthop_self_cmd);
|
||||
install_element(BGP_EVPN_NODE, &neighbor_nexthop_self_cmd);
|
||||
install_element(BGP_EVPN_NODE, &no_neighbor_nexthop_self_cmd);
|
||||
|
||||
/* "neighbor next-hop-self force" commands. */
|
||||
install_element(BGP_NODE, &neighbor_nexthop_self_force_hidden_cmd);
|
||||
|
@ -1287,17 +1287,11 @@ void bgp_zebra_announce(struct bgp_node *rn, struct prefix *p,
|
||||
}
|
||||
}
|
||||
|
||||
if (bgp->table_map[afi][safi].name || nh_othervrf) {
|
||||
if (bgp->table_map[afi][safi].name) {
|
||||
/* Copy info and attributes, so the route-map
|
||||
apply doesn't modify the BGP route info. */
|
||||
local_attr = *mpinfo->attr;
|
||||
mpinfo_cp->attr = &local_attr;
|
||||
if (nh_othervrf) {
|
||||
/* allow route-map to modify */
|
||||
local_attr.nexthop =
|
||||
info->extra->nexthop_orig.u
|
||||
.prefix4;
|
||||
}
|
||||
}
|
||||
|
||||
if (bgp->table_map[afi][safi].name) {
|
||||
@ -1322,19 +1316,11 @@ void bgp_zebra_announce(struct bgp_node *rn, struct prefix *p,
|
||||
ifindex_t ifindex;
|
||||
struct in6_addr *nexthop;
|
||||
|
||||
if (bgp->table_map[afi][safi].name || nh_othervrf) {
|
||||
if (bgp->table_map[afi][safi].name) {
|
||||
/* Copy info and attributes, so the route-map
|
||||
apply doesn't modify the BGP route info. */
|
||||
local_attr = *mpinfo->attr;
|
||||
mpinfo_cp->attr = &local_attr;
|
||||
if (nh_othervrf) {
|
||||
/* allow route-map to modify */
|
||||
local_attr.mp_nexthop_global =
|
||||
info->extra->nexthop_orig.u
|
||||
.prefix6;
|
||||
local_attr.mp_nexthop_len =
|
||||
BGP_ATTR_NHLEN_IPV6_GLOBAL;
|
||||
}
|
||||
}
|
||||
|
||||
if (bgp->table_map[afi][safi].name) {
|
||||
@ -1913,7 +1899,7 @@ int bgp_zebra_advertise_gw_macip(struct bgp *bgp, int advertise, vni_t vni)
|
||||
|
||||
zclient_create_header(s, ZEBRA_ADVERTISE_DEFAULT_GW, bgp->vrf_id);
|
||||
stream_putc(s, advertise);
|
||||
stream_put3(s, vni);
|
||||
stream_putl(s, vni);
|
||||
stream_putw_at(s, 0, stream_get_endp(s));
|
||||
|
||||
return zclient_send_message(zclient);
|
||||
|
38
bgpd/bgpd.c
38
bgpd/bgpd.c
@ -1174,6 +1174,11 @@ struct peer *peer_new(struct bgp *bgp)
|
||||
}
|
||||
peer->orf_plist[afi][safi] = NULL;
|
||||
}
|
||||
|
||||
/* set nexthop-unchanged for l2vpn evpn by default */
|
||||
SET_FLAG(peer->af_flags[AFI_L2VPN][SAFI_EVPN],
|
||||
PEER_FLAG_NEXTHOP_UNCHANGED);
|
||||
|
||||
SET_FLAG(peer->sflags, PEER_STATUS_CAPABILITY_OPEN);
|
||||
|
||||
/* Create buffers. */
|
||||
@ -4072,6 +4077,35 @@ static int peer_af_flag_modify(struct peer *peer, afi_t afi, safi_t safi,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* For EVPN we implicitly set the NEXTHOP_UNCHANGED flag,
|
||||
* if we are setting/unsetting flags which conflict with this flag
|
||||
* handle accordingly
|
||||
*/
|
||||
if (afi == AFI_L2VPN && safi == SAFI_EVPN) {
|
||||
if (set) {
|
||||
|
||||
/*
|
||||
* if we are setting NEXTHOP_SELF, we need to unset the
|
||||
* NEXTHOP_UNCHANGED flag
|
||||
*/
|
||||
if (CHECK_FLAG(flag, PEER_FLAG_NEXTHOP_SELF) ||
|
||||
CHECK_FLAG(flag, PEER_FLAG_FORCE_NEXTHOP_SELF))
|
||||
UNSET_FLAG(peer->af_flags[afi][safi],
|
||||
PEER_FLAG_NEXTHOP_UNCHANGED);
|
||||
} else {
|
||||
|
||||
/*
|
||||
* if we are unsetting NEXTHOP_SELF, we need to set the
|
||||
* NEXTHOP_UNCHANGED flag to reset the defaults for EVPN
|
||||
*/
|
||||
if (CHECK_FLAG(flag, PEER_FLAG_NEXTHOP_SELF) ||
|
||||
CHECK_FLAG(flag, PEER_FLAG_FORCE_NEXTHOP_SELF))
|
||||
SET_FLAG(peer->af_flags[afi][safi],
|
||||
PEER_FLAG_NEXTHOP_UNCHANGED);
|
||||
}
|
||||
}
|
||||
|
||||
if (set)
|
||||
SET_FLAG(peer->af_flags[afi][safi], flag);
|
||||
else
|
||||
@ -7133,7 +7167,9 @@ static void bgp_config_write_peer_af(struct vty *vty, struct bgp *bgp,
|
||||
|
||||
/* atribute-unchanged. */
|
||||
if (peer_af_flag_check(peer, afi, safi, PEER_FLAG_AS_PATH_UNCHANGED)
|
||||
|| peer_af_flag_check(peer, afi, safi, PEER_FLAG_NEXTHOP_UNCHANGED)
|
||||
|| (safi != SAFI_EVPN
|
||||
&& peer_af_flag_check(peer, afi, safi,
|
||||
PEER_FLAG_NEXTHOP_UNCHANGED))
|
||||
|| peer_af_flag_check(peer, afi, safi, PEER_FLAG_MED_UNCHANGED)) {
|
||||
|
||||
if (!peer_group_active(peer)
|
||||
|
@ -57,7 +57,7 @@ against incoming packets. If matched the nexthop-group or nexthop
|
||||
is used to forward the packets to the end destination
|
||||
|
||||
.. index:: pbr-map
|
||||
.. clicmd:: pbr-map NAME seq (1-1000)
|
||||
.. clicmd:: pbr-map NAME seq (1-700)
|
||||
|
||||
Create a pbr-map with NAME and sequence number specified. This command puts
|
||||
you into a new submode for pbr-map specification. To exit this mode type
|
||||
|
@ -85,6 +85,7 @@ const char *node_names[] = {
|
||||
"keychain", // KEYCHAIN_NODE,
|
||||
"keychain key", // KEYCHAIN_KEY_NODE,
|
||||
"logical-router", // LOGICALROUTER_NODE,
|
||||
"static ip", // IP_NODE,
|
||||
"vrf", // VRF_NODE,
|
||||
"interface", // INTERFACE_NODE,
|
||||
"nexthop-group", // NH_GROUP_NODE,
|
||||
@ -119,7 +120,6 @@ const char *node_names[] = {
|
||||
"ldp l2vpn", // LDP_L2VPN_NODE,
|
||||
"ldp", // LDP_PSEUDOWIRE_NODE,
|
||||
"isis", // ISIS_NODE,
|
||||
"static ip", // IP_NODE,
|
||||
"ipv4 access list", // ACCESS_NODE,
|
||||
"ipv4 prefix list", // PREFIX_NODE,
|
||||
"ipv6 access list", // ACCESS_IPV6_NODE,
|
||||
@ -529,9 +529,17 @@ static int config_write_host(struct vty *vty)
|
||||
if (cmd_domainname_get())
|
||||
vty_out(vty, "domainname %s\n", cmd_domainname_get());
|
||||
|
||||
/* The following are all configuration commands that are not sent to
|
||||
* watchfrr. For instance watchfrr is hardcoded to log to syslog so
|
||||
* we would always display 'log syslog informational' in the config
|
||||
* which would cause other daemons to then switch to syslog when they
|
||||
* parse frr.conf.
|
||||
*/
|
||||
if (strcmp(zlog_default->protoname, "WATCHFRR")) {
|
||||
if (host.encrypt) {
|
||||
if (host.password_encrypt)
|
||||
vty_out(vty, "password 8 %s\n", host.password_encrypt);
|
||||
vty_out(vty, "password 8 %s\n",
|
||||
host.password_encrypt);
|
||||
if (host.enable_encrypt)
|
||||
vty_out(vty, "enable password 8 %s\n",
|
||||
host.enable_encrypt);
|
||||
@ -539,23 +547,27 @@ static int config_write_host(struct vty *vty)
|
||||
if (host.password)
|
||||
vty_out(vty, "password %s\n", host.password);
|
||||
if (host.enable)
|
||||
vty_out(vty, "enable password %s\n", host.enable);
|
||||
vty_out(vty, "enable password %s\n",
|
||||
host.enable);
|
||||
}
|
||||
|
||||
if (zlog_default->default_lvl != LOG_DEBUG) {
|
||||
vty_out(vty, "! N.B. The 'log trap' command is deprecated.\n");
|
||||
vty_out(vty,
|
||||
"! N.B. The 'log trap' command is deprecated.\n");
|
||||
vty_out(vty, "log trap %s\n",
|
||||
zlog_priority[zlog_default->default_lvl]);
|
||||
}
|
||||
|
||||
if (host.logfile
|
||||
&& (zlog_default->maxlvl[ZLOG_DEST_FILE] != ZLOG_DISABLED)) {
|
||||
&& (zlog_default->maxlvl[ZLOG_DEST_FILE]
|
||||
!= ZLOG_DISABLED)) {
|
||||
vty_out(vty, "log file %s", host.logfile);
|
||||
if (zlog_default->maxlvl[ZLOG_DEST_FILE]
|
||||
!= zlog_default->default_lvl)
|
||||
vty_out(vty, " %s",
|
||||
zlog_priority
|
||||
[zlog_default->maxlvl[ZLOG_DEST_FILE]]);
|
||||
[zlog_default->maxlvl
|
||||
[ZLOG_DEST_FILE]]);
|
||||
vty_out(vty, "\n");
|
||||
}
|
||||
|
||||
@ -564,7 +576,8 @@ static int config_write_host(struct vty *vty)
|
||||
if (zlog_default->maxlvl[ZLOG_DEST_STDOUT]
|
||||
!= zlog_default->default_lvl)
|
||||
vty_out(vty, " %s",
|
||||
zlog_priority[zlog_default->maxlvl
|
||||
zlog_priority
|
||||
[zlog_default->maxlvl
|
||||
[ZLOG_DEST_STDOUT]]);
|
||||
vty_out(vty, "\n");
|
||||
}
|
||||
@ -574,7 +587,8 @@ static int config_write_host(struct vty *vty)
|
||||
else if (zlog_default->maxlvl[ZLOG_DEST_MONITOR]
|
||||
!= zlog_default->default_lvl)
|
||||
vty_out(vty, "log monitor %s\n",
|
||||
zlog_priority[zlog_default->maxlvl[ZLOG_DEST_MONITOR]]);
|
||||
zlog_priority[zlog_default->maxlvl
|
||||
[ZLOG_DEST_MONITOR]]);
|
||||
|
||||
if (zlog_default->maxlvl[ZLOG_DEST_SYSLOG] != ZLOG_DISABLED) {
|
||||
vty_out(vty, "log syslog");
|
||||
@ -604,12 +618,14 @@ static int config_write_host(struct vty *vty)
|
||||
vty_out(vty, "service password-encryption\n");
|
||||
|
||||
if (host.lines >= 0)
|
||||
vty_out(vty, "service terminal-length %d\n", host.lines);
|
||||
vty_out(vty, "service terminal-length %d\n",
|
||||
host.lines);
|
||||
|
||||
if (host.motdfile)
|
||||
vty_out(vty, "banner motd file %s\n", host.motdfile);
|
||||
else if (!host.motd)
|
||||
vty_out(vty, "no banner motd\n");
|
||||
}
|
||||
|
||||
if (debug_memstats_at_exit)
|
||||
vty_out(vty, "!\ndebug memstats-at-exit\n");
|
||||
@ -2346,7 +2362,7 @@ static int set_log_file(struct vty *vty, const char *fname, int loglevel)
|
||||
|
||||
#if defined(HAVE_CUMULUS)
|
||||
if (zlog_default->maxlvl[ZLOG_DEST_SYSLOG] != ZLOG_DISABLED)
|
||||
zlog_default->maxlvl[ZLOG_DEST_SYSLOG] = ZLOG_DISABLED;
|
||||
zlog_set_level(ZLOG_DEST_SYSLOG, ZLOG_DISABLED);
|
||||
#endif
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
@ -2372,6 +2388,16 @@ DEFUN (config_log_file,
|
||||
zlog_default->default_lvl);
|
||||
}
|
||||
|
||||
static void disable_log_file(void)
|
||||
{
|
||||
zlog_reset_file();
|
||||
|
||||
if (host.logfile)
|
||||
XFREE(MTYPE_HOST, host.logfile);
|
||||
|
||||
host.logfile = NULL;
|
||||
}
|
||||
|
||||
DEFUN (no_config_log_file,
|
||||
no_config_log_file_cmd,
|
||||
"no log file [FILENAME [LEVEL]]",
|
||||
@ -2381,13 +2407,7 @@ DEFUN (no_config_log_file,
|
||||
"Logging file name\n"
|
||||
"Logging level\n")
|
||||
{
|
||||
zlog_reset_file();
|
||||
|
||||
if (host.logfile)
|
||||
XFREE(MTYPE_HOST, host.logfile);
|
||||
|
||||
host.logfile = NULL;
|
||||
|
||||
disable_log_file();
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
@ -2399,6 +2419,9 @@ DEFUN (config_log_syslog,
|
||||
LOG_LEVEL_DESC)
|
||||
{
|
||||
int idx_log_levels = 2;
|
||||
|
||||
disable_log_file();
|
||||
|
||||
if (argc == 3) {
|
||||
int level;
|
||||
if ((level = level_match(argv[idx_log_levels]->arg))
|
||||
|
@ -85,6 +85,7 @@ enum node_type {
|
||||
KEYCHAIN_NODE, /* Key-chain node. */
|
||||
KEYCHAIN_KEY_NODE, /* Key-chain key node. */
|
||||
LOGICALROUTER_NODE, /* Logical-Router node. */
|
||||
IP_NODE, /* Static ip route node. */
|
||||
VRF_NODE, /* VRF mode node. */
|
||||
INTERFACE_NODE, /* Interface mode node. */
|
||||
NH_GROUP_NODE, /* Nexthop-Group mode node. */
|
||||
@ -119,7 +120,6 @@ enum node_type {
|
||||
LDP_L2VPN_NODE, /* LDP L2VPN node */
|
||||
LDP_PSEUDOWIRE_NODE, /* LDP Pseudowire node */
|
||||
ISIS_NODE, /* ISIS protocol mode */
|
||||
IP_NODE, /* Static ip route node. */
|
||||
ACCESS_NODE, /* Access list node. */
|
||||
PREFIX_NODE, /* Prefix list node. */
|
||||
ACCESS_IPV6_NODE, /* Access list node. */
|
||||
|
10
lib/ipaddr.h
10
lib/ipaddr.h
@ -102,4 +102,14 @@ static inline void ipv4_to_ipv4_mapped_ipv6(struct in6_addr *in6,
|
||||
memcpy((char *)in6 + 12, &in, sizeof(struct in_addr));
|
||||
}
|
||||
|
||||
/*
|
||||
* convert an ipv4 mapped ipv6 address back to ipv4 address
|
||||
*/
|
||||
static inline void ipv4_mapped_ipv6_to_ipv4(struct in6_addr *in6,
|
||||
struct in_addr *in)
|
||||
{
|
||||
memset(in, 0, sizeof(struct in_addr));
|
||||
memcpy(in, (char *)in6 + 12, sizeof(struct in_addr));
|
||||
}
|
||||
|
||||
#endif /* __IPADDR_H__ */
|
||||
|
@ -38,7 +38,7 @@
|
||||
#include "pbrd/pbr_vty_clippy.c"
|
||||
#endif
|
||||
|
||||
DEFUN_NOSH(pbr_map, pbr_map_cmd, "pbr-map WORD seq (1-1000)",
|
||||
DEFUN_NOSH(pbr_map, pbr_map_cmd, "pbr-map WORD seq (1-700)",
|
||||
"Create pbr-map or enter pbr-map command mode\n"
|
||||
"The name of the PBR MAP\n"
|
||||
"Sequence to insert in existing pbr-map entry\n"
|
||||
@ -54,7 +54,7 @@ DEFUN_NOSH(pbr_map, pbr_map_cmd, "pbr-map WORD seq (1-1000)",
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
DEFUN_NOSH(no_pbr_map, no_pbr_map_cmd, "no pbr-map WORD [seq (1-65535)]",
|
||||
DEFUN_NOSH(no_pbr_map, no_pbr_map_cmd, "no pbr-map WORD [seq (1-700)]",
|
||||
NO_STR
|
||||
"Delete pbr-map\n"
|
||||
"The name of the PBR MAP\n"
|
||||
|
@ -1537,7 +1537,7 @@ DEFUNSH(VTYSH_RMAP, vtysh_route_map, vtysh_route_map_cmd,
|
||||
}
|
||||
|
||||
DEFUNSH(VTYSH_PBRD, vtysh_pbr_map, vtysh_pbr_map_cmd,
|
||||
"pbr-map NAME seq (1-1000)",
|
||||
"pbr-map NAME seq (1-700)",
|
||||
"Create pbr-map or enter pbr-map command mode\n"
|
||||
"The name of the PBR MAP\n"
|
||||
"Sequence to insert to/delete from existing pbr-map entry\n"
|
||||
@ -1547,7 +1547,7 @@ DEFUNSH(VTYSH_PBRD, vtysh_pbr_map, vtysh_pbr_map_cmd,
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
DEFSH(VTYSH_PBRD, vtysh_no_pbr_map_cmd, "no pbr-map WORD [seq (1-65535)]",
|
||||
DEFSH(VTYSH_PBRD, vtysh_no_pbr_map_cmd, "no pbr-map WORD [seq (1-700)]",
|
||||
NO_STR
|
||||
"Delete pbr-map\n"
|
||||
"The name of the PBR MAP\n"
|
||||
|
@ -1224,8 +1224,13 @@ static void if_dump_vty(struct vty *vty, struct interface *ifp)
|
||||
br_slave->bridge_ifindex);
|
||||
}
|
||||
|
||||
if (zebra_if->link_ifindex != IFINDEX_INTERNAL)
|
||||
vty_out(vty, " Link ifindex %u\n", zebra_if->link_ifindex);
|
||||
if (zebra_if->link_ifindex != IFINDEX_INTERNAL) {
|
||||
vty_out(vty, " Link ifindex %u", zebra_if->link_ifindex);
|
||||
if (zebra_if->link)
|
||||
vty_out(vty, "(%s)\n", zebra_if->link->name);
|
||||
else
|
||||
vty_out(vty, "(Unknown)\n");
|
||||
}
|
||||
|
||||
if (HAS_LINK_PARAMS(ifp)) {
|
||||
int i;
|
||||
|
@ -463,7 +463,7 @@ int netlink_parse_info(int (*filter)(struct sockaddr_nl *, struct nlmsghdr *,
|
||||
int read_in = 0;
|
||||
|
||||
while (1) {
|
||||
char buf[NL_PKT_BUF_SIZE];
|
||||
char buf[NL_RCV_PKT_BUF_SIZE];
|
||||
struct iovec iov = {.iov_base = buf, .iov_len = sizeof buf};
|
||||
struct sockaddr_nl snl;
|
||||
struct msghdr msg = {.msg_name = (void *)&snl,
|
||||
|
@ -23,6 +23,7 @@
|
||||
|
||||
#ifdef HAVE_NETLINK
|
||||
|
||||
#define NL_RCV_PKT_BUF_SIZE 32768
|
||||
#define NL_PKT_BUF_SIZE 8192
|
||||
|
||||
extern void netlink_parse_rtattr(struct rtattr **tb, int max,
|
||||
|
@ -1233,14 +1233,6 @@ static void _netlink_route_build_multipath(const char *routedesc, int bytelen,
|
||||
"netlink_route_multipath() (%s): "
|
||||
"nexthop via if %u",
|
||||
routedesc, nexthop->ifindex);
|
||||
} else if (nexthop->type == NEXTHOP_TYPE_IPV6_IFINDEX) {
|
||||
if (IS_ZEBRA_DEBUG_KERNEL)
|
||||
zlog_debug(
|
||||
"netlink_route_multipath() (%s): "
|
||||
"nexthop via if %u",
|
||||
routedesc, nexthop->ifindex);
|
||||
} else {
|
||||
rtnh->rtnh_ifindex = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -298,6 +298,9 @@ DEFUN (zebra_ptm_enable_if,
|
||||
int old_ptm_enable;
|
||||
int send_linkdown = 0;
|
||||
|
||||
if_data = ifp->info;
|
||||
if_data->ptm_enable = ZEBRA_IF_PTM_ENABLE_UNSPEC;
|
||||
|
||||
if (ifp->ifindex == IFINDEX_INTERNAL) {
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
@ -317,9 +320,6 @@ DEFUN (zebra_ptm_enable_if,
|
||||
}
|
||||
}
|
||||
|
||||
if_data = ifp->info;
|
||||
if_data->ptm_enable = ZEBRA_IF_PTM_ENABLE_UNSPEC;
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -2798,12 +2798,14 @@ DEFUN (vrf_vni_mapping,
|
||||
|
||||
DEFUN (no_vrf_vni_mapping,
|
||||
no_vrf_vni_mapping_cmd,
|
||||
"no vni " CMD_VNI_RANGE,
|
||||
"no vni " CMD_VNI_RANGE "[prefix-routes-only]",
|
||||
NO_STR
|
||||
"VNI corresponding to tenant VRF\n"
|
||||
"VNI-ID")
|
||||
"VNI-ID\n"
|
||||
"prefix-routes-only\n")
|
||||
{
|
||||
int ret = 0;
|
||||
int filter = 0;
|
||||
char err[ERR_STR_SZ];
|
||||
vni_t vni = strtoul(argv[2]->arg, NULL, 10);
|
||||
|
||||
@ -2812,7 +2814,11 @@ DEFUN (no_vrf_vni_mapping,
|
||||
assert(vrf);
|
||||
assert(zvrf);
|
||||
|
||||
ret = zebra_vxlan_process_vrf_vni_cmd(zvrf, vni, err, ERR_STR_SZ, 0, 0);
|
||||
if (argc == 4)
|
||||
filter = 1;
|
||||
|
||||
ret = zebra_vxlan_process_vrf_vni_cmd(zvrf, vni, err,
|
||||
ERR_STR_SZ, filter, 0);
|
||||
if (ret != 0) {
|
||||
vty_out(vty, "%s\n", err);
|
||||
return CMD_WARNING;
|
||||
|
@ -3943,16 +3943,37 @@ void zebra_vxlan_evpn_vrf_route_add(vrf_id_t vrf_id, struct ethaddr *rmac,
|
||||
struct prefix *host_prefix)
|
||||
{
|
||||
zebra_l3vni_t *zl3vni = NULL;
|
||||
struct ipaddr ipv4_vtep;
|
||||
|
||||
zl3vni = zl3vni_from_vrf(vrf_id);
|
||||
if (!zl3vni || !is_l3vni_oper_up(zl3vni))
|
||||
return;
|
||||
|
||||
/* add the next hop neighbor */
|
||||
/*
|
||||
* add the next hop neighbor -
|
||||
* neigh to be installed is the ipv6 nexthop neigh
|
||||
*/
|
||||
zl3vni_remote_nh_add(zl3vni, vtep_ip, rmac, host_prefix);
|
||||
|
||||
/* add the rmac */
|
||||
zl3vni_remote_rmac_add(zl3vni, rmac, vtep_ip, host_prefix);
|
||||
/*
|
||||
* if the remote vtep is a ipv4 mapped ipv6 address convert it to ipv4
|
||||
* address. Rmac is programmed against the ipv4 vtep because we only
|
||||
* support ipv4 tunnels in the h/w right now
|
||||
*/
|
||||
memset(&ipv4_vtep, 0, sizeof(struct ipaddr));
|
||||
ipv4_vtep.ipa_type = IPADDR_V4;
|
||||
if (vtep_ip->ipa_type == IPADDR_V6)
|
||||
ipv4_mapped_ipv6_to_ipv4(&vtep_ip->ipaddr_v6,
|
||||
&(ipv4_vtep.ipaddr_v4));
|
||||
else
|
||||
memcpy(&(ipv4_vtep.ipaddr_v4), &vtep_ip->ipaddr_v4,
|
||||
sizeof(struct in_addr));
|
||||
|
||||
/*
|
||||
* add the rmac - remote rmac to be installed is against the ipv4
|
||||
* nexthop address
|
||||
*/
|
||||
zl3vni_remote_rmac_add(zl3vni, rmac, &ipv4_vtep, host_prefix);
|
||||
}
|
||||
|
||||
/* handle evpn vrf route delete */
|
||||
@ -5138,7 +5159,7 @@ void zebra_vxlan_remote_macip_add(ZAPI_HANDLER_ARGS)
|
||||
l += IPV4_MAX_BYTELEN;
|
||||
|
||||
/* Get flags - sticky mac and/or gateway mac */
|
||||
flags = stream_getc(s);
|
||||
STREAM_GETC(s, flags);
|
||||
sticky = CHECK_FLAG(flags, ZEBRA_MACIP_TYPE_STICKY);
|
||||
l++;
|
||||
|
||||
@ -6511,6 +6532,12 @@ int zebra_vxlan_process_vrf_vni_cmd(struct zebra_vrf *zvrf, vni_t vni,
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (filter && !CHECK_FLAG(zl3vni->filter, PREFIX_ROUTES_ONLY)) {
|
||||
snprintf(err, ERR_STR_SZ,
|
||||
"prefix-routes-only is not set for the vni");
|
||||
return -1;
|
||||
}
|
||||
|
||||
zebra_vxlan_process_l3vni_oper_down(zl3vni);
|
||||
|
||||
/* delete and uninstall all rmacs */
|
||||
@ -6597,7 +6624,7 @@ void zebra_vxlan_advertise_subnet(ZAPI_HANDLER_ARGS)
|
||||
}
|
||||
|
||||
s = msg;
|
||||
advertise = stream_getc(s);
|
||||
STREAM_GETC(s, advertise);
|
||||
vni = stream_get3(s);
|
||||
|
||||
zvni = zvni_lookup(vni);
|
||||
@ -6636,6 +6663,9 @@ void zebra_vxlan_advertise_subnet(ZAPI_HANDLER_ARGS)
|
||||
zvni_advertise_subnet(zvni, vlan_if, 1);
|
||||
else
|
||||
zvni_advertise_subnet(zvni, vlan_if, 0);
|
||||
|
||||
stream_failure:
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -6658,7 +6688,7 @@ void zebra_vxlan_advertise_gw_macip(ZAPI_HANDLER_ARGS)
|
||||
|
||||
s = msg;
|
||||
STREAM_GETC(s, advertise);
|
||||
STREAM_GET(&vni, s, 3);
|
||||
STREAM_GETL(s, vni);
|
||||
|
||||
if (!vni) {
|
||||
if (IS_ZEBRA_DEBUG_VXLAN)
|
||||
|
Loading…
Reference in New Issue
Block a user