From 52a51fd333258529aa98a0d35e7bf757cc645f2b Mon Sep 17 00:00:00 2001 From: Daniel Walton Date: Fri, 27 May 2016 13:31:06 +0000 Subject: [PATCH] bgpd: resolve merge issues in bgp_attr_check() Signed-off-by: Daniel Walton --- bgpd/bgp_attr.c | 21 ++++++++++----------- bgpd/bgp_attr.h | 2 +- bgpd/bgp_packet.c | 2 +- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/bgpd/bgp_attr.c b/bgpd/bgp_attr.c index a151ae3cf9..844bc0fd91 100644 --- a/bgpd/bgp_attr.c +++ b/bgpd/bgp_attr.c @@ -1817,7 +1817,7 @@ bgp_attr_unknown (struct bgp_attr_parser_args *args) /* Well-known attribute check. */ static int -bgp_attr_check (struct peer *peer, struct attr *attr, bgp_size_t nlri_len) +bgp_attr_check (struct peer *peer, struct attr *attr) { u_char type = 0; @@ -1840,13 +1840,12 @@ bgp_attr_check (struct peer *peer, struct attr *attr, bgp_size_t nlri_len) if (! CHECK_FLAG (attr->flag, ATTR_FLAG_BIT (BGP_ATTR_AS_PATH))) type = BGP_ATTR_AS_PATH; - /* As per RFC 2858, NEXT_HOP is needed only if the update contains NLRI - * other than in MP_REACH. In fact, if only MP_REACH_NLRI is present, the - * update should not contain NEXT_HOP but it should be ignored, if recvd. + /* RFC 2858 makes Next-Hop optional/ignored, if MP_REACH_NLRI is present and + * NLRI is empty. We can't easily check NLRI empty here though. */ - if (nlri_len) - if (! CHECK_FLAG (attr->flag, ATTR_FLAG_BIT (BGP_ATTR_NEXT_HOP))) - type = BGP_ATTR_NEXT_HOP; + if (!CHECK_FLAG (attr->flag, ATTR_FLAG_BIT (BGP_ATTR_NEXT_HOP)) + && !CHECK_FLAG (attr->flag, ATTR_FLAG_BIT (BGP_ATTR_MP_REACH_NLRI))) + type = BGP_ATTR_NEXT_HOP; if (peer->sort == BGP_PEER_IBGP && ! CHECK_FLAG (attr->flag, ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))) @@ -1854,7 +1853,8 @@ bgp_attr_check (struct peer *peer, struct attr *attr, bgp_size_t nlri_len) if (type) { - zlog_warn ("%s Missing well-known attribute %d.", peer->host, type); + zlog_warn ("%s Missing well-known attribute %s.", peer->host, + LOOKUP (attr_str, type)); bgp_notify_send_with_data (peer, BGP_NOTIFY_UPDATE_ERR, BGP_NOTIFY_UPDATE_MISS_ATTR, @@ -1868,8 +1868,7 @@ bgp_attr_check (struct peer *peer, struct attr *attr, bgp_size_t nlri_len) bgp_update_receive() in bgp_packet.c. */ bgp_attr_parse_ret_t bgp_attr_parse (struct peer *peer, struct attr *attr, bgp_size_t size, - struct bgp_nlri *mp_update, struct bgp_nlri *mp_withdraw, - bgp_size_t nlri_len) + struct bgp_nlri *mp_update, struct bgp_nlri *mp_withdraw) { int ret; u_char flag = 0; @@ -2108,7 +2107,7 @@ bgp_attr_parse (struct peer *peer, struct attr *attr, bgp_size_t size, /* Check all mandatory well-known attributes are present */ { bgp_attr_parse_ret_t ret; - if ((ret = bgp_attr_check (peer, attr, nlri_len)) < 0) + if ((ret = bgp_attr_check (peer, attr)) < 0) { if (as4_path) aspath_unintern (&as4_path); diff --git a/bgpd/bgp_attr.h b/bgpd/bgp_attr.h index a9e8b4f5d6..d71cb68052 100644 --- a/bgpd/bgp_attr.h +++ b/bgpd/bgp_attr.h @@ -171,7 +171,7 @@ extern void bgp_attr_init (void); extern void bgp_attr_finish (void); extern bgp_attr_parse_ret_t bgp_attr_parse (struct peer *, struct attr *, bgp_size_t, struct bgp_nlri *, - struct bgp_nlri *, bgp_size_t); + struct bgp_nlri *); extern struct attr_extra *bgp_attr_extra_get (struct attr *); extern void bgp_attr_extra_free (struct attr *); extern void bgp_attr_dup (struct attr *, struct attr *); diff --git a/bgpd/bgp_packet.c b/bgpd/bgp_packet.c index e2b8a3346a..6c1e9e2f96 100644 --- a/bgpd/bgp_packet.c +++ b/bgpd/bgp_packet.c @@ -1430,7 +1430,7 @@ bgp_update_receive (struct peer *peer, bgp_size_t size) if (attribute_len) { attr_parse_ret = bgp_attr_parse (peer, &attr, attribute_len, - &mp_update, &mp_withdraw, update.length); + &mp_update, &mp_withdraw); if (attr_parse_ret == BGP_ATTR_PARSE_ERROR) { bgp_attr_unintern_sub (&attr); -- 2.39.5