You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 0fb018b
Browse filesBrowse the repository at this point in the historyBrowse files
fix(bgp): the ExaBGP api stage, and the panic it was hiding
The ExaBGP compatibility api stage goes 28/40 to 40/40. The encoding
stage stays 42/42.
Three cases exited 2 with an EMPTY stderr. Exit 2 is Go's status for an
unrecovered panic, and the trace reached nobody: crashlog.Init dup2s fd
2 onto a pipe a reader goroutine drains, the runtime writes the trace
and ends the process, so the reader is never scheduled. main called
flushCrashlog only on the ordinary return, which a panic skips. Every ze
binary was affected. main now ALSO defers it, so fd 2 is restored while
the panic unwinds; the ordinary call stays because os.Exit runs no
deferred function.
The trace it was hiding named the defect in one frame. WireUpdate.Attrs
answers (nil, nil) for a withdraw-only UPDATE, which carries no
attribute section, and the bridge's three overlays read it. Checking the
error alone is the nil a caller cannot tell from an answer.
The withdraw path never went through the bridge's renames: the announce
arm called exabgpNLRIObject and the del arm passed the object through,
so one route read as nlri/label/65000:1 outbound and
prefix/labels/0:65000:1 back. A withdraw also KEEPS its next hop in the
attribute object, where an announce drops it: ExaBGP reads
include_nexthop = bool(minus), because a withdraw has no announce key to
hang it under.
A Path Identifier of ZERO was dropped as if ADD-PATH were off. RFC 7911
Section 3 reserves no value, and appendIPv4PrefixesFromWire HELD the
negotiated flag and still wrote it only when the identifier was
non-zero. ParseINET had the same shape one layer down: it consumed the
four octets and threw the flag away, so an *INET could not say whether
it carried an identifier at all.
interface-set is named in both directions now. It was the fifth extended
community ze could encode and not read back; the config migration wrote
it as raw hex and said ze had no name for it. It is also the one place
the two vocabularies genuinely diverge rather than differ: the draft
defines the community twice, transitive and non-transitive, and ze
carries every extended community in one flat list, so its text is the
only place that bit can go. ExaBGP has a scope block, so it prints four
fields and puts transitivity in a JSON member, the only community it
writes that member for.
Three api fixtures stated peer 127.0.0.1 where their own ze config
declares 127.0.0.2. That config header records the move and RFC 4271
Section 5.1.3 as its reason, and says the expected frames are unchanged,
which held for the hex and not for the json lines. ExaBGP renders the
member from the CONFIGURED neighbor, not the socket.
Copy file name to clipboardExpand all lines: docs/exabgp/exabgp-differences.md
+16-2Lines changed: 16 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -107,7 +107,7 @@ is gone.
107
107
108
108
## JSON member spellings the bridge folds
109
109
110
-
Four members carry the same fact under different words. Ze keeps its own word,
110
+
Five members carry the same fact under different words. Ze keeps its own word,
111
111
because each is load-bearing on Ze's side, and the bridge writes ExaBGP's word
112
112
so a script reads one vocabulary.
113
113
@@ -117,6 +117,7 @@ so a script reads one vocabulary.
117
117
| RFC 7911 Path Identifier |`"path-id": 16909060`|`"path-information": "1.2.3.4"`| RFC 7911 Section 3 calls it a 4-octet value, and Ze's CLI and RIB read the number |
118
118
| FlowSpec DSCP on IPv6 |`dscp`|`traffic-class`| RFC 8956 Section 8 registers component type 11 as `DSCP` under both its IPv4 and its IPv6 name |
119
119
| FlowSpec traffic-marking and traffic-action |`mark:10`, `traffic-action:sample`|`mark 10`, `action sample`| the FlowSpec firewall lowering keys on the colon form |
120
+
| Interface set transitivity |`interface-set:non-transitive:input:1234:10`|`interface-set:input:1234:10` plus `"transitive": false`| Ze carries every extended community in one flat list, and ExaBGP has a `scope` block to state it beside |
120
121
121
122
Nothing is lost either way, so each is a spelling rather than a conversion. The
122
123
RFC governs the wire and says nothing about a JSON member, which is what leaves
@@ -128,7 +129,7 @@ quad in both projects, and so do `l2info` and the FlowSpec redirect-to-IP
128
129
communities, because Ze's config parser already read those spellings and its
0 commit comments