summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bgpd/bgp_route.c5
-rw-r--r--doc/developer/zebra.rst6
-rw-r--r--isisd/isis_zebra.c4
-rw-r--r--lib/command.c58
-rw-r--r--lib/vty.c92
-rw-r--r--lib/zclient.c13
-rw-r--r--lib/zclient.h5
-rw-r--r--ospfd/ospf_lsa.c16
-rw-r--r--ospfd/ospf_lsa.h1
-rw-r--r--ospfd/ospf_zebra.c7
-rw-r--r--python/clidef.py2
-rw-r--r--zebra/kernel_socket.c135
-rw-r--r--zebra/redistribute.c6
-rw-r--r--zebra/rt_socket.c142
-rw-r--r--zebra/zapi_msg.c3
-rw-r--r--zebra/zebra_ptm_redistribute.c2
16 files changed, 223 insertions, 274 deletions
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
index 6bce7261ae..07077dfe1f 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -5081,6 +5081,9 @@ void bgp_static_delete(struct bgp *bgp)
bgp_static =
bgp_node_get_bgp_static_info(
rm);
+ if (!bgp_static)
+ continue;
+
bgp_static_withdraw_safi(
bgp, &rm->p, AFI_IP, safi,
(struct prefix_rd *)&rn->p);
@@ -5257,8 +5260,6 @@ int bgp_static_set_safi(afi_t afi, safi_t safi, struct vty *vty,
if (!bgp_node_has_bgp_path_info_data(prn))
bgp_node_set_bgp_table_info(prn,
bgp_table_init(bgp, afi, safi));
- else
- bgp_unlock_node(prn);
table = bgp_node_get_bgp_table_info(prn);
rn = bgp_node_get(table, &p);
diff --git a/doc/developer/zebra.rst b/doc/developer/zebra.rst
index f771d48235..74a8605bf2 100644
--- a/doc/developer/zebra.rst
+++ b/doc/developer/zebra.rst
@@ -241,7 +241,7 @@ Zebra Protocol Commands
+------------------------------------+-------+
| ZEBRA_INTERFACE_DISABLE_RADV | 42 |
+------------------------------------+-------+
-| ZEBRA_IPV3_NEXTHOP_LOOKUP_MRIB | 44 |
+| ZEBRA_IPV3_NEXTHOP_LOOKUP_MRIB | 43 |
+------------------------------------+-------+
| ZEBRA_INTERFACE_LINK_PARAMS | 44 |
+------------------------------------+-------+
@@ -279,9 +279,9 @@ Zebra Protocol Commands
+------------------------------------+-------+
| ZEBRA_VNI_DEL | 61 |
+------------------------------------+-------+
-| ZEBRA_L2VNI_ADD | 63 |
+| ZEBRA_L3VNI_ADD | 62 |
+------------------------------------+-------+
-| ZEBRA_L2VNI_DEL | 64 |
+| ZEBRA_L3VNI_DEL | 63 |
+------------------------------------+-------+
| ZEBRA_REMOTE_VTEP_ADD | 64 |
+------------------------------------+-------+
diff --git a/isisd/isis_zebra.c b/isisd/isis_zebra.c
index 958f8c2281..d03c1dde08 100644
--- a/isisd/isis_zebra.c
+++ b/isisd/isis_zebra.c
@@ -219,11 +219,11 @@ static int isis_zebra_if_address_del(int command, struct zclient *client,
}
static int isis_zebra_link_params(int command, struct zclient *zclient,
- zebra_size_t length)
+ zebra_size_t length, vrf_id_t vrf_id)
{
struct interface *ifp;
- ifp = zebra_interface_link_params_read(zclient->ibuf);
+ ifp = zebra_interface_link_params_read(zclient->ibuf, vrf_id);
if (ifp == NULL)
return 0;
diff --git a/lib/command.c b/lib/command.c
index d1dafa3a1a..05ccb52ab5 100644
--- a/lib/command.c
+++ b/lib/command.c
@@ -1535,67 +1535,11 @@ DEFUN (config_end,
"end",
"End current mode and change to enable mode.\n")
{
- switch (vty->node) {
- case VIEW_NODE:
- case ENABLE_NODE:
- /* Nothing to do. */
- break;
- case CONFIG_NODE:
- case INTERFACE_NODE:
- case PW_NODE:
- case LOGICALROUTER_NODE:
- case VRF_NODE:
- case NH_GROUP_NODE:
- case ZEBRA_NODE:
- case RIP_NODE:
- case RIPNG_NODE:
- case EIGRP_NODE:
- case BABEL_NODE:
- case BGP_NODE:
- case BGP_VRF_POLICY_NODE:
- case BGP_VNC_DEFAULTS_NODE:
- case BGP_VNC_NVE_GROUP_NODE:
- case BGP_VNC_L2_GROUP_NODE:
- case BGP_VPNV4_NODE:
- case BGP_VPNV6_NODE:
- case BGP_FLOWSPECV4_NODE:
- case BGP_FLOWSPECV6_NODE:
- case BGP_IPV4_NODE:
- case BGP_IPV4M_NODE:
- case BGP_IPV4L_NODE:
- case BGP_IPV6_NODE:
- case BGP_IPV6M_NODE:
- case BGP_EVPN_NODE:
- case BGP_EVPN_VNI_NODE:
- case BGP_IPV6L_NODE:
- case RMAP_NODE:
- case PBRMAP_NODE:
- case OSPF_NODE:
- case OSPF6_NODE:
- case LDP_NODE:
- case LDP_IPV4_NODE:
- case LDP_IPV6_NODE:
- case LDP_IPV4_IFACE_NODE:
- case LDP_IPV6_IFACE_NODE:
- case LDP_L2VPN_NODE:
- case LDP_PSEUDOWIRE_NODE:
- case ISIS_NODE:
- case OPENFABRIC_NODE:
- case KEYCHAIN_NODE:
- case KEYCHAIN_KEY_NODE:
- case VTY_NODE:
- case LINK_PARAMS_NODE:
- case BFD_NODE:
- case BFD_PEER_NODE:
+ if (vty->config) {
vty_config_exit(vty);
vty->node = ENABLE_NODE;
- break;
- default:
- break;
}
- vty->xpath_index = 0;
-
return CMD_SUCCESS;
}
diff --git a/lib/vty.c b/lib/vty.c
index 085cbac742..8450922c2b 100644
--- a/lib/vty.c
+++ b/lib/vty.c
@@ -775,61 +775,11 @@ static void vty_end_config(struct vty *vty)
{
vty_out(vty, "\n");
- switch (vty->node) {
- case VIEW_NODE:
- case ENABLE_NODE:
- /* Nothing to do. */
- break;
- case CONFIG_NODE:
- case INTERFACE_NODE:
- case PW_NODE:
- case ZEBRA_NODE:
- case RIP_NODE:
- case RIPNG_NODE:
- case EIGRP_NODE:
- case BGP_NODE:
- case BGP_VPNV4_NODE:
- case BGP_VPNV6_NODE:
- case BGP_VRF_POLICY_NODE:
- case BGP_VNC_DEFAULTS_NODE:
- case BGP_VNC_NVE_GROUP_NODE:
- case BGP_VNC_L2_GROUP_NODE:
- case BGP_IPV4_NODE:
- case BGP_IPV4M_NODE:
- case BGP_IPV4L_NODE:
- case BGP_IPV6_NODE:
- case BGP_IPV6M_NODE:
- case BGP_EVPN_NODE:
- case BGP_IPV6L_NODE:
- case RMAP_NODE:
- case PBRMAP_NODE:
- case OSPF_NODE:
- case OSPF6_NODE:
- case LDP_NODE:
- case LDP_IPV4_NODE:
- case LDP_IPV6_NODE:
- case LDP_IPV4_IFACE_NODE:
- case LDP_IPV6_IFACE_NODE:
- case LDP_L2VPN_NODE:
- case LDP_PSEUDOWIRE_NODE:
- case ISIS_NODE:
- case OPENFABRIC_NODE:
- case KEYCHAIN_NODE:
- case KEYCHAIN_KEY_NODE:
- case VTY_NODE:
- case BGP_EVPN_VNI_NODE:
- case BFD_NODE:
- case BFD_PEER_NODE:
+ if (vty->config) {
vty_config_exit(vty);
vty->node = ENABLE_NODE;
- break;
- default:
- /* Unknown node, we have to ignore it. */
- break;
}
- vty->xpath_index = 0;
-
vty_prompt(vty);
vty->cp = 0;
}
@@ -1190,44 +1140,11 @@ static void vty_stop_input(struct vty *vty)
vty_clear_buf(vty);
vty_out(vty, "\n");
- switch (vty->node) {
- case VIEW_NODE:
- case ENABLE_NODE:
- /* Nothing to do. */
- break;
- case CONFIG_NODE:
- case INTERFACE_NODE:
- case PW_NODE:
- case ZEBRA_NODE:
- case RIP_NODE:
- case RIPNG_NODE:
- case EIGRP_NODE:
- case BGP_NODE:
- case RMAP_NODE:
- case PBRMAP_NODE:
- case OSPF_NODE:
- case OSPF6_NODE:
- case LDP_NODE:
- case LDP_IPV4_NODE:
- case LDP_IPV6_NODE:
- case LDP_IPV4_IFACE_NODE:
- case LDP_IPV6_IFACE_NODE:
- case LDP_L2VPN_NODE:
- case LDP_PSEUDOWIRE_NODE:
- case ISIS_NODE:
- case OPENFABRIC_NODE:
- case KEYCHAIN_NODE:
- case KEYCHAIN_KEY_NODE:
- case VTY_NODE:
- case BFD_NODE:
- case BFD_PEER_NODE:
+ if (vty->config) {
vty_config_exit(vty);
vty->node = ENABLE_NODE;
- break;
- default:
- /* Unknown node, we have to ignore it. */
- break;
}
+
vty_prompt(vty);
/* Set history pointer to the latest one. */
@@ -2696,6 +2613,7 @@ int vty_config_enter(struct vty *vty, bool private_config, bool exclusive)
vty->node = CONFIG_NODE;
vty->config = true;
vty->private_config = private_config;
+ vty->xpath_index = 0;
if (private_config) {
vty->candidate_config = nb_config_dup(running_config);
@@ -2733,6 +2651,8 @@ void vty_config_exit(struct vty *vty)
nb_config_free(vty->candidate_config_base);
vty->candidate_config_base = NULL;
}
+
+ vty->config = false;
}
int vty_config_exclusive_lock(struct vty *vty)
diff --git a/lib/zclient.c b/lib/zclient.c
index cc936d47d7..187a4b20b0 100644
--- a/lib/zclient.c
+++ b/lib/zclient.c
@@ -457,8 +457,7 @@ void zclient_send_reg_requests(struct zclient *zclient, vrf_id_t vrf_id)
vrf_id);
/* If default information is needed. */
- if (vrf_bitmap_check(zclient->default_information[afi],
- VRF_DEFAULT))
+ if (vrf_bitmap_check(zclient->default_information[afi], vrf_id))
zebra_redistribute_default_send(
ZEBRA_REDISTRIBUTE_DEFAULT_ADD, zclient, afi,
vrf_id);
@@ -525,8 +524,7 @@ void zclient_send_dereg_requests(struct zclient *zclient, vrf_id_t vrf_id)
i, 0, vrf_id);
/* If default information is needed. */
- if (vrf_bitmap_check(zclient->default_information[afi],
- VRF_DEFAULT))
+ if (vrf_bitmap_check(zclient->default_information[afi], vrf_id))
zebra_redistribute_default_send(
ZEBRA_REDISTRIBUTE_DEFAULT_DELETE, zclient, afi,
vrf_id);
@@ -1497,7 +1495,8 @@ static void link_params_set_value(struct stream *s, struct if_link_params *iflp)
iflp->use_bw = stream_getf(s);
}
-struct interface *zebra_interface_link_params_read(struct stream *s)
+struct interface *zebra_interface_link_params_read(struct stream *s,
+ vrf_id_t vrf_id)
{
struct if_link_params *iflp;
ifindex_t ifindex;
@@ -1506,7 +1505,7 @@ struct interface *zebra_interface_link_params_read(struct stream *s)
ifindex = stream_getl(s);
- struct interface *ifp = if_lookup_by_index(ifindex, VRF_DEFAULT);
+ struct interface *ifp = if_lookup_by_index(ifindex, vrf_id);
if (ifp == NULL) {
flog_err(EC_LIB_ZAPI_ENCODE,
@@ -2583,7 +2582,7 @@ static int zclient_read(struct thread *thread)
case ZEBRA_INTERFACE_LINK_PARAMS:
if (zclient->interface_link_params)
(*zclient->interface_link_params)(command, zclient,
- length);
+ length, vrf_id);
break;
case ZEBRA_FEC_UPDATE:
if (zclient_debug)
diff --git a/lib/zclient.h b/lib/zclient.h
index 401d6c400a..95f0a990b2 100644
--- a/lib/zclient.h
+++ b/lib/zclient.h
@@ -229,7 +229,7 @@ struct zclient {
int (*interface_address_add)(int, struct zclient *, uint16_t, vrf_id_t);
int (*interface_address_delete)(int, struct zclient *, uint16_t,
vrf_id_t);
- int (*interface_link_params)(int, struct zclient *, uint16_t);
+ int (*interface_link_params)(int, struct zclient *, uint16_t, vrf_id_t);
int (*interface_bfd_dest_update)(int, struct zclient *, uint16_t,
vrf_id_t);
int (*interface_nbr_address_add)(int, struct zclient *, uint16_t,
@@ -564,7 +564,8 @@ extern struct interface *zebra_interface_vrf_update_read(struct stream *s,
extern void zebra_interface_if_set_value(struct stream *, struct interface *);
extern void zebra_router_id_update_read(struct stream *s, struct prefix *rid);
-extern struct interface *zebra_interface_link_params_read(struct stream *);
+extern struct interface *zebra_interface_link_params_read(struct stream *s,
+ vrf_id_t vrf_id);
extern size_t zebra_interface_link_params_write(struct stream *,
struct interface *);
extern int zclient_send_get_label_chunk(
diff --git a/ospfd/ospf_lsa.c b/ospfd/ospf_lsa.c
index 288ce43f79..609effd874 100644
--- a/ospfd/ospf_lsa.c
+++ b/ospfd/ospf_lsa.c
@@ -2249,6 +2249,22 @@ void ospf_external_lsa_refresh_default(struct ospf *ospf)
}
}
+void ospf_default_originate_lsa_update(struct ospf *ospf)
+{
+ struct prefix_ipv4 p;
+ struct ospf_lsa *lsa;
+
+ p.family = AF_INET;
+ p.prefixlen = 0;
+ p.prefix.s_addr = 0;
+
+ lsa = ospf_external_info_find_lsa(ospf, &p);
+ if (lsa && IS_LSA_MAXAGE(lsa)) {
+ ospf_discard_from_db(ospf, lsa->lsdb, lsa);
+ ospf_lsdb_delete(lsa->lsdb, lsa);
+ }
+}
+
void ospf_external_lsa_refresh_type(struct ospf *ospf, uint8_t type,
unsigned short instance, int force)
{
diff --git a/ospfd/ospf_lsa.h b/ospfd/ospf_lsa.h
index ba4c4c1cac..4b4d760f44 100644
--- a/ospfd/ospf_lsa.h
+++ b/ospfd/ospf_lsa.h
@@ -296,6 +296,7 @@ extern int ospf_lsa_maxage_walker(struct thread *);
extern struct ospf_lsa *ospf_lsa_refresh(struct ospf *, struct ospf_lsa *);
extern void ospf_external_lsa_refresh_default(struct ospf *);
+extern void ospf_default_originate_lsa_update(struct ospf *ospf);
extern void ospf_external_lsa_refresh_type(struct ospf *, uint8_t,
unsigned short, int);
diff --git a/ospfd/ospf_zebra.c b/ospfd/ospf_zebra.c
index 79ddb192c1..a86800f901 100644
--- a/ospfd/ospf_zebra.c
+++ b/ospfd/ospf_zebra.c
@@ -340,11 +340,11 @@ static int ospf_interface_address_delete(int command, struct zclient *zclient,
}
static int ospf_interface_link_params(int command, struct zclient *zclient,
- zebra_size_t length)
+ zebra_size_t length, vrf_id_t vrf_id)
{
struct interface *ifp;
- ifp = zebra_interface_link_params_read(zclient->ibuf);
+ ifp = zebra_interface_link_params_read(zclient->ibuf, vrf_id);
if (ifp == NULL)
return 0;
@@ -869,6 +869,9 @@ int ospf_redistribute_default_unset(struct ospf *ospf)
ospf_asbr_status_update(ospf, --ospf->redistribute);
+ /* clean up maxage default originate external lsa */
+ ospf_default_originate_lsa_update(ospf);
+
return CMD_SUCCESS;
}
diff --git a/python/clidef.py b/python/clidef.py
index a140ce3d54..f8d96115bd 100644
--- a/python/clidef.py
+++ b/python/clidef.py
@@ -41,7 +41,7 @@ class RenderHandler(object):
class StringHandler(RenderHandler):
argtype = 'const char *'
decl = Template('const char *$varname = NULL;')
- code = Template('$varname = argv[_i]->arg;')
+ code = Template('$varname = (argv[_i]->type == WORD_TKN) ? argv[_i]->text : argv[_i]->arg;')
drop_str = True
canfail = False
diff --git a/zebra/kernel_socket.c b/zebra/kernel_socket.c
index 84b06e579f..f3561cc19d 100644
--- a/zebra/kernel_socket.c
+++ b/zebra/kernel_socket.c
@@ -236,6 +236,7 @@ size_t _rta_get(caddr_t sap, void *destp, size_t destlen, bool checkaf);
size_t rta_get(caddr_t sap, void *dest, size_t destlen);
size_t rta_getattr(caddr_t sap, void *destp, size_t destlen);
size_t rta_getsdlname(caddr_t sap, void *dest, short *destlen);
+const char *rtatostr(unsigned int flags, char *buf, size_t buflen);
/* Supported address family check. */
static inline int af_check(int family)
@@ -273,7 +274,7 @@ size_t _rta_get(caddr_t sap, void *destp, size_t destlen, bool checkaf)
if (sa->sa_family == AF_LINK) {
sdl = (struct sockaddr_dl *)sa;
if (sdl->sdl_index == 0 || sdl->sdl_nlen == 0)
- copylen = sizeof(*sdl) - sizeof(sdl->sdl_data);
+ copylen = destlen;
}
if (copylen > destlen) {
@@ -329,6 +330,85 @@ size_t rta_getsdlname(caddr_t sap, void *destp, short *destlen)
return tlen;
}
+const char *rtatostr(unsigned int flags, char *buf, size_t buflen)
+{
+ const char *flagstr, *bufstart;
+ int bit, wlen;
+ char ustr[32];
+
+ /* Hold the pointer to the buffer beginning. */
+ bufstart = buf;
+
+ for (bit = 1; bit; bit <<= 1) {
+ if ((flags & bit) == 0)
+ continue;
+
+ switch (bit) {
+ case RTA_DST:
+ flagstr = "DST";
+ break;
+ case RTA_GATEWAY:
+ flagstr = "GATEWAY";
+ break;
+ case RTA_NETMASK:
+ flagstr = "NETMASK";
+ break;
+#ifdef RTA_GENMASK
+ case RTA_GENMASK:
+ flagstr = "GENMASK";
+ break;
+#endif /* RTA_GENMASK */
+ case RTA_IFP:
+ flagstr = "IFP";
+ break;
+ case RTA_IFA:
+ flagstr = "IFA";
+ break;
+#ifdef RTA_AUTHOR
+ case RTA_AUTHOR:
+ flagstr = "AUTHOR";
+ break;
+#endif /* RTA_AUTHOR */
+ case RTA_BRD:
+ flagstr = "BRD";
+ break;
+#ifdef RTA_SRC
+ case RTA_SRC:
+ flagstr = "SRC";
+ break;
+#endif /* RTA_SRC */
+#ifdef RTA_SRCMASK
+ case RTA_SRCMASK:
+ flagstr = "SRCMASK";
+ break;
+#endif /* RTA_SRCMASK */
+#ifdef RTA_LABEL
+ case RTA_LABEL:
+ flagstr = "LABEL";
+ break;
+#endif /* RTA_LABEL */
+
+ default:
+ snprintf(ustr, sizeof(ustr), "0x%x", bit);
+ flagstr = ustr;
+ break;
+ }
+
+ wlen = snprintf(buf, buflen, "%s,", flagstr);
+ buf += wlen;
+ buflen -= wlen;
+ }
+
+ /* Check for empty buffer. */
+ if (bufstart != buf)
+ buf--;
+
+ /* Remove the last comma. */
+ *buf = 0;
+
+ return bufstart;
+}
+
/* Dump routing table flag for debug purpose. */
static void rtm_flag_dump(int flag)
{
@@ -443,6 +523,7 @@ int ifm_read(struct if_msghdr *ifm)
short ifnlen = 0;
int maskbit;
caddr_t cp;
+ char fbuf[64];
/* terminate ifname at head (for strnlen) and tail (for safety) */
ifname[IFNAMSIZ - 1] = '\0';
@@ -488,8 +569,9 @@ int ifm_read(struct if_msghdr *ifm)
}
if (IS_ZEBRA_DEBUG_KERNEL)
- zlog_debug("%s: sdl ifname %s", __func__,
- (ifnlen ? ifname : "(nil)"));
+ zlog_debug("%s: sdl ifname %s addrs {%s}", __func__,
+ (ifnlen ? ifname : "(nil)"),
+ rtatostr(ifm->ifm_addrs, fbuf, sizeof(fbuf)));
/*
* Look up on ifindex first, because ifindices are the primary handle
@@ -687,6 +769,7 @@ static void ifam_read_mesg(struct ifa_msghdr *ifm, union sockunion *addr,
union sockunion dst;
union sockunion gateway;
int maskbit;
+ char fbuf[64];
pnt = (caddr_t)(ifm + 1);
end = ((caddr_t)ifm) + ifm->ifam_msglen;
@@ -736,33 +819,35 @@ static void ifam_read_mesg(struct ifa_msghdr *ifm, union sockunion *addr,
}
if (IS_ZEBRA_DEBUG_KERNEL) {
- int family = sockunion_family(addr);
- switch (family) {
+ switch (sockunion_family(addr)) {
case AF_INET:
case AF_INET6: {
char buf[4][INET6_ADDRSTRLEN];
+ int masklen =
+ (sockunion_family(addr) == AF_INET)
+ ? ip_masklen(mask->sin.sin_addr)
+ : ip6_masklen(mask->sin6.sin6_addr);
zlog_debug(
- "%s: ifindex %d, ifname %s, ifam_addrs 0x%x, "
+ "%s: ifindex %d, ifname %s, ifam_addrs {%s}, "
"ifam_flags 0x%x, addr %s/%d broad %s dst %s "
"gateway %s",
__func__, ifm->ifam_index,
- (ifnlen ? ifname : "(nil)"), ifm->ifam_addrs,
+ (ifnlen ? ifname : "(nil)"),
+ rtatostr(ifm->ifam_addrs, fbuf, sizeof(fbuf)),
ifm->ifam_flags,
- inet_ntop(family, &addr->sin.sin_addr, buf[0],
- sizeof(buf[0])),
- ip_masklen(mask->sin.sin_addr),
- inet_ntop(family, &brd->sin.sin_addr, buf[1],
- sizeof(buf[1])),
- inet_ntop(family, &dst.sin.sin_addr, buf[2],
- sizeof(buf[2])),
- inet_ntop(family, &gateway.sin.sin_addr, buf[3],
- sizeof(buf[3])));
+ sockunion2str(addr, buf[0], sizeof(buf[0])),
+ masklen,
+ sockunion2str(brd, buf[1], sizeof(buf[1])),
+ sockunion2str(&dst, buf[2], sizeof(buf[2])),
+ sockunion2str(&gateway, buf[2],
+ sizeof(buf[2])));
} break;
default:
- zlog_debug("%s: ifindex %d, ifname %s, ifam_addrs 0x%x",
+ zlog_debug("%s: ifindex %d, ifname %s, ifam_addrs {%s}",
__func__, ifm->ifam_index,
(ifnlen ? ifname : "(nil)"),
- ifm->ifam_addrs);
+ rtatostr(ifm->ifam_addrs, fbuf,
+ sizeof(fbuf)));
break;
}
}
@@ -909,7 +994,7 @@ static int rtm_read_mesg(struct rt_msghdr *rtm, union sockunion *dest,
pnt += rta_get(pnt, gate, sizeof(*gate));
break;
case RTA_NETMASK:
- pnt += rta_get(pnt, mask, sizeof(*mask));
+ pnt += rta_getattr(pnt, mask, sizeof(*mask));
break;
case RTA_IFP:
pnt += rta_getsdlname(pnt, ifname, ifnlen);
@@ -950,6 +1035,7 @@ void rtm_read(struct rt_msghdr *rtm)
struct prefix p;
ifindex_t ifindex = 0;
afi_t afi;
+ char fbuf[64];
zebra_flags = 0;
@@ -959,9 +1045,10 @@ void rtm_read(struct rt_msghdr *rtm)
if (!(flags & RTF_DONE))
return;
if (IS_ZEBRA_DEBUG_KERNEL)
- zlog_debug("%s: got rtm of type %d (%s)", __func__,
+ zlog_debug("%s: got rtm of type %d (%s) addrs {%s}", __func__,
rtm->rtm_type,
- lookup_msg(rtm_type_str, rtm->rtm_type, NULL));
+ lookup_msg(rtm_type_str, rtm->rtm_type, NULL),
+ rtatostr(rtm->rtm_addrs, fbuf, sizeof(fbuf)));
#ifdef RTF_CLONED /*bsdi, netbsd 1.6*/
if (flags & RTF_CLONED)
@@ -1207,12 +1294,14 @@ int rtm_write(int message, union sockunion *dest, union sockunion *mask,
/* For debug purpose. */
static void rtmsg_debug(struct rt_msghdr *rtm)
{
+ char fbuf[64];
+
zlog_debug("Kernel: Len: %d Type: %s", rtm->rtm_msglen,
lookup_msg(rtm_type_str, rtm->rtm_type, NULL));
rtm_flag_dump(rtm->rtm_flags);
zlog_debug("Kernel: message seq %d", rtm->rtm_seq);
- zlog_debug("Kernel: pid %lld, rtm_addrs 0x%x", (long long)rtm->rtm_pid,
- rtm->rtm_addrs);
+ zlog_debug("Kernel: pid %lld, rtm_addrs {%s}", (long long)rtm->rtm_pid,
+ rtatostr(rtm->rtm_addrs, fbuf, sizeof(fbuf)));
}
/* This is pretty gross, better suggestions welcome -- mhandler */
diff --git a/zebra/redistribute.c b/zebra/redistribute.c
index b9c1f0aefd..c5769ae06f 100644
--- a/zebra/redistribute.c
+++ b/zebra/redistribute.c
@@ -405,7 +405,7 @@ void zebra_interface_up_update(struct interface *ifp)
if (ifp->ptm_status || !ifp->ptm_enable) {
for (ALL_LIST_ELEMENTS(zebrad.client_list, node, nnode, client))
- if (client->ifinfo) {
+ if (vrf_bitmap_check(client->ifinfo, ifp->vrf_id)) {
zsend_interface_update(ZEBRA_INTERFACE_UP,
client, ifp);
zsend_interface_link_params(client, ifp);
@@ -439,7 +439,7 @@ void zebra_interface_add_update(struct interface *ifp)
ifp->vrf_id);
for (ALL_LIST_ELEMENTS(zebrad.client_list, node, nnode, client))
- if (client->ifinfo) {
+ if (vrf_bitmap_check(client->ifinfo, ifp->vrf_id)) {
client->ifadd_cnt++;
zsend_interface_add(client, ifp);
zsend_interface_link_params(client, ifp);
@@ -812,6 +812,6 @@ void zebra_interface_parameters_update(struct interface *ifp)
ifp->name, ifp->vrf_id);
for (ALL_LIST_ELEMENTS(zebrad.client_list, node, nnode, client))
- if (client->ifinfo)
+ if (vrf_bitmap_check(client->ifinfo, ifp->vrf_id))
zsend_interface_link_params(client, ifp);
}
diff --git a/zebra/rt_socket.c b/zebra/rt_socket.c
index 29e9bf82f0..7dc5ef8b66 100644
--- a/zebra/rt_socket.c
+++ b/zebra/rt_socket.c
@@ -44,30 +44,6 @@
extern struct zebra_privs_t zserv_privs;
-#ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
-/* Adjust netmask socket length. Return value is a adjusted sin_len
- value. */
-static int sin_masklen(struct in_addr mask)
-{
- char *p, *lim;
- int len;
- struct sockaddr_in sin;
-
- if (mask.s_addr == 0)
- return sizeof(long);
-
- sin.sin_addr = mask;
- len = sizeof(struct sockaddr_in);
-
- lim = (char *)&sin.sin_addr;
- p = lim + sizeof(sin.sin_addr);
-
- while (*--p == 0 && p >= lim)
- len--;
- return len;
-}
-#endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */
-
#ifdef __OpenBSD__
static int kernel_rtm_add_labels(struct mpls_label_stack *nh_label,
struct sockaddr_mpls *smpls)
@@ -89,30 +65,6 @@ static int kernel_rtm_add_labels(struct mpls_label_stack *nh_label,
}
#endif
-#ifdef SIN6_LEN
-/* Calculate sin6_len value for netmask socket value. */
-static int sin6_masklen(struct in6_addr mask)
-{
- struct sockaddr_in6 sin6;
- char *p, *lim;
- int len;
-
- if (IN6_IS_ADDR_UNSPECIFIED(&mask))
- return sizeof(long);
-
- sin6.sin6_addr = mask;
- len = sizeof(struct sockaddr_in6);
-
- lim = (char *)&sin6.sin6_addr;
- p = lim + sizeof(sin6.sin6_addr);
-
- while (*--p == 0 && p >= lim)
- len--;
-
- return len;
-}
-#endif /* SIN6_LEN */
-
/* Interface between zebra message and rtm message. */
static int kernel_rtm(int cmd, const struct prefix *p,
const struct nexthop_group *ng, uint32_t metric)
@@ -128,10 +80,11 @@ static int kernel_rtm(int cmd, const struct prefix *p,
ifindex_t ifindex = 0;
bool gate = false;
int error;
+ char gate_buf[INET6_BUFSIZ];
char prefix_buf[PREFIX_STRLEN];
enum blackhole_type bh_type = BLACKHOLE_UNSPEC;
- if (IS_ZEBRA_DEBUG_RIB)
+ if (IS_ZEBRA_DEBUG_RIB || IS_ZEBRA_DEBUG_KERNEL)
prefix2str(p, prefix_buf, sizeof(prefix_buf));
/*
@@ -154,23 +107,21 @@ static int kernel_rtm(int cmd, const struct prefix *p,
switch (p->family) {
case AF_INET:
sin_dest.sin.sin_family = AF_INET;
-#ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
- sin_dest.sin.sin_len = sizeof(sin_dest);
- sin_gate.sin.sin_len = sizeof(sin_gate);
-#endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */
sin_dest.sin.sin_addr = p->u.prefix4;
sin_gate.sin.sin_family = AF_INET;
+#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
+ sin_dest.sin.sin_len = sizeof(struct sockaddr_in);
+ sin_gate.sin.sin_len = sizeof(struct sockaddr_in);
+#endif /* HAVE_STRUCT_SOCKADDR_SA_LEN */
break;
case AF_INET6:
sin_dest.sin6.sin6_family = AF_INET6;
-#ifdef SIN6_LEN
- sin_dest.sin6.sin6_len = sizeof(sin_dest);
-#endif /* SIN6_LEN */
sin_dest.sin6.sin6_addr = p->u.prefix6;
sin_gate.sin6.sin6_family = AF_INET6;
-#ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
- sin_gate.sin6.sin6_len = sizeof(sin_gate);
-#endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */
+#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
+ sin_dest.sin6.sin6_len = sizeof(struct sockaddr_in6);
+ sin_gate.sin6.sin6_len = sizeof(struct sockaddr_in6);
+#endif /* HAVE_STRUCT_SOCKADDR_SA_LEN */
break;
}
@@ -185,13 +136,16 @@ static int kernel_rtm(int cmd, const struct prefix *p,
smplsp = NULL;
gate = false;
- char gate_buf[INET_ADDRSTRLEN] = "NULL";
+ snprintf(gate_buf, sizeof(gate_buf), "NULL");
switch (nexthop->type) {
case NEXTHOP_TYPE_IPV4:
case NEXTHOP_TYPE_IPV4_IFINDEX:
sin_gate.sin.sin_addr = nexthop->gate.ipv4;
sin_gate.sin.sin_family = AF_INET;
+#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
+ sin_gate.sin.sin_len = sizeof(struct sockaddr_in);
+#endif /* HAVE_STRUCT_SOCKADDR_SA_LEN */
ifindex = nexthop->ifindex;
gate = true;
break;
@@ -199,6 +153,9 @@ static int kernel_rtm(int cmd, const struct prefix *p,
case NEXTHOP_TYPE_IPV6_IFINDEX:
sin_gate.sin6.sin6_addr = nexthop->gate.ipv6;
sin_gate.sin6.sin6_family = AF_INET6;
+#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
+ sin_gate.sin6.sin6_len = sizeof(struct sockaddr_in6);
+#endif /* HAVE_STRUCT_SOCKADDR_SA_LEN */
ifindex = nexthop->ifindex;
/* Under kame set interface index to link local address */
#ifdef KAME
@@ -227,6 +184,10 @@ static int kernel_rtm(int cmd, const struct prefix *p,
struct in_addr loopback;
loopback.s_addr = htonl(INADDR_LOOPBACK);
sin_gate.sin.sin_addr = loopback;
+#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
+ sin_gate.sin.sin_len =
+ sizeof(struct sockaddr_in);
+#endif /* HAVE_STRUCT_SOCKADDR_SA_LEN */
gate = true;
}
break;
@@ -239,18 +200,16 @@ static int kernel_rtm(int cmd, const struct prefix *p,
case AF_INET:
masklen2ip(p->prefixlen, &sin_mask.sin.sin_addr);
sin_mask.sin.sin_family = AF_INET;
-#ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
- sin_mask.sin.sin_len = sin_masklen(
- sin_mask.sin.sin_addr);
-#endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */
+#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
+ sin_mask.sin.sin_len = sizeof(struct sockaddr_in);
+#endif /* HAVE_STRUCT_SOCKADDR_SA_LEN */
break;
case AF_INET6:
masklen2ip6(p->prefixlen, &sin_mask.sin6.sin6_addr);
sin_mask.sin6.sin6_family = AF_INET6;
-#ifdef SIN6_LEN
- sin_mask.sin6.sin6_len = sin6_masklen(
- sin_mask.sin6.sin6_addr);
-#endif /* SIN6_LEN */
+#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
+ sin_mask.sin6.sin6_len = sizeof(struct sockaddr_in6);
+#endif /* HAVE_STRUCT_SOCKADDR_SA_LEN */
break;
}
@@ -266,13 +225,29 @@ static int kernel_rtm(int cmd, const struct prefix *p,
if (IS_ZEBRA_DEBUG_KERNEL) {
if (!gate) {
- zlog_debug("%s: %s: attention! gate not found for re",
- __func__, prefix_buf);
- } else
- inet_ntop(p->family == AFI_IP ? AF_INET
- : AF_INET6,
- &sin_gate.sin.sin_addr,
- gate_buf, INET_ADDRSTRLEN);
+ zlog_debug(
+ "%s: %s: attention! gate not found for re",
+ __func__, prefix_buf);
+ } else {
+ switch (p->family) {
+ case AFI_IP:
+ inet_ntop(AF_INET,
+ &sin_gate.sin.sin_addr,
+ gate_buf, sizeof(gate_buf));
+ break;
+
+ case AFI_IP6:
+ inet_ntop(AF_INET6,
+ &sin_gate.sin6.sin6_addr,
+ gate_buf, sizeof(gate_buf));
+ break;
+
+ default:
+ snprintf(gate_buf, sizeof(gate_buf),
+ "(invalid-af)");
+ break;
+ }
+ }
}
switch (error) {
/* We only flag nexthops as being in FIB if
@@ -301,12 +276,11 @@ static int kernel_rtm(int cmd, const struct prefix *p,
/* Note any unexpected status returns */
default:
- flog_err(EC_LIB_SYSTEM_CALL,
- "%s: %s: rtm_write() unexpectedly returned %d for command %s",
- __func__,
- prefix2str(p, prefix_buf,
- sizeof(prefix_buf)),
- error, lookup_msg(rtm_type_str, cmd, NULL));
+ flog_err(
+ EC_LIB_SYSTEM_CALL,
+ "%s: %s: rtm_write() unexpectedly returned %d for command %s",
+ __func__, prefix_buf, error,
+ lookup_msg(rtm_type_str, cmd, NULL));
break;
}
} /* for (ALL_NEXTHOPS(...))*/
@@ -314,9 +288,9 @@ static int kernel_rtm(int cmd, const struct prefix *p,
/* If there was no useful nexthop, then complain. */
if (nexthop_num == 0) {
if (IS_ZEBRA_DEBUG_KERNEL)
- zlog_debug("%s: No useful nexthops were found in RIB prefix %s",
- __func__, prefix2str(p, prefix_buf,
- sizeof(prefix_buf)));
+ zlog_debug(
+ "%s: No useful nexthops were found in RIB prefix %s",
+ __func__, prefix_buf);
return 1;
}
diff --git a/zebra/zapi_msg.c b/zebra/zapi_msg.c
index 15f9da0cba..d3994fd4a8 100644
--- a/zebra/zapi_msg.c
+++ b/zebra/zapi_msg.c
@@ -209,7 +209,7 @@ int zsend_interface_link_params(struct zserv *client, struct interface *ifp)
struct stream *s = stream_new(ZEBRA_MAX_PACKET_SIZ);
/* Check this client need interface information. */
- if (!client->ifinfo) {
+ if (!vrf_bitmap_check(client->ifinfo, ifp->vrf_id)) {
stream_free(s);
return 0;
}
@@ -1324,6 +1324,7 @@ static void zread_interface_add(ZAPI_HANDLER_ARGS)
continue;
zsend_interface_add(client, ifp);
+ zsend_interface_link_params(client, ifp);
zsend_interface_addresses(client, ifp);
}
}
diff --git a/zebra/zebra_ptm_redistribute.c b/zebra/zebra_ptm_redistribute.c
index 420105198b..3acbe3bf2c 100644
--- a/zebra/zebra_ptm_redistribute.c
+++ b/zebra/zebra_ptm_redistribute.c
@@ -37,7 +37,7 @@ static int zsend_interface_bfd_update(int cmd, struct zserv *client,
struct stream *s;
/* Check this client need interface information. */
- if (!client->ifinfo)
+ if (!vrf_bitmap_check(client->ifinfo, ifp->vrf_id))
return 0;
s = stream_new(ZEBRA_MAX_PACKET_SIZ);