]> git.puffer.fish Git - mirror/frr.git/commitdiff
bgpd: The last_reset_cause in the peer structure is too large 14079/head
authorDonald Sharp <sharpd@nvidia.com>
Mon, 24 Jul 2023 00:30:47 +0000 (20:30 -0400)
committerDonald Sharp <sharpd@nvidia.com>
Tue, 25 Jul 2023 02:41:14 +0000 (22:41 -0400)
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>
bgpd/bgp_packet.c
bgpd/bgp_vty.c
bgpd/bgpd.c
bgpd/bgpd.h

index ab9e94099797f53f969be80e1b912be16e901f1e..2d1fc103bcfadc7373baa78ee06a0c0e71a5703a 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 02ee5320e921760fdb2df4a63012abd31cadc554..4f773f21a5e7218f3a30339a15ee97d8d27b0fec 100644 (file)
@@ -14862,15 +14862,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 fa28a3098bea493724ce643ee047402b6c89fe5e..dfa5956ba19ca3c5b5f1d0b0b5d1a89f0145c2fd 100644 (file)
@@ -1189,6 +1189,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 5c42abef5e0d52bf61f74aa1ee0cbe192a1eda20..5e467bb873d1722d32ca83f76c4881d73ecac71c 100644 (file)
@@ -1716,8 +1716,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;