>Synopsis:      eigrpd: multiple issues
>Category:      user
>Environment:
        System      : OpenBSD 7.8
        Details     : OpenBSD 7.8 (GENERIC) #54: Sun Oct 12 12:45:58 MDT 2025
                         
[email protected]:/usr/src/sys/arch/amd64/compile/GENERIC

        Architecture: OpenBSD.amd64
        Machine     : amd64
>Description:
        eigrpd: multiple issues
>How-To-Repeat:
        At first, eigrp daemon exited with error just after start:

        # cat eigrpd.conf
        address-family ipv4 {
                autonomous-system 1 {
                        interface vio1
                        interface vio2
                }
        }
        # eigrpd -d -v -f eigrpd.conf
        startup
        ...
        fatal in eigrpe: in_cksum: packet too big
        ...
        waiting for children to terminate
        terminating

        I found that in_cksum() is called with uninitialized data
        because of swapped source and destination in ibuf_from_ibuf().
        I fixed that. Then the daemon started but was unable to make
        an adjacency with a Cisco router. Cisco complained on wrong
        checksum in incoming EIGRP packets. In fact, the checksums were
        in wrong byte order. I added a call to htons(). Then eigrpd and
        Cisco made an adjacency and exchanged routes.

        Unfortunately, redistribution of static routes didn't work.
        It looks like children processes get configuration with
        empty redist_list despite of that list being correctly filled
        in the master process. I was unable to fix this issue.
>Fix:
        (partial fix) 
--- packet.c
+++ packet.c
@@ -175,7 +175,7 @@ send_packet(struct eigrp_iface *ei, struct nbr *nbr, 
uint32_t flags,
                rtp_ack_stop_timer(nbr);
        }
 
-       ibuf_from_ibuf(buf, &ebuf);
+       ibuf_from_ibuf(&ebuf, buf);
        if (ibuf_get(&ebuf, &eigrp_hdr, sizeof(eigrp_hdr)) == -1)
                fatalx("send_packet: get hdr failed");
 
@@ -189,7 +189,7 @@ send_packet(struct eigrp_iface *ei, struct nbr *nbr, 
uint32_t flags,
        if (ibuf_set_n16(buf, offsetof(struct eigrp_hdr, chksum), 0) == -1)
                fatalx("send_packet: set of chksum failed");
        if (ibuf_set_n16(buf, offsetof(struct eigrp_hdr, chksum),
-           in_cksum(ibuf_data(buf), ibuf_size(buf))) == -1)
+           htons(in_cksum(ibuf_data(buf), ibuf_size(buf)))) == -1)
                fatalx("send_packet: set of chksum failed");
 
        /* log packet being sent */

Reply via email to