Hi,

I found a bug while working on a route server implementation based on
OpenBGPD. I have a IPv6 session from OpenBGPD 4.4 (on OpenBSD 4.4,
routeertnix) to Quagga 0.99.5 (laborantix).

I have multiple IPv4 peers, and multiple IPv6 peers in the setup. When I
start the BGP daemon, everything starts up nicely. All sessions come up.

When I clear a IPv6 peering session, the connection shifts to the
Idle state. When I look in the log, I can see it connect and establish a 
connection, but break as soon as a mistery update gets send out.

While looking in to the problem, we found out that OpenBGPD sends a
empty UPDATE, on which quagga responds by terminating the process.

The /var/log/daemon log shows the following:

Jan 29 16:07:39 routeertnix bgpd[31121]: neighbor
2001:db8:1::a506:5502:1 (laborantix ipv6): state change Idle -> Connect,
reason: Start
Jan 29 16:07:39 routeertnix bgpd[31121]: neighbor
2001:db8:1::a506:5502:1 (laborantix ipv6): state change Connect ->
OpenSent, reason: Connection opened
Jan 29 16:07:39 routeertnix bgpd[31121]: neighbor
2001:db8:1::a506:5502:1 (laborantix ipv6): state change OpenSent ->
OpenConfirm, reason: OPEN message received
Jan 29 16:07:39 routeertnix bgpd[31121]: neighbor
2001:db8:1::a506:5502:1 (laborantix ipv6): state change OpenConfirm ->
Established, reason: KEEPALIVE message received
Jan 29 16:07:40 routeertnix bgpd[16710]: neighbor
2001:db8:1::a506:5502:1 (laborantix ipv6) AS65502: update
2001:db8:97::/64 via 2001:db8:1::a506:5502:1
Jan 29 16:07:40 routeertnix bgpd[25774]: nexthop 2001:db8:1::a506:5502:1
now valid: directly connected
Jan 29 16:07:40 routeertnix bgpd[31121]: neighbor
2001:db8:1::a506:5502:1 (laborantix ipv6): received notification: error
in UPDATE message, network unacceptable
Jan 29 16:07:40 routeertnix bgpd[31121]: neighbor
2001:db8:1::a506:5502:1 (laborantix ipv6): state change Established ->
Idle, reason: NOTIFICATION received

While doing a tcpdump we found the following packets leading to a
NOTIFICATION. As you can see, frame 19 is an empty UPDATE packet.

Frame 18 (167 bytes on wire, 167 bytes captured)
    Arrival Time: Jan 29, 2009 15:54:28.184019000
    [Time delta from previous packet: 0.807505000 seconds]
    [Time since reference or first frame: 1.009967000 seconds]
    Frame Number: 18
    Packet Length: 167 bytes
    Capture Length: 167 bytes
    [Frame is marked: False]
    [Protocols in frame: eth:ipv6:tcp:bgp]
Ethernet II, Src: 00:06:5b:8d:1a:ec (00:06:5b:8d:1a:ec), Dst:
00:06:5b:8d:1a:c2 (00:06:5b:8d:1a:c2)
    Destination: 00:06:5b:8d:1a:c2 (00:06:5b:8d:1a:c2)
        Address: 00:06:5b:8d:1a:c2 (00:06:5b:8d:1a:c2)
        .... ...0 .... .... .... .... = IG bit: Individual address (unicast)
        .... ..0. .... .... .... .... = LG bit: Globally unique address
(factory default)
    Source: 00:06:5b:8d:1a:ec (00:06:5b:8d:1a:ec)
        Address: 00:06:5b:8d:1a:ec (00:06:5b:8d:1a:ec)
        .... ...0 .... .... .... .... = IG bit: Individual address (unicast)
        .... ..0. .... .... .... .... = LG bit: Globally unique address
(factory default)
    Type: IPv6 (0x86dd)
Internet Protocol Version 6
    Version: 6
    Traffic class: 0x00
    Flowlabel: 0x00000
    Payload length: 113
    Next header: TCP (0x06)
    Hop limit: 1
    Source address: 2001:db8:1::a506:5502:1 (2001:db8:1::a506:5502:1)
    Destination address: 2001:db8:1::a500:6777:1 (2001:db8:1::a500:6777:1)
Transmission Control Protocol, Src Port: 179 (179), Dst Port: 10379
(10379), Seq: 84, Ack: 229, Len: 81
    Source port: 179 (179)
    Destination port: 10379 (10379)
    Sequence number: 84    (relative sequence number)
    [Next sequence number: 165    (relative sequence number)]
    Acknowledgement number: 229    (relative ack number)
    Header length: 32 bytes
    Flags: 0x18 (PSH, ACK)
        0... .... = Congestion Window Reduced (CWR): Not set
        .0.. .... = ECN-Echo: Not set
        ..0. .... = Urgent: Not set
        ...1 .... = Acknowledgment: Set
        .... 1... = Push: Set
        .... .0.. = Reset: Not set
        .... ..0. = Syn: Not set
        .... ...0 = Fin: Not set
    Window size: 5712
    Checksum: 0x626e [incorrect, should be 0xc328 (maybe caused by
checksum offloading?)]
    Options: (12 bytes)
        NOP
        NOP
        Timestamps: TSval 2877490800, TSecr 257498766
    [SEQ/ACK analysis]
        [This is an ACK to the segment in frame: 17]
        [The RTT to ACK the segment was: 0.807505000 seconds]
Border Gateway Protocol
    UPDATE Message
        Marker: 16 bytes
        Length: 81 bytes
        Type: UPDATE Message (2)
        Unfeasible routes length: 0 bytes
        Total path attribute length: 58 bytes
        Path attributes
            ORIGIN: IGP (4 bytes)
                Flags: 0x40 (Well-known, Transitive, Complete)
                    0... .... = Well-known
                    .1.. .... = Transitive
                    ..0. .... = Complete
                    ...0 .... = Regular length
                Type code: ORIGIN (1)
                Length: 1 byte
                Origin: IGP (0)
            AS_PATH: 65502 (7 bytes)
                Flags: 0x40 (Well-known, Transitive, Complete)
                    0... .... = Well-known
                    .1.. .... = Transitive
                    ..0. .... = Complete
                    ...0 .... = Regular length
                Type code: AS_PATH (2)
                Length: 4 bytes
                AS path: 65502
                    AS path segment: 65502
                        Path segment type: AS_SEQUENCE (2)
                        Path segment length: 1 AS
                        Path segment value: 65502
            MULTI_EXIT_DISC: 0 (7 bytes)
                Flags: 0x80 (Optional, Non-transitive, Complete)
                    1... .... = Optional
                    .0.. .... = Non-transitive
                    ..0. .... = Complete
                    ...0 .... = Regular length
                Type code: MULTI_EXIT_DISC (4)
                Length: 4 bytes
                Multiple exit discriminator: 0
            COMMUNITIES: 6777:6777 (7 bytes)
                Flags: 0xc0 (Optional, Transitive, Complete)
                    1... .... = Optional
                    .1.. .... = Transitive
                    ..0. .... = Complete
                    ...0 .... = Regular length
                Type code: COMMUNITIES (8)
                Length: 4 bytes
                Communities: 6777:6777
                    Community: 6777:6777
                        Community AS: 6777
                        Community value: 6777
            MP_REACH_NLRI (33 bytes)
                Flags: 0x80 (Optional, Non-transitive, Complete)
                    1... .... = Optional
                    .0.. .... = Non-transitive
                    ..0. .... = Complete
                    ...0 .... = Regular length
                Type code: MP_REACH_NLRI (14)
                Length: 30 bytes
                Address family: IPv6 (2)
                Subsequent address family identifier: Unicast (1)
                Next hop network address (16 bytes)
                    Next hop: 2001:db8:1::a506:5502:1 (16)
                Subnetwork points of attachment: 0
                Network layer reachability information (9 bytes)
                    2001:db8:97::/64
                        MP Reach NLRI prefix length: 64
                        MP Reach NLRI prefix: 2001:db8:97::

Frame 19 (124 bytes on wire, 124 bytes captured)
    Arrival Time: Jan 29, 2009 15:54:28.185078000
    [Time delta from previous packet: 0.001059000 seconds]
    [Time since reference or first frame: 1.011026000 seconds]
    Frame Number: 19
    Packet Length: 124 bytes
    Capture Length: 124 bytes
    [Frame is marked: False]
    [Protocols in frame: eth:ipv6:tcp:bgp]
Ethernet II, Src: 00:06:5b:8d:1a:c2 (00:06:5b:8d:1a:c2), Dst:
00:06:5b:8d:1a:ec (00:06:5b:8d:1a:ec)
    Destination: 00:06:5b:8d:1a:ec (00:06:5b:8d:1a:ec)
        Address: 00:06:5b:8d:1a:ec (00:06:5b:8d:1a:ec)
        .... ...0 .... .... .... .... = IG bit: Individual address (unicast)
        .... ..0. .... .... .... .... = LG bit: Globally unique address
(factory default)
    Source: 00:06:5b:8d:1a:c2 (00:06:5b:8d:1a:c2)
        Address: 00:06:5b:8d:1a:c2 (00:06:5b:8d:1a:c2)
        .... ...0 .... .... .... .... = IG bit: Individual address (unicast)
        .... ..0. .... .... .... .... = LG bit: Globally unique address
(factory default)
    Type: IPv6 (0x86dd)
Internet Protocol Version 6
    Version: 6
    Traffic class: 0x00
    Flowlabel: 0x809f0
    Payload length: 70
    Next header: TCP (0x06)
    Hop limit: 1
    Source address: 2001:db8:1::a500:6777:1 (2001:db8:1::a500:6777:1)
    Destination address: 2001:db8:1::a506:5502:1 (2001:db8:1::a506:5502:1)
Transmission Control Protocol, Src Port: 10379 (10379), Dst Port: 179
(179), Seq: 229, Ack: 165, Len: 38
    Source port: 10379 (10379)
    Destination port: 179 (179)
    Sequence number: 229    (relative sequence number)
    [Next sequence number: 267    (relative sequence number)]
    Acknowledgement number: 165    (relative ack number)
    Header length: 32 bytes
    Flags: 0x18 (PSH, ACK)
        0... .... = Congestion Window Reduced (CWR): Not set
        .0.. .... = ECN-Echo: Not set
        ..0. .... = Urgent: Not set
        ...1 .... = Acknowledgment: Set
        .... 1... = Push: Set
        .... .0.. = Reset: Not set
        .... ..0. = Syn: Not set
        .... ...0 = Fin: Not set
    Window size: 16384
    Checksum: 0xe291 [correct]
    Options: (12 bytes)
        NOP
        NOP
        Timestamps: TSval 257498768, TSecr 2877490800
    [SEQ/ACK analysis]
        [This is an ACK to the segment in frame: 18]
        [The RTT to ACK the segment was: 0.001059000 seconds]
Border Gateway Protocol
    UPDATE Message
        Marker: 16 bytes
        Length: 38 bytes
        Type: UPDATE Message (2)
        Unfeasible routes length: 0 bytes
        Total path attribute length: 0 bytes

Frame 20 (107 bytes on wire, 107 bytes captured)
    Arrival Time: Jan 29, 2009 15:54:28.185337000
    [Time delta from previous packet: 0.000259000 seconds]
    [Time since reference or first frame: 1.011285000 seconds]
    Frame Number: 20
    Packet Length: 107 bytes
    Capture Length: 107 bytes
    [Frame is marked: False]
    [Protocols in frame: eth:ipv6:tcp:bgp]
Ethernet II, Src: 00:06:5b:8d:1a:ec (00:06:5b:8d:1a:ec), Dst:
00:06:5b:8d:1a:c2 (00:06:5b:8d:1a:c2)
    Destination: 00:06:5b:8d:1a:c2 (00:06:5b:8d:1a:c2)
        Address: 00:06:5b:8d:1a:c2 (00:06:5b:8d:1a:c2)
        .... ...0 .... .... .... .... = IG bit: Individual address (unicast)
        .... ..0. .... .... .... .... = LG bit: Globally unique address
(factory default)
    Source: 00:06:5b:8d:1a:ec (00:06:5b:8d:1a:ec)
        Address: 00:06:5b:8d:1a:ec (00:06:5b:8d:1a:ec)
        .... ...0 .... .... .... .... = IG bit: Individual address (unicast)
        .... ..0. .... .... .... .... = LG bit: Globally unique address
(factory default)
    Type: IPv6 (0x86dd)
Internet Protocol Version 6
    Version: 6
    Traffic class: 0x00
    Flowlabel: 0x00000
    Payload length: 53
    Next header: TCP (0x06)
    Hop limit: 1
    Source address: 2001:db8:1::a506:5502:1 (2001:db8:1::a506:5502:1)
    Destination address: 2001:db8:1::a500:6777:1 (2001:db8:1::a500:6777:1)
Transmission Control Protocol, Src Port: 179 (179), Dst Port: 10379
(10379), Seq: 165, Ack: 267, Len: 21
    Source port: 179 (179)
    Destination port: 10379 (10379)
    Sequence number: 165    (relative sequence number)
    [Next sequence number: 186    (relative sequence number)]
    Acknowledgement number: 267    (relative ack number)
    Header length: 32 bytes
    Flags: 0x18 (PSH, ACK)
        0... .... = Congestion Window Reduced (CWR): Not set
        .0.. .... = ECN-Echo: Not set
        ..0. .... = Urgent: Not set
        ...1 .... = Acknowledgment: Set
        .... 1... = Push: Set
        .... .0.. = Reset: Not set
        .... ..0. = Syn: Not set
        .... ...0 = Fin: Not set
    Window size: 5712
    Checksum: 0x6232 [incorrect, should be 0xbdaa (maybe caused by
checksum offloading?)]
    Options: (12 bytes)
        NOP
        NOP
        Timestamps: TSval 2877490800, TSecr 257498768
    [SEQ/ACK analysis]
        [This is an ACK to the segment in frame: 19]
        [The RTT to ACK the segment was: 0.000259000 seconds]
Border Gateway Protocol
    NOTIFICATION Message
        Marker: 16 bytes
        Length: 21 bytes
        Type: NOTIFICATION Message (3)
        Error code: UPDATE Message Error (3)
        Error subcode: Invalid Network Field (10)

When the NOTIFICATION is received, the peer is set back to the state
Idle, where the process starts again. The only way to break the cicle is
to restart the entire OpenBGPD daemon.

Kind regards,

Arnoud Vermeer

Reply via email to