]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: The last_reset_cause in the peer structure is too large
authorDonald Sharp <sharpd@nvidia.com>
Mon, 24 Jul 2023 00:30:47 +0000 (20:30 -0400)
committerMergify <37929162+mergify[bot]@users.noreply.github.com>
Tue, 25 Jul 2023 13:26:27 +0000 (13:26 +0000)
The last_reset_cause is a plain old BGP_MAX_PACKET_SIZE buffer
that is really enlarging the peer data structure.  Let's just
copy the stream that failed and only allocate how ever much
the packet size actually was.  While it's likely that we have
a reset reason, the packet typically is not going to be 65k
in size.  Let's save space.

Signed-off-by: Donald Sharp <sharpd@nvidia.com>
(cherry picked from commit 73b66bed83a38eea37371c6bbb0655c72c903293)

bgpd/bgp_packet.c
bgpd/bgp_vty.c
bgpd/bgpd.c
bgpd/bgpd.h

index 9469a0778f9722be2737910baa05a1687e2d8e95..bd17a2eec84ecb145f392d54fc5865a6427dadc0 100644 (file)
@@ -956,8 +956,9 @@ static void bgp_notify_send_internal(struct peer *peer, uint8_t code,
        if (use_curr && peer->curr) {
                size_t packetsize = stream_get_endp(peer->curr);
                assert(packetsize <= peer->max_packet_size);
-               memcpy(peer->last_reset_cause, peer->curr->data, packetsize);
-               peer->last_reset_cause_size = packetsize;
+               if (peer->last_reset_cause)
+                       stream_free(peer->last_reset_cause);
+               peer->last_reset_cause = stream_dup(peer->curr);
        }
 
        /* For debug */
index f50dd563e14e7324da920bca2c630b1ab0fcad79..ab5eff8d07129a53def8c8a40d6c4a326947da58 100644 (file)
@@ -14853,15 +14853,15 @@ static void bgp_show_peer(struct vty *vty, struct peer *p, bool use_json,
                                            BGP_UPTIME_LEN, 0, NULL));
 
                        bgp_show_peer_reset(vty, p, NULL, false);
-                       if (p->last_reset_cause_size) {
-                               msg = p->last_reset_cause;
+                       if (p->last_reset_cause) {
+                               msg = p->last_reset_cause->data;
                                vty_out(vty,
                                        "  Message received that caused BGP to send a NOTIFICATION:\n    ");
-                               for (i = 1; i <= p->last_reset_cause_size;
+                               for (i = 1; i <= p->last_reset_cause->size;
                                     i++) {
                                        vty_out(vty, "%02X", *msg++);
 
-                                       if (i != p->last_reset_cause_size) {
+                                       if (i != p->last_reset_cause->size) {
                                                if (i % 16 == 0) {
                                                        vty_out(vty, "\n    ");
                                                } else if (i % 4 == 0) {
index 86bded14bbfc8f6ab9678f9ece692588f7fa9fd4..aea7f6f65cd8d42e4a1849c801ad85fff805b325 100644 (file)
@@ -1190,6 +1190,8 @@ static void peer_free(struct peer *peer)
 
        bgp_unlock(peer->bgp);
 
+       stream_free(peer->last_reset_cause);
+
        memset(peer, 0, sizeof(struct peer));
 
        XFREE(MTYPE_BGP_PEER, peer);
index 5e443ca5c970bc60aa2786d95621a0a51ce2a957..833312754a7cb16d4409539ebea3d03f1c10aa07 100644 (file)
@@ -1706,8 +1706,7 @@ struct peer {
         * a new value to the last_reset reason
         */
 
-       uint16_t last_reset_cause_size;
-       uint8_t last_reset_cause[BGP_MAX_PACKET_SIZE];
+       struct stream *last_reset_cause;
 
        /* The kind of route-map Flags.*/
        uint16_t rmap_type;