Merge pull request #8629 from donaldsharp/parse_rtattr

Parse rtattr
This commit is contained in:
Igor Ryzhov 2021-05-12 11:38:09 +03:00 committed by GitHub
commit 17daea8a18
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 16 additions and 32 deletions

View file

@ -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]);

View file

@ -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;

View file

@ -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]) {