summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rwxr-xr-xcli/gobgpcli63
-rw-r--r--packet/bgp.go28
2 files changed, 62 insertions, 29 deletions
diff --git a/cli/gobgpcli b/cli/gobgpcli
index c973baa1..f019a857 100755
--- a/cli/gobgpcli
+++ b/cli/gobgpcli
@@ -90,6 +90,59 @@ class Show(object):
return 1
return self._neighbors()
+ def _format_attrs(self, attrlist):
+ attrs = []
+ for a in attrlist:
+ if a["Type"] == "BGP_ATTR_TYPE_NEXT_HOP":
+ pass
+ elif a["Type"] == "BGP_ATTR_TYPE_AS_PATH":
+ pass
+ elif a["Type"] == "BGP_ATTR_TYPE_ORIGIN":
+ attrs.append({"Origin": a["Value"]})
+ elif a["Type"] == "BGP_ATTR_TYPE_MULTI_EXIT_DISC":
+ attrs.append({"Med": a["Metric"]})
+ elif a["Type"] == "BGP_ATTR_TYPE_LOCAL_PREF":
+ attrs.append({"LocalPref": a["Pref"]})
+ elif a["Type"] == "BGP_ATTR_TYPE_ATOMIC_AGGREGATE":
+ attrs.append("AtomicAggregate")
+ elif a["Type"] == "BGP_ATTR_TYPE_AGGREGATE":
+ attrs.append({"Aggregate": {"AS": a["AS"], "Address": a["Address"]}})
+ elif a["Type"] == "BGP_ATTR_TYPE_COMMUNITIES":
+ wellknown = {
+ 0xffff0000: "planned-shut",
+ 0xffff0001: "accept-own",
+ 0xffff0002: "ROUTE_FILTER_TRANSLATED_v4",
+ 0xffff0003: "ROUTE_FILTER_v4",
+ 0xffff0004: "ROUTE_FILTER_TRANSLATED_v6",
+ 0xffff0005: "ROUTE_FILTER_v6",
+ 0xffff0006: "LLGR_STALE",
+ 0xffff0007: "NO_LLGR",
+ 0xFFFFFF01: "NO_EXPORT",
+ 0xFFFFFF02: "NO_ADVERTISE",
+ 0xFFFFFF03: "NO_EXPORT_SUBCONFED",
+ 0xFFFFFF04: "NOPEER"}
+
+ l = []
+ for v in a["Value"]:
+ if v in wellknown:
+ l.append(wellknown[v])
+ else:
+ l.append(str((0xffff0000 & v) >> 16) + ":" + str(0xffff & v))
+ attrs.append({"Community": l})
+ elif a["Type"] == "BGP_ATTR_TYPE_ORIGINATOR_ID":
+ attrs.append({"Originator": a["Address"]})
+ elif a["Type"] == "BGP_ATTR_TYPE_CLUSTER_LIST":
+ attrs.append({"Cluster": a["Address"]})
+ elif a["Type"] == "BGP_ATTR_TYPE_MP_REACH_NLRI":
+ pass
+ elif a["Type"] == "BGP_ATTR_TYPE_MP_UNREACH_NLRI":
+ pass
+ elif a["Type"] == "BGP_ATTR_TYPE_AS4_PATH":
+ pass
+ else:
+ attrs.append({a["Type"]: a["Value"]})
+ return attrs
+
def do_neighbor(self):
if len(self.args) != 2 and len(self.args) != 3:
return 1
@@ -101,7 +154,7 @@ class Show(object):
if self.options.debug:
print r.json()
return 0
- print(" Network Next Hop AS Attrs")
+ print(" Network Next Hop AS Attrs")
for d in r.json()["Destinations"]:
for p in d["Paths"]:
nexthop = ""
@@ -111,8 +164,12 @@ class Show(object):
nexthop = a["Nexthop"]
elif a["Type"] == "BGP_ATTR_TYPE_AS_PATH":
AS = a["AsPath"]
- print(" {:s} {:s} {:s} {:s}".format(p["Network"],
- nexthop, AS, p["Attrs"]))
+ if p["Best"] == "true":
+ header = "*>"
+ else:
+ header = "*"
+ print("{:s} {:s} {:s} {:s} {:s}".format(header, p["Network"],
+ nexthop, AS, self._format_attrs(p["Attrs"])))
return 0
diff --git a/packet/bgp.go b/packet/bgp.go
index 527ebb7a..f7427973 100644
--- a/packet/bgp.go
+++ b/packet/bgp.go
@@ -1554,36 +1554,12 @@ func (p *PathAttributeCommunities) Serialize() ([]byte, error) {
}
func (p *PathAttributeCommunities) MarshalJSON() ([]byte, error) {
- wellKnown := map[uint32]string{
- 0xffff0000: "planned-shut",
- 0xffff0001: "accept-own",
- 0xffff0002: "ROUTE_FILTER_TRANSLATED_v4",
- 0xffff0003: "ROUTE_FILTER_v4",
- 0xffff0004: "ROUTE_FILTER_TRANSLATED_v6",
- 0xffff0005: "ROUTE_FILTER_v6",
- 0xffff0006: "LLGR_STALE",
- 0xffff0007: "NO_LLGR",
- 0xFFFFFF01: "NO_EXPORT",
- 0xFFFFFF02: "NO_ADVERTISE",
- 0xFFFFFF03: "NO_EXPORT_SUBCONFED",
- 0xFFFFFF04: "NOPEER"}
-
- l := make([]string, len(p.Value))
- for i, v := range p.Value {
- s, found := wellKnown[v]
- if found {
- l[i] = s
- } else {
- l[i] = fmt.Sprintf("%d:%d", (v&0xffff0000)>>16, v&0xffff)
- }
- }
-
return json.Marshal(struct {
Type string
- Value []string
+ Value []uint32
}{
Type: p.Type.String(),
- Value: l,
+ Value: p.Value,
})
}