From: Pat Ruddy Date: Thu, 25 Mar 2021 14:39:07 +0000 (+0000) Subject: lib, bgpd: add a specific oid_copy function for IPv6 addrs X-Git-Tag: base_8.0~213^2 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=9e26322126ed6daef7ae16b4c9a547ae28a02226;p=matthieu%2Ffrr.git lib, bgpd: add a specific oid_copy function for IPv6 addrs Do not overload the v4 oid_copy_addr function for ipv6 coverity does not like this kind of thing. Signed-off-by: Pat Ruddy --- diff --git a/bgpd/bgp_mplsvpn_snmp.c b/bgpd/bgp_mplsvpn_snmp.c index b74cf37ac7..6f75856d54 100644 --- a/bgpd/bgp_mplsvpn_snmp.c +++ b/bgpd/bgp_mplsvpn_snmp.c @@ -1478,10 +1478,16 @@ static struct bgp_path_info *bgpL3vpnRte_lookup(struct variable *v, oid name[], oid_copy_str(&name[namelen], (*l3vpn_bgp)->name, vrf_name_len); oid_index = namelen + vrf_name_len; - name[oid_index++] = - v4 ? INETADDRESSTYPEIPV4 : INETADDRESSTYPEIPV6; - oid_copy_addr(&name[oid_index], &p->u.prefix4, - addr_len); + if (v4) { + name[oid_index++] = INETADDRESSTYPEIPV4; + oid_copy_in_addr(&name[oid_index], + &p->u.prefix4); + } else { + name[oid_index++] = INETADDRESSTYPEIPV6; + oid_copy_in6_addr(&name[oid_index], + &p->u.prefix6); + } + oid_index += addr_len; name[oid_index++] = p->prefixlen; name[oid_index++] = *policy >> 8; @@ -1493,9 +1499,8 @@ static struct bgp_path_info *bgpL3vpnRte_lookup(struct variable *v, oid name[], INETADDRESSTYPEUNKNOWN; else { name[oid_index++] = INETADDRESSTYPEIPV4; - oid_copy_addr(&name[oid_index], - &attr->nexthop, - sizeof(struct in_addr)); + oid_copy_in_addr(&name[oid_index], + &attr->nexthop); oid_index += sizeof(struct in_addr); } } else { @@ -1505,11 +1510,9 @@ static struct bgp_path_info *bgpL3vpnRte_lookup(struct variable *v, oid name[], INETADDRESSTYPEUNKNOWN; else { name[oid_index++] = INETADDRESSTYPEIPV6; - oid_copy_addr( + oid_copy_in6_addr( &name[oid_index], - (struct in_addr *)&attr - ->mp_nexthop_global, - sizeof(struct in6_addr)); + &attr->mp_nexthop_global); oid_index += sizeof(struct in6_addr); } } diff --git a/bgpd/bgp_snmp.c b/bgpd/bgp_snmp.c index bc26314b50..3afdbea908 100644 --- a/bgpd/bgp_snmp.c +++ b/bgpd/bgp_snmp.c @@ -435,7 +435,7 @@ static struct peer *bgpPeerTable_lookup(struct variable *v, oid name[], if (peer == NULL) return NULL; - oid_copy_addr(name + namelen, addr, sizeof(struct in_addr)); + oid_copy_in_addr(name + namelen, addr); *length = sizeof(struct in_addr) + namelen; return peer; @@ -767,14 +767,12 @@ static struct bgp_path_info *bgp4PathAttrLookup(struct variable *v, oid name[], v->namelen + BGP_PATHATTR_ENTRY_OFFSET; offset = name + v->namelen; - oid_copy_addr(offset, &rn_p->u.prefix4, - IN_ADDR_SIZE); + oid_copy_in_addr(offset, &rn_p->u.prefix4); offset += IN_ADDR_SIZE; *offset = rn_p->prefixlen; offset++; - oid_copy_addr(offset, - &min->peer->su.sin.sin_addr, - IN_ADDR_SIZE); + oid_copy_in_addr(offset, + &min->peer->su.sin.sin_addr); addr->prefix = rn_p->u.prefix4; addr->prefixlen = rn_p->prefixlen; @@ -868,7 +866,7 @@ static int bgpTrapEstablished(struct peer *peer) if (ret == 0) return 0; - oid_copy_addr(index, &addr, IN_ADDR_SIZE); + oid_copy_in_addr(index, &addr); smux_trap(bgp_variables, array_size(bgp_variables), bgp_trap_oid, array_size(bgp_trap_oid), bgp_oid, @@ -887,7 +885,7 @@ static int bgpTrapBackwardTransition(struct peer *peer) if (ret == 0) return 0; - oid_copy_addr(index, &addr, IN_ADDR_SIZE); + oid_copy_in_addr(index, &addr); smux_trap(bgp_variables, array_size(bgp_variables), bgp_trap_oid, array_size(bgp_trap_oid), bgp_oid, diff --git a/eigrpd/eigrp_snmp.c b/eigrpd/eigrp_snmp.c index 3b232be386..9ada292feb 100644 --- a/eigrpd/eigrp_snmp.c +++ b/eigrpd/eigrp_snmp.c @@ -588,8 +588,7 @@ static struct eigrp_neighbor *eigrpNbrLookup(struct variable *v, oid *name, if (nbr) { *length = v->namelen + IN_ADDR_SIZE + 1; - oid_copy_addr(name + v->namelen, nbr_addr, - IN_ADDR_SIZE); + oid_copy_in_addr(name + v->namelen, nbr_addr); name[v->namelen + IN_ADDR_SIZE] = *ifindex; return nbr; } diff --git a/ldpd/ldp_snmp.c b/ldpd/ldp_snmp.c index 3f59d18aa8..9fb4e46515 100644 --- a/ldpd/ldp_snmp.c +++ b/ldpd/ldp_snmp.c @@ -301,8 +301,7 @@ static uint8_t *ldpEntityTable(struct variable *v, oid name[], size_t *length, /* Append index */ *length = LDP_ENTITY_TOTAL_LEN; - oid_copy_addr(name + v->namelen, &entityLdpId, - IN_ADDR_SIZE); + oid_copy_in_addr(name + v->namelen, &entityLdpId); name[v->namelen + 4] = 0; name[v->namelen + 5] = 0; name[v->namelen + 6] = LDP_DEFAULT_ENTITY_INDEX; @@ -402,8 +401,7 @@ static uint8_t *ldpEntityStatsTable(struct variable *v, oid name[], /* Append index */ *length = LDP_ENTITY_TOTAL_LEN; - oid_copy_addr(name + v->namelen, &entityLdpId, - IN_ADDR_SIZE); + oid_copy_in_addr(name + v->namelen, &entityLdpId); name[v->namelen + 4] = 0; name[v->namelen + 5] = 0; name[v->namelen + 6] = LDP_DEFAULT_ENTITY_INDEX; @@ -640,13 +638,11 @@ static uint8_t *ldpHelloAdjacencyTable(struct variable *v, oid name[], size_t *l struct in_addr peerLdpId = ctl_adj->id; - oid_copy_addr(name + v->namelen, &entityLdpId, - sizeof(struct in_addr)); + oid_copy_in_addr(name + v->namelen, &entityLdpId); name[v->namelen + 4] = 0; name[v->namelen + 5] = 0; name[v->namelen + 6] = LDP_DEFAULT_ENTITY_INDEX; - oid_copy_addr(name + v->namelen + 7, &peerLdpId, - sizeof(struct in_addr)); + oid_copy_in_addr(name + v->namelen + 7, &peerLdpId); name[v->namelen + 11] = 0; name[v->namelen + 12] = 0; name[v->namelen + 13] = adjacencyIndex; @@ -804,14 +800,12 @@ static uint8_t *ldpPeerTable(struct variable *v, oid name[], size_t *length, memcpy(name, v->name, v->namelen * sizeof(oid)); /* Append index */ - oid_copy_addr(name + v->namelen, &entityLdpId, - sizeof(struct in_addr)); + oid_copy_in_addr(name + v->namelen, &entityLdpId); name[v->namelen + 4] = 0; name[v->namelen + 5] = 0; name[v->namelen + 6] = entityIndex; - oid_copy_addr(name + v->namelen + 7, &peerLdpId, - sizeof(struct in_addr)); + oid_copy_in_addr(name + v->namelen + 7, &peerLdpId); name[v->namelen + 11] = 0; name[v->namelen + 12] = 0; @@ -875,14 +869,12 @@ static uint8_t *ldpSessionTable(struct variable *v, oid name[], size_t *length, memcpy(name, v->name, v->namelen * sizeof(oid)); /* Append index */ - oid_copy_addr(name + v->namelen, &entityLdpId, - sizeof(struct in_addr)); + oid_copy_in_addr(name + v->namelen, &entityLdpId); name[v->namelen + 4] = 0; name[v->namelen + 5] = 0; name[v->namelen + 6] = entityIndex; - oid_copy_addr(name + v->namelen + 7, &peerLdpId, - sizeof(struct in_addr)); + oid_copy_in_addr(name + v->namelen + 7, &peerLdpId); name[v->namelen + 11] = 0; name[v->namelen + 12] = 0; @@ -961,13 +953,11 @@ static uint8_t *ldpSessionStatsTable(struct variable *v, oid name[], memcpy(name, v->name, v->namelen * sizeof(oid)); /* Append index */ - oid_copy_addr(name + v->namelen, &entityLdpId, - sizeof(struct in_addr)); + oid_copy_in_addr(name + v->namelen, &entityLdpId); name[v->namelen + 4] = 0; name[v->namelen + 5] = 0; name[v->namelen + 6] = entityIndex; - oid_copy_addr(name + v->namelen + 7, &peerLdpId, - sizeof(struct in_addr)); + oid_copy_in_addr(name + v->namelen + 7, &peerLdpId); name[v->namelen + 11] = 0; name[v->namelen + 12] = 0; @@ -1147,15 +1137,15 @@ ldpTrapSession(struct nbr * nbr, unsigned int sptrap) entityIndex = LDP_DEFAULT_ENTITY_INDEX; peerLdpId = ctl_nbr->id; - oid_copy_addr(index, &entityLdpId, sizeof(struct in_addr)); - index[4] = 0; - index[5] = 0; - index[6] = entityIndex; - oid_copy_addr(&index[7], &peerLdpId, sizeof(struct in_addr)); - index[11] = 0; - index[12] = 0; + oid_copy_in_addr(index, &entityLdpId); + index[4] = 0; + index[5] = 0; + index[6] = entityIndex; + oid_copy_in_addr(&index[7], &peerLdpId); + index[11] = 0; + index[12] = 0; - index[LDP_PEER_ENTRY_MAX_IDX_LEN] = 0; + index[LDP_PEER_ENTRY_MAX_IDX_LEN] = 0; smux_trap(ldpe_variables, array_size(ldpe_variables), ldp_trap_oid, array_size(ldp_trap_oid), ldp_oid, diff --git a/lib/smux.h b/lib/smux.h index c063833e41..74447341d8 100644 --- a/lib/smux.h +++ b/lib/smux.h @@ -152,7 +152,8 @@ extern void oid2in_addr(oid[], int, struct in_addr *); extern void oid2in6_addr(oid oid[], struct in6_addr *addr); extern void oid2int(oid oid[], int *dest); extern void *oid_copy(void *, const void *, size_t); -extern void oid_copy_addr(oid[], const struct in_addr *, int); +extern void oid_copy_in_addr(oid[], const struct in_addr *); +extern void oid_copy_in6_addr(oid[], const struct in6_addr *); extern void oid_copy_int(oid oid[], int *val); extern void oid2string(oid oid[], int len, char *string); extern void oid_copy_str(oid oid[], const char *string, int len); diff --git a/lib/snmp.c b/lib/snmp.c index 17a4ed4a1d..23d3f38b31 100644 --- a/lib/snmp.c +++ b/lib/snmp.c @@ -88,13 +88,24 @@ void oid2int(oid oid[], int *dest) *dest = ntohl(network_dest); } -void oid_copy_addr(oid oid[], const struct in_addr *addr, int len) +void oid_copy_in_addr(oid oid[], const struct in_addr *addr) { int i; const uint8_t *pnt; + int len = sizeof(struct in_addr); - if (len == 0) - return; + pnt = (uint8_t *)addr; + + for (i = 0; i < len; i++) + oid[i] = *pnt++; +} + + +void oid_copy_in6_addr(oid oid[], const struct in6_addr *addr) +{ + int i; + const uint8_t *pnt; + int len = sizeof(struct in6_addr); pnt = (uint8_t *)addr; diff --git a/ospfd/ospf_snmp.c b/ospfd/ospf_snmp.c index 8418bbf2b9..43b998ac5b 100644 --- a/ospfd/ospf_snmp.c +++ b/ospfd/ospf_snmp.c @@ -674,7 +674,7 @@ static struct ospf_area *ospfAreaLookup(struct variable *v, oid name[], if (area == NULL) return NULL; - oid_copy_addr(name + v->namelen, addr, sizeof(struct in_addr)); + oid_copy_in_addr(name + v->namelen, addr); *length = sizeof(struct in_addr) + v->namelen; return area; @@ -800,7 +800,7 @@ static struct ospf_area *ospfStubAreaLookup(struct variable *v, oid name[], if (area == NULL) return NULL; - oid_copy_addr(name + v->namelen, addr, sizeof(struct in_addr)); + oid_copy_in_addr(name + v->namelen, addr); /* Set TOS 0. */ name[v->namelen + sizeof(struct in_addr)] = 0; *length = v->namelen + sizeof(struct in_addr) + 1; @@ -1008,15 +1008,14 @@ static struct ospf_lsa *ospfLsdbLookup(struct variable *v, oid *name, /* Fill in value. */ offset = name + v->namelen; - oid_copy_addr(offset, area_id, IN_ADDR_SIZE); + oid_copy_in_addr(offset, area_id); offset += IN_ADDR_SIZE; *offset = lsa->data->type; offset++; - oid_copy_addr(offset, &lsa->data->id, - IN_ADDR_SIZE); + oid_copy_in_addr(offset, &lsa->data->id); offset += IN_ADDR_SIZE; - oid_copy_addr(offset, &lsa->data->adv_router, - IN_ADDR_SIZE); + oid_copy_in_addr(offset, + &lsa->data->adv_router); return lsa; } @@ -1170,9 +1169,9 @@ static struct ospf_area_range *ospfAreaRangeLookup(struct variable *v, /* Fill in value. */ offset = name + v->namelen; - oid_copy_addr(offset, area_id, IN_ADDR_SIZE); + oid_copy_in_addr(offset, area_id); offset += IN_ADDR_SIZE; - oid_copy_addr(offset, range_net, IN_ADDR_SIZE); + oid_copy_in_addr(offset, range_net); return range; } @@ -1573,7 +1572,7 @@ static struct ospf_interface *ospfIfLookup(struct variable *v, oid *name, if (oi) { *length = v->namelen + IN_ADDR_SIZE + 1; offset = name + v->namelen; - oid_copy_addr(offset, ifaddr, IN_ADDR_SIZE); + oid_copy_in_addr(offset, ifaddr); offset += IN_ADDR_SIZE; *offset = *ifindex; return oi; @@ -1717,7 +1716,7 @@ static struct ospf_interface *ospfIfMetricLookup(struct variable *v, oid *name, if (oi) { *length = v->namelen + IN_ADDR_SIZE + 1 + 1; offset = name + v->namelen; - oid_copy_addr(offset, ifaddr, IN_ADDR_SIZE); + oid_copy_in_addr(offset, ifaddr); offset += IN_ADDR_SIZE; *offset = *ifindex; offset++; @@ -1906,9 +1905,9 @@ ospfVirtIfLookup(struct variable *v, oid *name, size_t *length, if (vl_data) { *length = v->namelen + IN_ADDR_SIZE + IN_ADDR_SIZE; - oid_copy_addr(name + v->namelen, area_id, IN_ADDR_SIZE); - oid_copy_addr(name + v->namelen + IN_ADDR_SIZE, - neighbor, IN_ADDR_SIZE); + oid_copy_in_addr(name + v->namelen, area_id); + oid_copy_in_addr(name + v->namelen + IN_ADDR_SIZE, + neighbor); return vl_data; } } @@ -2083,8 +2082,7 @@ static struct ospf_neighbor *ospfNbrLookup(struct variable *v, oid *name, if (nbr) { *length = v->namelen + IN_ADDR_SIZE + 1; - oid_copy_addr(name + v->namelen, nbr_addr, - IN_ADDR_SIZE); + oid_copy_in_addr(name + v->namelen, nbr_addr); name[v->namelen + IN_ADDR_SIZE] = *ifindex; return nbr; } @@ -2307,10 +2305,9 @@ static struct ospf_lsa *ospfExtLsdbLookup(struct variable *v, oid *name, *offset = OSPF_AS_EXTERNAL_LSA; offset++; - oid_copy_addr(offset, &lsa->data->id, IN_ADDR_SIZE); + oid_copy_in_addr(offset, &lsa->data->id); offset += IN_ADDR_SIZE; - oid_copy_addr(offset, &lsa->data->adv_router, - IN_ADDR_SIZE); + oid_copy_in_addr(offset, &lsa->data->adv_router); return lsa; } @@ -2440,7 +2437,7 @@ static void ospfTrapNbrStateChange(struct ospf_neighbor *on) zlog_info("%s: trap sent: %pI4 now %s", __func__, &on->address.u.prefix4, msgbuf); - oid_copy_addr(index, &(on->address.u.prefix4), IN_ADDR_SIZE); + oid_copy_in_addr(index, &(on->address.u.prefix4)); index[IN_ADDR_SIZE] = 0; smux_trap(ospf_variables, array_size(ospf_variables), ospf_trap_oid, @@ -2455,7 +2452,7 @@ static void ospfTrapVirtNbrStateChange(struct ospf_neighbor *on) zlog_info("ospfTrapVirtNbrStateChange trap sent"); - oid_copy_addr(index, &(on->address.u.prefix4), IN_ADDR_SIZE); + oid_copy_in_addr(index, &(on->address.u.prefix4)); index[IN_ADDR_SIZE] = 0; smux_trap(ospf_variables, array_size(ospf_variables), ospf_trap_oid, @@ -2499,7 +2496,7 @@ static void ospfTrapIfStateChange(struct ospf_interface *oi) &oi->address->u.prefix4, lookup_msg(ospf_ism_state_msg, oi->state, NULL)); - oid_copy_addr(index, &(oi->address->u.prefix4), IN_ADDR_SIZE); + oid_copy_in_addr(index, &(oi->address->u.prefix4)); index[IN_ADDR_SIZE] = 0; smux_trap(ospf_variables, array_size(ospf_variables), ospf_trap_oid, @@ -2514,7 +2511,7 @@ static void ospfTrapVirtIfStateChange(struct ospf_interface *oi) zlog_info("ospfTrapVirtIfStateChange trap sent"); - oid_copy_addr(index, &(oi->address->u.prefix4), IN_ADDR_SIZE); + oid_copy_in_addr(index, &(oi->address->u.prefix4)); index[IN_ADDR_SIZE] = 0; smux_trap(ospf_variables, array_size(ospf_variables), ospf_trap_oid, diff --git a/ripd/rip_snmp.c b/ripd/rip_snmp.c index 37bce7484c..b922d66912 100644 --- a/ripd/rip_snmp.c +++ b/ripd/rip_snmp.c @@ -271,7 +271,7 @@ static struct interface *rip2IfLookup(struct variable *v, oid name[], if (ifp == NULL) return NULL; - oid_copy_addr(name + v->namelen, addr, sizeof(struct in_addr)); + oid_copy_in_addr(name + v->namelen, addr); *length = v->namelen + sizeof(struct in_addr); @@ -320,8 +320,8 @@ static struct rip_peer *rip2PeerLookup(struct variable *v, oid name[], || (peer->domain > (int)name[v->namelen + sizeof(struct in_addr)])) { - oid_copy_addr(name + v->namelen, &peer->addr, - sizeof(struct in_addr)); + oid_copy_in_addr(name + v->namelen, + &peer->addr); name[v->namelen + sizeof(struct in_addr)] = peer->domain; *length = @@ -334,8 +334,7 @@ static struct rip_peer *rip2PeerLookup(struct variable *v, oid name[], if (!peer) return NULL; - oid_copy_addr(name + v->namelen, &peer->addr, - sizeof(struct in_addr)); + oid_copy_in_addr(name + v->namelen, &peer->addr); name[v->namelen + sizeof(struct in_addr)] = peer->domain; *length = sizeof(struct in_addr) + v->namelen + 1;