forked from Mirror/frr
commit
17daea8a18
|
@ -297,9 +297,6 @@ static void netlink_determine_zebra_iftype(const char *kind,
|
||||||
*zif_type = ZEBRA_IF_GRE;
|
*zif_type = ZEBRA_IF_GRE;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define parse_rtattr_nested(tb, max, rta) \
|
|
||||||
netlink_parse_rtattr((tb), (max), RTA_DATA(rta), RTA_PAYLOAD(rta))
|
|
||||||
|
|
||||||
static void netlink_vrf_change(struct nlmsghdr *h, struct rtattr *tb,
|
static void netlink_vrf_change(struct nlmsghdr *h, struct rtattr *tb,
|
||||||
uint32_t ns_id, const char *name)
|
uint32_t ns_id, const char *name)
|
||||||
{
|
{
|
||||||
|
@ -312,8 +309,7 @@ static void netlink_vrf_change(struct nlmsghdr *h, struct rtattr *tb,
|
||||||
|
|
||||||
ifi = NLMSG_DATA(h);
|
ifi = NLMSG_DATA(h);
|
||||||
|
|
||||||
memset(linkinfo, 0, sizeof(linkinfo));
|
netlink_parse_rtattr_nested(linkinfo, IFLA_INFO_MAX, tb);
|
||||||
parse_rtattr_nested(linkinfo, IFLA_INFO_MAX, tb);
|
|
||||||
|
|
||||||
if (!linkinfo[IFLA_INFO_DATA]) {
|
if (!linkinfo[IFLA_INFO_DATA]) {
|
||||||
if (IS_ZEBRA_DEBUG_KERNEL)
|
if (IS_ZEBRA_DEBUG_KERNEL)
|
||||||
|
@ -323,8 +319,8 @@ static void netlink_vrf_change(struct nlmsghdr *h, struct rtattr *tb,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(attr, 0, sizeof(attr));
|
netlink_parse_rtattr_nested(attr, IFLA_VRF_MAX,
|
||||||
parse_rtattr_nested(attr, IFLA_VRF_MAX, linkinfo[IFLA_INFO_DATA]);
|
linkinfo[IFLA_INFO_DATA]);
|
||||||
if (!attr[IFLA_VRF_TABLE]) {
|
if (!attr[IFLA_VRF_TABLE]) {
|
||||||
if (IS_ZEBRA_DEBUG_KERNEL)
|
if (IS_ZEBRA_DEBUG_KERNEL)
|
||||||
zlog_debug(
|
zlog_debug(
|
||||||
|
@ -544,8 +540,7 @@ static int netlink_extract_bridge_info(struct rtattr *link_data,
|
||||||
struct rtattr *attr[IFLA_BR_MAX + 1];
|
struct rtattr *attr[IFLA_BR_MAX + 1];
|
||||||
|
|
||||||
memset(bridge_info, 0, sizeof(*bridge_info));
|
memset(bridge_info, 0, sizeof(*bridge_info));
|
||||||
memset(attr, 0, sizeof(attr));
|
netlink_parse_rtattr_nested(attr, IFLA_BR_MAX, link_data);
|
||||||
parse_rtattr_nested(attr, IFLA_BR_MAX, link_data);
|
|
||||||
if (attr[IFLA_BR_VLAN_FILTERING])
|
if (attr[IFLA_BR_VLAN_FILTERING])
|
||||||
bridge_info->vlan_aware =
|
bridge_info->vlan_aware =
|
||||||
*(uint8_t *)RTA_DATA(attr[IFLA_BR_VLAN_FILTERING]);
|
*(uint8_t *)RTA_DATA(attr[IFLA_BR_VLAN_FILTERING]);
|
||||||
|
@ -559,8 +554,7 @@ static int netlink_extract_vlan_info(struct rtattr *link_data,
|
||||||
vlanid_t vid_in_msg;
|
vlanid_t vid_in_msg;
|
||||||
|
|
||||||
memset(vlan_info, 0, sizeof(*vlan_info));
|
memset(vlan_info, 0, sizeof(*vlan_info));
|
||||||
memset(attr, 0, sizeof(attr));
|
netlink_parse_rtattr_nested(attr, IFLA_VLAN_MAX, link_data);
|
||||||
parse_rtattr_nested(attr, IFLA_VLAN_MAX, link_data);
|
|
||||||
if (!attr[IFLA_VLAN_ID]) {
|
if (!attr[IFLA_VLAN_ID]) {
|
||||||
if (IS_ZEBRA_DEBUG_KERNEL)
|
if (IS_ZEBRA_DEBUG_KERNEL)
|
||||||
zlog_debug("IFLA_VLAN_ID missing from VLAN IF message");
|
zlog_debug("IFLA_VLAN_ID missing from VLAN IF message");
|
||||||
|
@ -579,7 +573,7 @@ static int netlink_extract_gre_info(struct rtattr *link_data,
|
||||||
|
|
||||||
memset(gre_info, 0, sizeof(*gre_info));
|
memset(gre_info, 0, sizeof(*gre_info));
|
||||||
memset(attr, 0, sizeof(attr));
|
memset(attr, 0, sizeof(attr));
|
||||||
parse_rtattr_nested(attr, IFLA_GRE_MAX, link_data);
|
netlink_parse_rtattr_nested(attr, IFLA_GRE_MAX, link_data);
|
||||||
|
|
||||||
if (!attr[IFLA_GRE_LOCAL]) {
|
if (!attr[IFLA_GRE_LOCAL]) {
|
||||||
if (IS_ZEBRA_DEBUG_KERNEL)
|
if (IS_ZEBRA_DEBUG_KERNEL)
|
||||||
|
@ -622,8 +616,7 @@ static int netlink_extract_vxlan_info(struct rtattr *link_data,
|
||||||
ifindex_t ifindex_link;
|
ifindex_t ifindex_link;
|
||||||
|
|
||||||
memset(vxl_info, 0, sizeof(*vxl_info));
|
memset(vxl_info, 0, sizeof(*vxl_info));
|
||||||
memset(attr, 0, sizeof(attr));
|
netlink_parse_rtattr_nested(attr, IFLA_VXLAN_MAX, link_data);
|
||||||
parse_rtattr_nested(attr, IFLA_VXLAN_MAX, link_data);
|
|
||||||
if (!attr[IFLA_VXLAN_ID]) {
|
if (!attr[IFLA_VXLAN_ID]) {
|
||||||
if (IS_ZEBRA_DEBUG_KERNEL)
|
if (IS_ZEBRA_DEBUG_KERNEL)
|
||||||
zlog_debug(
|
zlog_debug(
|
||||||
|
@ -716,8 +709,7 @@ static int netlink_bridge_vxlan_update(struct interface *ifp,
|
||||||
/* There is a 1-to-1 mapping of VLAN to VxLAN - hence
|
/* There is a 1-to-1 mapping of VLAN to VxLAN - hence
|
||||||
* only 1 access VLAN is accepted.
|
* only 1 access VLAN is accepted.
|
||||||
*/
|
*/
|
||||||
memset(aftb, 0, sizeof(aftb));
|
netlink_parse_rtattr_nested(aftb, IFLA_BRIDGE_MAX, af_spec);
|
||||||
parse_rtattr_nested(aftb, IFLA_BRIDGE_MAX, af_spec);
|
|
||||||
if (!aftb[IFLA_BRIDGE_VLAN_INFO])
|
if (!aftb[IFLA_BRIDGE_VLAN_INFO])
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -786,7 +778,6 @@ static int netlink_bridge_interface(struct nlmsghdr *h, int len, ns_id_t ns_id,
|
||||||
|
|
||||||
/* Fetch name and ifindex */
|
/* Fetch name and ifindex */
|
||||||
ifi = NLMSG_DATA(h);
|
ifi = NLMSG_DATA(h);
|
||||||
memset(tb, 0, sizeof(tb));
|
|
||||||
netlink_parse_rtattr(tb, IFLA_MAX, IFLA_RTA(ifi), len);
|
netlink_parse_rtattr(tb, IFLA_MAX, IFLA_RTA(ifi), len);
|
||||||
|
|
||||||
if (tb[IFLA_IFNAME] == NULL)
|
if (tb[IFLA_IFNAME] == NULL)
|
||||||
|
@ -854,8 +845,7 @@ static uint8_t netlink_parse_lacp_bypass(struct rtattr **linkinfo)
|
||||||
uint8_t bypass = 0;
|
uint8_t bypass = 0;
|
||||||
struct rtattr *mbrinfo[IFLA_BOND_SLAVE_MAX + 1];
|
struct rtattr *mbrinfo[IFLA_BOND_SLAVE_MAX + 1];
|
||||||
|
|
||||||
memset(mbrinfo, 0, sizeof(mbrinfo));
|
netlink_parse_rtattr_nested(mbrinfo, IFLA_BOND_SLAVE_MAX,
|
||||||
parse_rtattr_nested(mbrinfo, IFLA_BOND_SLAVE_MAX,
|
|
||||||
linkinfo[IFLA_INFO_SLAVE_DATA]);
|
linkinfo[IFLA_INFO_SLAVE_DATA]);
|
||||||
if (mbrinfo[IFLA_BOND_SLAVE_AD_RX_BYPASS])
|
if (mbrinfo[IFLA_BOND_SLAVE_AD_RX_BYPASS])
|
||||||
bypass = *(uint8_t *)RTA_DATA(
|
bypass = *(uint8_t *)RTA_DATA(
|
||||||
|
@ -910,7 +900,6 @@ static int netlink_interface(struct nlmsghdr *h, ns_id_t ns_id, int startup)
|
||||||
return netlink_bridge_interface(h, len, ns_id, startup);
|
return netlink_bridge_interface(h, len, ns_id, startup);
|
||||||
|
|
||||||
/* Looking up interface name. */
|
/* Looking up interface name. */
|
||||||
memset(tb, 0, sizeof(tb));
|
|
||||||
memset(linkinfo, 0, sizeof(linkinfo));
|
memset(linkinfo, 0, sizeof(linkinfo));
|
||||||
netlink_parse_rtattr(tb, IFLA_MAX, IFLA_RTA(ifi), len);
|
netlink_parse_rtattr(tb, IFLA_MAX, IFLA_RTA(ifi), len);
|
||||||
|
|
||||||
|
@ -930,7 +919,8 @@ static int netlink_interface(struct nlmsghdr *h, ns_id_t ns_id, int startup)
|
||||||
desc = (char *)RTA_DATA(tb[IFLA_IFALIAS]);
|
desc = (char *)RTA_DATA(tb[IFLA_IFALIAS]);
|
||||||
|
|
||||||
if (tb[IFLA_LINKINFO]) {
|
if (tb[IFLA_LINKINFO]) {
|
||||||
parse_rtattr_nested(linkinfo, IFLA_INFO_MAX, tb[IFLA_LINKINFO]);
|
netlink_parse_rtattr_nested(linkinfo, IFLA_INFO_MAX,
|
||||||
|
tb[IFLA_LINKINFO]);
|
||||||
|
|
||||||
if (linkinfo[IFLA_INFO_KIND])
|
if (linkinfo[IFLA_INFO_KIND])
|
||||||
kind = RTA_DATA(linkinfo[IFLA_INFO_KIND]);
|
kind = RTA_DATA(linkinfo[IFLA_INFO_KIND]);
|
||||||
|
@ -1303,7 +1293,6 @@ int netlink_interface_addr(struct nlmsghdr *h, ns_id_t ns_id, int startup)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(tb, 0, sizeof(tb));
|
|
||||||
netlink_parse_rtattr(tb, IFA_MAX, IFA_RTA(ifa), len);
|
netlink_parse_rtattr(tb, IFA_MAX, IFA_RTA(ifa), len);
|
||||||
|
|
||||||
ifp = if_lookup_by_index_per_ns(zns, ifa->ifa_index);
|
ifp = if_lookup_by_index_per_ns(zns, ifa->ifa_index);
|
||||||
|
@ -1519,7 +1508,6 @@ int netlink_link_change(struct nlmsghdr *h, ns_id_t ns_id, int startup)
|
||||||
return netlink_bridge_interface(h, len, ns_id, startup);
|
return netlink_bridge_interface(h, len, ns_id, startup);
|
||||||
|
|
||||||
/* Looking up interface name. */
|
/* Looking up interface name. */
|
||||||
memset(tb, 0, sizeof(tb));
|
|
||||||
memset(linkinfo, 0, sizeof(linkinfo));
|
memset(linkinfo, 0, sizeof(linkinfo));
|
||||||
netlink_parse_rtattr(tb, IFLA_MAX, IFLA_RTA(ifi), len);
|
netlink_parse_rtattr(tb, IFLA_MAX, IFLA_RTA(ifi), len);
|
||||||
|
|
||||||
|
@ -1536,7 +1524,8 @@ int netlink_link_change(struct nlmsghdr *h, ns_id_t ns_id, int startup)
|
||||||
name = (char *)RTA_DATA(tb[IFLA_IFNAME]);
|
name = (char *)RTA_DATA(tb[IFLA_IFNAME]);
|
||||||
|
|
||||||
if (tb[IFLA_LINKINFO]) {
|
if (tb[IFLA_LINKINFO]) {
|
||||||
parse_rtattr_nested(linkinfo, IFLA_INFO_MAX, tb[IFLA_LINKINFO]);
|
netlink_parse_rtattr_nested(linkinfo, IFLA_INFO_MAX,
|
||||||
|
tb[IFLA_LINKINFO]);
|
||||||
|
|
||||||
if (linkinfo[IFLA_INFO_KIND])
|
if (linkinfo[IFLA_INFO_KIND])
|
||||||
kind = RTA_DATA(linkinfo[IFLA_INFO_KIND]);
|
kind = RTA_DATA(linkinfo[IFLA_INFO_KIND]);
|
||||||
|
|
|
@ -493,6 +493,7 @@ void netlink_parse_rtattr_flags(struct rtattr **tb, int max,
|
||||||
{
|
{
|
||||||
unsigned short type;
|
unsigned short type;
|
||||||
|
|
||||||
|
memset(tb, 0, sizeof(struct rtattr *) * (max + 1));
|
||||||
while (RTA_OK(rta, len)) {
|
while (RTA_OK(rta, len)) {
|
||||||
type = rta->rta_type & ~flags;
|
type = rta->rta_type & ~flags;
|
||||||
if ((type <= max) && (!tb[type]))
|
if ((type <= max) && (!tb[type]))
|
||||||
|
@ -504,6 +505,7 @@ void netlink_parse_rtattr_flags(struct rtattr **tb, int max,
|
||||||
void netlink_parse_rtattr(struct rtattr **tb, int max, struct rtattr *rta,
|
void netlink_parse_rtattr(struct rtattr **tb, int max, struct rtattr *rta,
|
||||||
int len)
|
int len)
|
||||||
{
|
{
|
||||||
|
memset(tb, 0, sizeof(struct rtattr *) * (max + 1));
|
||||||
while (RTA_OK(rta, len)) {
|
while (RTA_OK(rta, len)) {
|
||||||
if (rta->rta_type <= max)
|
if (rta->rta_type <= max)
|
||||||
tb[rta->rta_type] = rta;
|
tb[rta->rta_type] = rta;
|
||||||
|
|
|
@ -509,8 +509,6 @@ static uint8_t parse_multipath_nexthops_unicast(ns_id_t ns_id,
|
||||||
nh_vrf_id = vrf_id;
|
nh_vrf_id = vrf_id;
|
||||||
|
|
||||||
if (rtnh->rtnh_len > sizeof(*rtnh)) {
|
if (rtnh->rtnh_len > sizeof(*rtnh)) {
|
||||||
memset(rtnh_tb, 0, sizeof(rtnh_tb));
|
|
||||||
|
|
||||||
netlink_parse_rtattr(rtnh_tb, RTA_MAX, RTNH_DATA(rtnh),
|
netlink_parse_rtattr(rtnh_tb, RTA_MAX, RTNH_DATA(rtnh),
|
||||||
rtnh->rtnh_len - sizeof(*rtnh));
|
rtnh->rtnh_len - sizeof(*rtnh));
|
||||||
if (rtnh_tb[RTA_GATEWAY])
|
if (rtnh_tb[RTA_GATEWAY])
|
||||||
|
@ -628,7 +626,6 @@ static int netlink_route_change_read_unicast(struct nlmsghdr *h, ns_id_t ns_id,
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(tb, 0, sizeof(tb));
|
|
||||||
netlink_parse_rtattr(tb, RTA_MAX, RTM_RTA(rtm), len);
|
netlink_parse_rtattr(tb, RTA_MAX, RTM_RTA(rtm), len);
|
||||||
|
|
||||||
if (rtm->rtm_flags & RTM_F_CLONED)
|
if (rtm->rtm_flags & RTM_F_CLONED)
|
||||||
|
@ -713,7 +710,6 @@ static int netlink_route_change_read_unicast(struct nlmsghdr *h, ns_id_t ns_id,
|
||||||
if (tb[RTA_METRICS]) {
|
if (tb[RTA_METRICS]) {
|
||||||
struct rtattr *mxrta[RTAX_MAX + 1];
|
struct rtattr *mxrta[RTAX_MAX + 1];
|
||||||
|
|
||||||
memset(mxrta, 0, sizeof(mxrta));
|
|
||||||
netlink_parse_rtattr(mxrta, RTAX_MAX, RTA_DATA(tb[RTA_METRICS]),
|
netlink_parse_rtattr(mxrta, RTAX_MAX, RTA_DATA(tb[RTA_METRICS]),
|
||||||
RTA_PAYLOAD(tb[RTA_METRICS]));
|
RTA_PAYLOAD(tb[RTA_METRICS]));
|
||||||
|
|
||||||
|
@ -920,7 +916,6 @@ static int netlink_route_change_read_multicast(struct nlmsghdr *h,
|
||||||
|
|
||||||
len = h->nlmsg_len - NLMSG_LENGTH(sizeof(struct rtmsg));
|
len = h->nlmsg_len - NLMSG_LENGTH(sizeof(struct rtmsg));
|
||||||
|
|
||||||
memset(tb, 0, sizeof(tb));
|
|
||||||
netlink_parse_rtattr(tb, RTA_MAX, RTM_RTA(rtm), len);
|
netlink_parse_rtattr(tb, RTA_MAX, RTM_RTA(rtm), len);
|
||||||
|
|
||||||
if (tb[RTA_TABLE])
|
if (tb[RTA_TABLE])
|
||||||
|
@ -2875,7 +2870,6 @@ static int netlink_macfdb_change(struct nlmsghdr *h, int len, ns_id_t ns_id)
|
||||||
/* Parse attributes and extract fields of interest. Do basic
|
/* Parse attributes and extract fields of interest. Do basic
|
||||||
* validation of the fields.
|
* validation of the fields.
|
||||||
*/
|
*/
|
||||||
memset(tb, 0, sizeof tb);
|
|
||||||
netlink_parse_rtattr_flags(tb, NDA_MAX, NDA_RTA(ndm), len,
|
netlink_parse_rtattr_flags(tb, NDA_MAX, NDA_RTA(ndm), len,
|
||||||
NLA_F_NESTED);
|
NLA_F_NESTED);
|
||||||
|
|
||||||
|
@ -3348,7 +3342,6 @@ static int netlink_ipneigh_change(struct nlmsghdr *h, int len, ns_id_t ns_id)
|
||||||
zif = (struct zebra_if *)ifp->info;
|
zif = (struct zebra_if *)ifp->info;
|
||||||
|
|
||||||
/* Parse attributes and extract fields of interest. */
|
/* Parse attributes and extract fields of interest. */
|
||||||
memset(tb, 0, sizeof(tb));
|
|
||||||
netlink_parse_rtattr(tb, NDA_MAX, NDA_RTA(ndm), len);
|
netlink_parse_rtattr(tb, NDA_MAX, NDA_RTA(ndm), len);
|
||||||
|
|
||||||
if (!tb[NDA_DST]) {
|
if (!tb[NDA_DST]) {
|
||||||
|
|
Loading…
Reference in a new issue