From 081f6520ff37b3fdd1cdaa8f58c53d0696d8057a Mon Sep 17 00:00:00 2001 From: Donatas Abraitis Date: Thu, 14 Mar 2024 09:45:18 +0200 Subject: [PATCH] bgpd: Avoid padding for bgp_paths_limit_capability struct When sending the packets over the network (dynamic capability) it reports 6 bytes instead of 5 bytes, and causes some issues between little/big endian machines. Signed-off-by: Donatas Abraitis --- bgpd/bgp_addpath.h | 2 +- bgpd/bgp_packet.c | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/bgpd/bgp_addpath.h b/bgpd/bgp_addpath.h index b19e63c946..c267ebe43e 100644 --- a/bgpd/bgp_addpath.h +++ b/bgpd/bgp_addpath.h @@ -25,7 +25,7 @@ struct bgp_paths_limit_capability { uint16_t afi; uint8_t safi; uint16_t paths_limit; -}; +} __attribute__((packed)); #define BGP_ADDPATH_TX_ID_FOR_DEFAULT_ORIGINATE 1 diff --git a/bgpd/bgp_packet.c b/bgpd/bgp_packet.c index 8a36a3f4c8..78878013f8 100644 --- a/bgpd/bgp_packet.c +++ b/bgpd/bgp_packet.c @@ -3240,11 +3240,13 @@ static void bgp_dynamic_capability_paths_limit(uint8_t *pnt, int action, safi_t safi; iana_afi_t pkt_afi; iana_safi_t pkt_safi; + uint16_t paths_limit = 0; struct bgp_paths_limit_capability bpl = {}; memcpy(&bpl, data, sizeof(bpl)); pkt_afi = ntohs(bpl.afi); pkt_safi = safi_int2iana(bpl.safi); + paths_limit = ntohs(bpl.paths_limit); if (bgp_debug_neighbor_events(peer)) zlog_debug("%s OPEN has %s capability for afi/safi: %s/%s limit: %u", @@ -3252,8 +3254,7 @@ static void bgp_dynamic_capability_paths_limit(uint8_t *pnt, int action, lookup_msg(capcode_str, hdr->code, NULL), iana_afi2str(pkt_afi), - iana_safi2str(pkt_safi), - bpl.paths_limit); + iana_safi2str(pkt_safi), paths_limit); if (bgp_map_afi_safi_iana2int(pkt_afi, pkt_safi, &afi, &safi)) { @@ -3275,7 +3276,7 @@ static void bgp_dynamic_capability_paths_limit(uint8_t *pnt, int action, SET_FLAG(peer->af_cap[afi][safi], PEER_CAP_PATHS_LIMIT_AF_RCV); peer->addpath_paths_limit[afi][safi].receive = - bpl.paths_limit; + paths_limit; ignore: data += CAPABILITY_CODE_PATHS_LIMIT_LEN; }