From c8ff56ac14938c5f5136b1af51070292678dc793 Mon Sep 17 00:00:00 2001 From: Claudio Jeker Date: Mon, 25 Feb 2019 11:51:59 +0000 Subject: Use struct bgpd_addr instead of a union of sockaddrs to store addresses in the mrt dump structs. This is more compatible with bgpctl since it uses struct bgpd_addr in most cases anyway. OK kn@ --- usr.sbin/bgpctl/bgpctl.c | 55 ++++---------- usr.sbin/bgpctl/mrtparser.c | 173 +++++++++++++++++++++++--------------------- usr.sbin/bgpctl/mrtparser.h | 46 ++++-------- 3 files changed, 117 insertions(+), 157 deletions(-) (limited to 'usr.sbin/bgpctl') diff --git a/usr.sbin/bgpctl/bgpctl.c b/usr.sbin/bgpctl/bgpctl.c index 7ffb811cf8e..ffd2562542e 100644 --- a/usr.sbin/bgpctl/bgpctl.c +++ b/usr.sbin/bgpctl/bgpctl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: bgpctl.c,v 1.232 2019/02/21 12:12:46 claudio Exp $ */ +/* $OpenBSD: bgpctl.c,v 1.233 2019/02/25 11:51:58 claudio Exp $ */ /* * Copyright (c) 2003 Henning Brauer @@ -93,7 +93,6 @@ void show_mrt_dump(struct mrt_rib *, struct mrt_peer *, void *); void network_mrt_dump(struct mrt_rib *, struct mrt_peer *, void *); void show_mrt_state(struct mrt_bgp_state *, void *); void show_mrt_msg(struct mrt_bgp_msg *, void *); -void mrt_to_bgpd_addr(union mrt_addr *, struct bgpd_addr *); const char *msg_type(u_int8_t); void network_bulk(struct parse_result *); const char *print_auth_method(enum auth_method); @@ -2000,11 +1999,11 @@ show_mrt_dump(struct mrt_rib *mr, struct mrt_peer *mp, void *arg) for (i = 0; i < mr->nentries; i++) { mre = &mr->entries[i]; bzero(&ctl, sizeof(ctl)); - mrt_to_bgpd_addr(&mr->prefix, &ctl.prefix); + ctl.prefix = mr->prefix; ctl.prefixlen = mr->prefixlen; ctl.lastchange = mre->originated; - mrt_to_bgpd_addr(&mre->nexthop, &ctl.true_nexthop); - mrt_to_bgpd_addr(&mre->nexthop, &ctl.exit_nexthop); + ctl.true_nexthop = mre->nexthop; + ctl.exit_nexthop = mre->nexthop; ctl.origin = mre->origin; ctl.local_pref = mre->local_pref; ctl.med = mre->med; @@ -2012,8 +2011,7 @@ show_mrt_dump(struct mrt_rib *mr, struct mrt_peer *mp, void *arg) ctl.aspath_len = mre->aspath_len; if (mre->peer_idx < mp->npeers) { - mrt_to_bgpd_addr(&mp->peers[mre->peer_idx].addr, - &ctl.remote_addr); + ctl.remote_addr = mp->peers[mre->peer_idx].addr; ctl.remote_id = mp->peers[mre->peer_idx].bgp_id; } @@ -2066,19 +2064,18 @@ network_mrt_dump(struct mrt_rib *mr, struct mrt_peer *mp, void *arg) for (i = 0; i < mr->nentries; i++) { mre = &mr->entries[i]; bzero(&ctl, sizeof(ctl)); - mrt_to_bgpd_addr(&mr->prefix, &ctl.prefix); + ctl.prefix = mr->prefix; ctl.prefixlen = mr->prefixlen; ctl.lastchange = mre->originated; - mrt_to_bgpd_addr(&mre->nexthop, &ctl.true_nexthop); - mrt_to_bgpd_addr(&mre->nexthop, &ctl.exit_nexthop); + ctl.true_nexthop = mre->nexthop; + ctl.exit_nexthop = mre->nexthop; ctl.origin = mre->origin; ctl.local_pref = mre->local_pref; ctl.med = mre->med; ctl.aspath_len = mre->aspath_len; if (mre->peer_idx < mp->npeers) { - mrt_to_bgpd_addr(&mp->peers[mre->peer_idx].addr, - &ctl.remote_addr); + ctl.remote_addr = mp->peers[mre->peer_idx].addr; ctl.remote_id = mp->peers[mre->peer_idx].bgp_id; } @@ -2151,13 +2148,9 @@ print_time(struct timespec *t) void show_mrt_state(struct mrt_bgp_state *ms, void *arg) { - struct bgpd_addr src, dst; - - mrt_to_bgpd_addr(&ms->src, &src); - mrt_to_bgpd_addr(&ms->dst, &dst); printf("%s %s[%u] -> ", print_time(&ms->time), - log_addr(&src), ms->src_as); - printf("%s[%u]: %s -> %s\n", log_addr(&dst), ms->dst_as, + log_addr(&ms->src), ms->src_as); + printf("%s[%u]: %s -> %s\n", log_addr(&ms->dst), ms->dst_as, statenames[ms->old_state], statenames[ms->new_state]); } @@ -2530,16 +2523,13 @@ show_mrt_msg(struct mrt_bgp_msg *mm, void *arg) static const u_int8_t marker[MSGSIZE_HEADER_MARKER] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; - struct bgpd_addr src, dst; u_char *p; u_int16_t len; u_int8_t type; - mrt_to_bgpd_addr(&mm->src, &src); - mrt_to_bgpd_addr(&mm->dst, &dst); printf("%s %s[%u] -> ", print_time(&mm->time), - log_addr(&src), mm->src_as); - printf("%s[%u]: size %u ", log_addr(&dst), mm->dst_as, mm->msg_len); + log_addr(&mm->src), mm->src_as); + printf("%s[%u]: size %u ", log_addr(&mm->dst), mm->dst_as, mm->msg_len); p = mm->msg; len = mm->msg_len; @@ -2614,25 +2604,6 @@ show_mrt_msg(struct mrt_bgp_msg *mm, void *arg) printf("\n"); } -void -mrt_to_bgpd_addr(union mrt_addr *ma, struct bgpd_addr *ba) -{ - switch (ma->sa.sa_family) { - case AF_INET: - case AF_INET6: - sa2addr(&ma->sa, ba); - break; - case AF_VPNv4: - bzero(ba, sizeof(*ba)); - ba->aid = AID_VPN_IPv4; - ba->vpn4.rd = ma->svpn4.sv_rd; - ba->vpn4.addr.s_addr = ma->svpn4.sv_addr.s_addr; - memcpy(ba->vpn4.labelstack, ma->svpn4.sv_label, - sizeof(ba->vpn4.labelstack)); - break; - } -} - const char * msg_type(u_int8_t type) { diff --git a/usr.sbin/bgpctl/mrtparser.c b/usr.sbin/bgpctl/mrtparser.c index 5b11098b182..4a930a5e5db 100644 --- a/usr.sbin/bgpctl/mrtparser.c +++ b/usr.sbin/bgpctl/mrtparser.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mrtparser.c,v 1.9 2018/07/20 12:49:49 claudio Exp $ */ +/* $OpenBSD: mrtparser.c,v 1.10 2019/02/25 11:51:58 claudio Exp $ */ /* * Copyright (c) 2011 Claudio Jeker * @@ -38,7 +38,7 @@ int mrt_parse_dump(struct mrt_hdr *, void *, struct mrt_peer **, struct mrt_rib **); int mrt_parse_dump_mp(struct mrt_hdr *, void *, struct mrt_peer **, struct mrt_rib **); -int mrt_extract_attr(struct mrt_rib_entry *, u_char *, int, sa_family_t, +int mrt_extract_attr(struct mrt_rib_entry *, u_char *, int, u_int8_t, int); void mrt_free_peers(struct mrt_peer *); @@ -47,7 +47,7 @@ void mrt_free_bgp_state(struct mrt_bgp_state *); void mrt_free_bgp_msg(struct mrt_bgp_msg *); u_char *mrt_aspath_inflate(void *, u_int16_t, u_int16_t *); -int mrt_extract_addr(void *, u_int, union mrt_addr *, sa_family_t); +int mrt_extract_addr(void *, u_int, struct bgpd_addr *, u_int8_t); struct mrt_bgp_state *mrt_parse_state(struct mrt_hdr *, void *); struct mrt_bgp_msg *mrt_parse_msg(struct mrt_hdr *, void *); @@ -172,7 +172,7 @@ mrt_parse(int fd, struct mrt_parser *p, int verbose) break; default: if (verbose) - printf("unhandled BGP4MP subtype %d\n", + printf("unhandled DUMP_V2 subtype %d\n", ntohs(h.subtype)); break; } @@ -295,13 +295,13 @@ mrt_parse_v2_peer(struct mrt_hdr *hdr, void *msg) if (type & MRT_DUMP_V2_PEER_BIT_I) { if (mrt_extract_addr(b, len, &peers[i].addr, - AF_INET6) == -1) + AID_INET6) == -1) goto fail; b += sizeof(struct in6_addr); len -= sizeof(struct in6_addr); } else { if (mrt_extract_addr(b, len, &peers[i].addr, - AF_INET) == -1) + AID_INET) == -1) goto fail; b += sizeof(struct in_addr); len -= sizeof(struct in_addr); @@ -360,9 +360,8 @@ mrt_parse_v2_rib(struct mrt_hdr *hdr, void *msg) len -= 1; if (len < MRT_PREFIX_LEN(plen)) goto fail; - r->prefix.sin.sin_family = AF_INET; - r->prefix.sin.sin_len = sizeof(struct sockaddr_in); - memcpy(&r->prefix.sin.sin_addr, b, MRT_PREFIX_LEN(plen)); + r->prefix.aid = AID_INET; + memcpy(&r->prefix.v4, b, MRT_PREFIX_LEN(plen)); b += MRT_PREFIX_LEN(plen); len -= MRT_PREFIX_LEN(plen); r->prefixlen = plen; @@ -373,9 +372,8 @@ mrt_parse_v2_rib(struct mrt_hdr *hdr, void *msg) len -= 1; if (len < MRT_PREFIX_LEN(plen)) goto fail; - r->prefix.sin6.sin6_family = AF_INET6; - r->prefix.sin6.sin6_len = sizeof(struct sockaddr_in6); - memcpy(&r->prefix.sin6.sin6_addr, b, MRT_PREFIX_LEN(plen)); + r->prefix.aid = AID_INET6; + memcpy(&r->prefix.v6, b, MRT_PREFIX_LEN(plen)); b += MRT_PREFIX_LEN(plen); len -= MRT_PREFIX_LEN(plen); r->prefixlen = plen; @@ -425,7 +423,7 @@ mrt_parse_v2_rib(struct mrt_hdr *hdr, void *msg) if (len < alen) goto fail; if (mrt_extract_attr(&entries[i], b, alen, - r->prefix.sa.sa_family, 1) == -1) + r->prefix.aid, 1) == -1) goto fail; b += alen; len -= alen; @@ -482,13 +480,13 @@ mrt_parse_dump(struct mrt_hdr *hdr, void *msg, struct mrt_peer **pp, switch (ntohs(hdr->subtype)) { case MRT_DUMP_AFI_IP: - if (mrt_extract_addr(b, len, &r->prefix, AF_INET) == -1) + if (mrt_extract_addr(b, len, &r->prefix, AID_INET) == -1) goto fail; b += sizeof(struct in_addr); len -= sizeof(struct in_addr); break; case MRT_DUMP_AFI_IPv6: - if (mrt_extract_addr(b, len, &r->prefix, AF_INET6) == -1) + if (mrt_extract_addr(b, len, &r->prefix, AID_INET6) == -1) goto fail; b += sizeof(struct in6_addr); len -= sizeof(struct in6_addr); @@ -509,13 +507,13 @@ mrt_parse_dump(struct mrt_hdr *hdr, void *msg, struct mrt_peer **pp, /* peer ip */ switch (ntohs(hdr->subtype)) { case MRT_DUMP_AFI_IP: - if (mrt_extract_addr(b, len, &p->peers->addr, AF_INET) == -1) + if (mrt_extract_addr(b, len, &p->peers->addr, AID_INET) == -1) goto fail; b += sizeof(struct in_addr); len -= sizeof(struct in_addr); break; case MRT_DUMP_AFI_IPv6: - if (mrt_extract_addr(b, len, &p->peers->addr, AF_INET6) == -1) + if (mrt_extract_addr(b, len, &p->peers->addr, AID_INET6) == -1) goto fail; b += sizeof(struct in6_addr); len -= sizeof(struct in6_addr); @@ -534,7 +532,7 @@ mrt_parse_dump(struct mrt_hdr *hdr, void *msg, struct mrt_peer **pp, /* attr */ if (len < alen) goto fail; - if (mrt_extract_attr(re, b, alen, r->prefix.sa.sa_family, 0) == -1) + if (mrt_extract_attr(re, b, alen, r->prefix.aid, 0) == -1) goto fail; b += alen; len -= alen; @@ -555,8 +553,7 @@ mrt_parse_dump_mp(struct mrt_hdr *hdr, void *msg, struct mrt_peer **pp, u_int8_t *b = msg; u_int len = ntohl(hdr->length); u_int16_t asnum, alen, afi; - u_int8_t safi, nhlen; - sa_family_t af; + u_int8_t safi, nhlen, aid; /* just ignore the microsec field for _ET header for now */ if (ntohs(hdr->type) == MSG_PROTOCOL_BGP4MP_ET) { @@ -612,7 +609,7 @@ mrt_parse_dump_mp(struct mrt_hdr *hdr, void *msg, struct mrt_peer **pp, b += sizeof(struct in_addr); len -= sizeof(struct in_addr); /* dest IP */ - if (mrt_extract_addr(b, len, &p->peers->addr, AF_INET) == -1) + if (mrt_extract_addr(b, len, &p->peers->addr, AID_INET) == -1) goto fail; b += sizeof(struct in_addr); len -= sizeof(struct in_addr); @@ -624,7 +621,7 @@ mrt_parse_dump_mp(struct mrt_hdr *hdr, void *msg, struct mrt_peer **pp, b += sizeof(struct in6_addr); len -= sizeof(struct in6_addr); /* dest IP */ - if (mrt_extract_addr(b, len, &p->peers->addr, AF_INET6) == -1) + if (mrt_extract_addr(b, len, &p->peers->addr, AID_INET6) == -1) goto fail; b += sizeof(struct in6_addr); len -= sizeof(struct in6_addr); @@ -655,18 +652,22 @@ mrt_parse_dump_mp(struct mrt_hdr *hdr, void *msg, struct mrt_peer **pp, switch (afi) { case MRT_DUMP_AFI_IP: if (safi == 1 || safi == 2) { - af = AF_INET; + aid = AID_INET; break; } else if (safi == 128) { - af = AF_VPNv4; + aid = AID_VPN_IPv4; break; } goto fail; case MRT_DUMP_AFI_IPv6: - if (safi != 1 && safi != 2) - goto fail; - af = AF_INET6; - break; + if (safi == 1 || safi == 2) { + aid = AID_INET6; + break; + } else if (safi == 128) { + aid = AID_VPN_IPv6; + break; + } + goto fail; default: goto fail; } @@ -676,7 +677,7 @@ mrt_parse_dump_mp(struct mrt_hdr *hdr, void *msg, struct mrt_peer **pp, len -= 1; /* nexthop */ - if (mrt_extract_addr(b, len, &re->nexthop, af) == -1) + if (mrt_extract_addr(b, len, &re->nexthop, aid) == -1) goto fail; if (len < nhlen) goto fail; @@ -689,31 +690,32 @@ mrt_parse_dump_mp(struct mrt_hdr *hdr, void *msg, struct mrt_peer **pp, len -= 1; /* prefix */ - switch (af) { - case AF_INET: + switch (aid) { + case AID_INET: if (len < MRT_PREFIX_LEN(r->prefixlen)) goto fail; - r->prefix.sin.sin_family = AF_INET; - r->prefix.sin.sin_len = sizeof(struct sockaddr_in); - memcpy(&r->prefix.sin.sin_addr, b, - MRT_PREFIX_LEN(r->prefixlen)); + r->prefix.aid = aid; + memcpy(&r->prefix.v4, b, MRT_PREFIX_LEN(r->prefixlen)); b += MRT_PREFIX_LEN(r->prefixlen); len -= MRT_PREFIX_LEN(r->prefixlen); break; - case AF_INET6: + case AID_INET6: if (len < MRT_PREFIX_LEN(r->prefixlen)) goto fail; - r->prefix.sin6.sin6_family = AF_INET6; - r->prefix.sin6.sin6_len = sizeof(struct sockaddr_in6); - memcpy(&r->prefix.sin6.sin6_addr, b, - MRT_PREFIX_LEN(r->prefixlen)); + r->prefix.aid = aid; + memcpy(&r->prefix.v6, b, MRT_PREFIX_LEN(r->prefixlen)); b += MRT_PREFIX_LEN(r->prefixlen); len -= MRT_PREFIX_LEN(r->prefixlen); break; - case AF_VPNv4: + case AID_VPN_IPv4: if (len < MRT_PREFIX_LEN(r->prefixlen)) goto fail; - errx(1, "AF_VPNv4 handling not yet implemented"); + errx(1, "AID_VPN_IPv4 handling not yet implemented"); + goto fail; + case AID_VPN_IPv6: + if (len < MRT_PREFIX_LEN(r->prefixlen)) + goto fail; + errx(1, "AID_VPN_IPv6 handling not yet implemented"); goto fail; } @@ -725,7 +727,7 @@ mrt_parse_dump_mp(struct mrt_hdr *hdr, void *msg, struct mrt_peer **pp, /* attr */ if (len < alen) goto fail; - if (mrt_extract_attr(re, b, alen, r->prefix.sa.sa_family, 0) == -1) + if (mrt_extract_attr(re, b, alen, r->prefix.aid, 0) == -1) goto fail; b += alen; len -= alen; @@ -737,7 +739,7 @@ fail: } int -mrt_extract_attr(struct mrt_rib_entry *re, u_char *a, int alen, sa_family_t af, +mrt_extract_attr(struct mrt_rib_entry *re, u_char *a, int alen, u_int8_t aid, int as4) { struct mrt_attr *ap; @@ -787,12 +789,11 @@ mrt_extract_attr(struct mrt_rib_entry *re, u_char *a, int alen, sa_family_t af, case MRT_ATTR_NEXTHOP: if (attr_len != 4) return (-1); - if (af != AF_INET) + if (aid != AID_INET) break; memcpy(&tmp, a, sizeof(tmp)); - re->nexthop.sin.sin_len = sizeof(struct sockaddr_in); - re->nexthop.sin.sin_family = AF_INET; - re->nexthop.sin.sin_addr.s_addr = tmp; + re->nexthop.aid = AID_INET; + re->nexthop.v4.s_addr = tmp; break; case MRT_ATTR_MED: if (attr_len != 4) @@ -823,26 +824,25 @@ mrt_extract_attr(struct mrt_rib_entry *re, u_char *a, int alen, sa_family_t af, alen -= 3; attr_len -= 3; } - switch (af) { - case AF_INET6: + switch (aid) { + case AID_INET6: if (attr_len < sizeof(struct in6_addr) + 1) return (-1); - re->nexthop.sin6.sin6_len = - sizeof(struct sockaddr_in6); - re->nexthop.sin6.sin6_family = AF_INET6; - memcpy(&re->nexthop.sin6.sin6_addr, a + 1, + re->nexthop.aid = aid; + memcpy(&re->nexthop.v6, a + 1, sizeof(struct in6_addr)); break; - case AF_VPNv4: + case AID_VPN_IPv4: if (attr_len < sizeof(u_int64_t) + sizeof(struct in_addr)) return (-1); - re->nexthop.svpn4.sv_len = - sizeof(struct sockaddr_vpn4); - re->nexthop.svpn4.sv_family = AF_VPNv4; + re->nexthop.aid = aid; memcpy(&tmp, a + 1 + sizeof(u_int64_t), sizeof(tmp)); - re->nexthop.svpn4.sv_addr.s_addr = tmp; + re->nexthop.vpn4.addr.s_addr = tmp; + break; + case AID_VPN_IPv6: + errx(1, "AID_VPN_IPv6 not yet implemented"); break; } break; @@ -956,33 +956,40 @@ mrt_aspath_inflate(void *data, u_int16_t len, u_int16_t *newlen) } int -mrt_extract_addr(void *msg, u_int len, union mrt_addr *addr, sa_family_t af) +mrt_extract_addr(void *msg, u_int len, struct bgpd_addr *addr, u_int8_t aid) { u_int8_t *b = msg; - switch (af) { - case AF_INET: + memset(addr, 0, sizeof(*addr)); + switch (aid) { + case AID_INET: if (len < sizeof(struct in_addr)) return (-1); - addr->sin.sin_family = AF_INET; - addr->sin.sin_len = sizeof(struct sockaddr_in); - memcpy(&addr->sin.sin_addr, b, sizeof(struct in_addr)); + addr->aid = aid; + memcpy(&addr->v4, b, sizeof(struct in_addr)); return sizeof(struct in_addr); - case AF_INET6: + case AID_INET6: if (len < sizeof(struct in6_addr)) return (-1); - addr->sin6.sin6_family = AF_INET6; - addr->sin6.sin6_len = sizeof(struct sockaddr_in6); - memcpy(&addr->sin6.sin6_addr, b, sizeof(struct in6_addr)); + addr->aid = aid; + memcpy(&addr->v6, b, sizeof(struct in6_addr)); return sizeof(struct in6_addr); - case AF_VPNv4: + case AID_VPN_IPv4: if (len < sizeof(u_int64_t) + sizeof(struct in_addr)) return (-1); - addr->svpn4.sv_len = sizeof(struct sockaddr_vpn4); - addr->svpn4.sv_family = AF_VPNv4; - memcpy(&addr->svpn4.sv_addr, b + sizeof(u_int64_t), + addr->aid = aid; + /* XXX labelstack and rd missing */ + memcpy(&addr->vpn4.addr, b + sizeof(u_int64_t), sizeof(struct in_addr)); return (sizeof(u_int64_t) + sizeof(struct in_addr)); + case AID_VPN_IPv6: + if (len < sizeof(u_int64_t) + sizeof(struct in6_addr)) + return (-1); + addr->aid = aid; + /* XXX labelstack and rd missing */ + memcpy(&addr->vpn6.addr, b + sizeof(u_int64_t), + sizeof(struct in6_addr)); + return (sizeof(u_int64_t) + sizeof(struct in6_addr)); default: return (-1); } @@ -998,7 +1005,7 @@ mrt_parse_state(struct mrt_hdr *hdr, void *msg) u_int32_t sas, das, usec; u_int16_t tmp16, afi; int r; - sa_family_t af; + u_int8_t aid; t.tv_sec = ntohl(hdr->timestamp); t.tv_nsec = 0; @@ -1063,10 +1070,10 @@ mrt_parse_state(struct mrt_hdr *hdr, void *msg) /* src & dst addr */ switch (afi) { case MRT_DUMP_AFI_IP: - af = AF_INET; + aid = AID_INET; break; case MRT_DUMP_AFI_IPv6: - af = AF_INET6; + aid = AID_INET6; break; default: errx(1, "mrt_parse_state: bad afi"); @@ -1078,11 +1085,11 @@ mrt_parse_state(struct mrt_hdr *hdr, void *msg) s->src_as = sas; s->dst_as = das; - if ((r = mrt_extract_addr(b, len, &s->src, af)) == -1) + if ((r = mrt_extract_addr(b, len, &s->src, aid)) == -1) goto fail; b += r; len -= r; - if ((r = mrt_extract_addr(b, len, &s->dst, af)) == -1) + if ((r = mrt_extract_addr(b, len, &s->dst, aid)) == -1) goto fail; b += r; len -= r; @@ -1114,7 +1121,7 @@ mrt_parse_msg(struct mrt_hdr *hdr, void *msg) u_int32_t sas, das, usec; u_int16_t tmp16, afi; int r; - sa_family_t af; + u_int8_t aid; t.tv_sec = ntohl(hdr->timestamp); t.tv_nsec = 0; @@ -1179,10 +1186,10 @@ mrt_parse_msg(struct mrt_hdr *hdr, void *msg) /* src & dst addr */ switch (afi) { case MRT_DUMP_AFI_IP: - af = AF_INET; + aid = AID_INET; break; case MRT_DUMP_AFI_IPv6: - af = AF_INET6; + aid = AID_INET6; break; default: errx(1, "mrt_parse_msg: bad afi"); @@ -1194,11 +1201,11 @@ mrt_parse_msg(struct mrt_hdr *hdr, void *msg) m->src_as = sas; m->dst_as = das; - if ((r = mrt_extract_addr(b, len, &m->src, af)) == -1) + if ((r = mrt_extract_addr(b, len, &m->src, aid)) == -1) goto fail; b += r; len -= r; - if ((r = mrt_extract_addr(b, len, &m->dst, af)) == -1) + if ((r = mrt_extract_addr(b, len, &m->dst, aid)) == -1) goto fail; b += r; len -= r; diff --git a/usr.sbin/bgpctl/mrtparser.h b/usr.sbin/bgpctl/mrtparser.h index 35d870eff35..7da4d62f2f8 100644 --- a/usr.sbin/bgpctl/mrtparser.h +++ b/usr.sbin/bgpctl/mrtparser.h @@ -1,4 +1,4 @@ -/* $OpenBSD: mrtparser.h,v 1.2 2018/07/20 12:49:49 claudio Exp $ */ +/* $OpenBSD: mrtparser.h,v 1.3 2019/02/25 11:51:58 claudio Exp $ */ /* * Copyright (c) 2011 Claudio Jeker * @@ -15,29 +15,11 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -struct sockaddr_vpn4 { - u_int8_t sv_len; - sa_family_t sv_family; - u_int8_t sv_labellen; - u_int8_t sv_pad; - struct in_addr sv_addr; - u_int64_t sv_rd; - u_int8_t sv_label[21]; - u_int8_t sv_pad2[3]; -}; - -#define AF_VPNv4 250 /* XXX high enough to not cause issues */ - -union mrt_addr { - struct sockaddr_in6 sin6; - struct sockaddr_in sin; - struct sockaddr_vpn4 svpn4; - struct sockaddr sa; -}; +#include "bgpd.h" /* data structures for the MSG_TABLE_DUMP_V2 format */ struct mrt_peer_entry { - union mrt_addr addr; + struct bgpd_addr addr; u_int32_t bgp_id; u_int32_t asnum; }; @@ -57,7 +39,7 @@ struct mrt_attr { struct mrt_rib_entry { void *aspath; struct mrt_attr *attrs; - union mrt_addr nexthop; + struct bgpd_addr nexthop; time_t originated; u_int32_t local_pref; u_int32_t med; @@ -69,7 +51,7 @@ struct mrt_rib_entry { struct mrt_rib { struct mrt_rib_entry *entries; - union mrt_addr prefix; + struct bgpd_addr prefix; u_int32_t seqnum; u_int16_t nentries; u_int8_t prefixlen; @@ -77,19 +59,19 @@ struct mrt_rib { /* data structures for the BGP4MP MESSAGE and STATE types */ struct mrt_bgp_state { - struct timespec time; - union mrt_addr src; - union mrt_addr dst; - u_int32_t src_as; - u_int32_t dst_as; - u_int16_t old_state; - u_int16_t new_state; + struct timespec time; + struct bgpd_addr src; + struct bgpd_addr dst; + u_int32_t src_as; + u_int32_t dst_as; + u_int16_t old_state; + u_int16_t new_state; }; struct mrt_bgp_msg { struct timespec time; - union mrt_addr src; - union mrt_addr dst; + struct bgpd_addr src; + struct bgpd_addr dst; u_int32_t src_as; u_int32_t dst_as; u_int16_t msg_len; -- cgit v1.2.3