diff options
Diffstat (limited to 'proto')
-rw-r--r-- | proto/bgp/bgp.h | 4 | ||||
-rw-r--r-- | proto/bgp/packets.c | 27 |
2 files changed, 22 insertions, 9 deletions
diff --git a/proto/bgp/bgp.h b/proto/bgp/bgp.h index 6f998b0..066dc27 100644 --- a/proto/bgp/bgp.h +++ b/proto/bgp/bgp.h @@ -74,8 +74,8 @@ struct bgp_conn { int start_state; /* protocol start_state snapshot when connection established */ int want_as4_support; /* Connection tries to establish AS4 session */ int peer_as4_support; /* Peer supports 4B AS numbers [RFC4893] */ - int want_multicast_support; /* We want to exchange multicast routes */ - int peer_multicast_support; /* Peer supports multicast routes [RFC4760] */ + int want_multicast_support; /* We want to exchange multicast routes */ + int peer_multicast_support; /* Peer supports multicast routes [RFC4760] */ int peer_refresh_support; /* Peer supports route refresh [RFC2918] */ unsigned hold_time, keepalive_time; /* Times calculated from my and neighbor's requirements */ }; diff --git a/proto/bgp/packets.c b/proto/bgp/packets.c index 8e657cc..ad3a0bb 100644 --- a/proto/bgp/packets.c +++ b/proto/bgp/packets.c @@ -6,7 +6,7 @@ * Can be freely distributed and used under the terms of the GNU GPL. */ -#define LOCAL_DEBUG +#undef LOCAL_DEBUG #include "nest/bird.h" #include "nest/iface.h" @@ -335,10 +335,12 @@ bgp_create_update(struct bgp_conn *conn, byte *buf) #else /* IPv6 version */ static byte * -bgp_create_update(struct bgp_conn *conn, byte *buf) +bgp_create_update_cast(struct bgp_conn *conn, byte *buf, int cast) { struct bgp_proto *p = conn->bgp; - struct bgp_bucket_info *bi = &p->unicast_buckets; + int multicast = (cast == RTC_MULTICAST); + struct bgp_bucket_info *bi = multicast ? &p->multicast_buckets : &p->unicast_buckets; + int sub = multicast ? BGP_SAF_MULTICAST : BGP_SAF_UNICAST; struct bgp_bucket *buck; int size, second, rem_stored; int remains = BGP_MAX_PACKET_LENGTH - BGP_HEADER_LENGTH - 4; @@ -357,7 +359,7 @@ bgp_create_update(struct bgp_conn *conn, byte *buf) tmp = bgp_attach_attr_wa(&ea, bgp_linpool, BA_MP_UNREACH_NLRI, remains-8); *tmp++ = 0; *tmp++ = BGP_AF_IPV6; - *tmp++ = BGP_SAF_UNICAST; + *tmp++ = sub; ea->attrs[0].u.ptr->length = 3 + bgp_encode_prefixes(bi, tmp, buck, remains-11); size = bgp_encode_attrs(p, w, ea, remains); ASSERT(size >= 0); @@ -449,7 +451,7 @@ bgp_create_update(struct bgp_conn *conn, byte *buf) tstart = tmp = bgp_attach_attr_wa(&ea, bgp_linpool, BA_MP_REACH_NLRI, remains-8); *tmp++ = 0; *tmp++ = BGP_AF_IPV6; - *tmp++ = 1; + *tmp++ = sub; if (ipa_nonzero(ip_ll)) { @@ -490,6 +492,17 @@ bgp_create_update(struct bgp_conn *conn, byte *buf) return NULL; } +static byte * +bgp_create_update(struct bgp_conn *conn, byte *buf) +{ + byte *end = bgp_create_update_cast(conn, buf, RTC_UNICAST); + + if ((!end) && conn->bgp->multicast_session) + end = bgp_create_update_cast(conn, buf, RTC_MULTICAST); + + return end; +} + #endif static byte * @@ -500,8 +513,8 @@ bgp_create_route_refresh(struct bgp_conn *conn, byte *buf) *buf++ = 0; *buf++ = BGP_AF; - *buf++ = 0; /* RFU */ - *buf++ = 1; /* and SAFI 1 */ + *buf++ = 0; /* RFU */ + *buf++ = BGP_SAF_UNICAST; /* and SAFI 1 */ return buf; } |