summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorIWASE Yusuke <iwase.yusuke0@gmail.com>2017-11-13 16:14:48 +0900
committerFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>2017-11-21 10:56:23 +0900
commitb94f12feaec48a8968f5b60c5dd9197dec4b6e43 (patch)
tree56becb5ab5ae3a0e2f5bfb2e34da46e05dd252ee
parentcb328610d865bc0045f6b82391c2dadd529febe9 (diff)
cli: Missing keywords for EVPN Prefix Route
Currently, the keywords "rt" and "encap" for EVPN Prefix Route are unexpectedly ignored when parsing the inputs from "gobgp" command. Also, "label" is not described in the usage. This patch fixes to pass these keywords to be advertised and updates the usage format. Note: This patch makes "rt" as optional field in the usage because "rt" can be omitted when deleting. Signed-off-by: IWASE Yusuke <iwase.yusuke0@gmail.com>
-rw-r--r--gobgp/cmd/global.go47
1 files changed, 30 insertions, 17 deletions
diff --git a/gobgp/cmd/global.go b/gobgp/cmd/global.go
index cdc21b2e..0842b124 100644
--- a/gobgp/cmd/global.go
+++ b/gobgp/cmd/global.go
@@ -488,50 +488,63 @@ func ParseEvpnMulticastArgs(args []string) (bgp.AddrPrefixInterface, []string, e
return bgp.NewEVPNNLRI(bgp.EVPN_INCLUSIVE_MULTICAST_ETHERNET_TAG, 0, r), extcomms, nil
}
-func ParseEVPNIPPrefixArgs(args []string) (bgp.AddrPrefixInterface, []string, error) {
- if len(args) < 6 {
- return nil, nil, fmt.Errorf("lack of number of args needs 6 at least but got %d", len(args))
+func ParseEvpnIPPrefixArgs(args []string) (bgp.AddrPrefixInterface, []string, error) {
+ // Format:
+ // <ip prefix> [gw <gateway>] etag <etag> [label <label>] rd <rd> [rt <rt>...] [encap <encap type>]
+ req := 5
+ if len(args) < req {
+ return nil, nil, fmt.Errorf("%d args required at least, but got %d", req, len(args))
}
- m := extractReserved(args, []string{"gw", "rd", "rt", "encap", "etag", "label"})
+ m := extractReserved(args, []string{"gw", "etag", "label", "rd", "rt", "encap"})
if len(m[""]) < 1 {
return nil, nil, fmt.Errorf("specify prefix")
}
+ for _, f := range []string{"etag", "rd"} {
+ for len(m[f]) == 0 {
+ return nil, nil, fmt.Errorf("specify %s", f)
+ }
+ }
+
ip, n, err := net.ParseCIDR(m[""][0])
if err != nil {
return nil, nil, err
}
ones, _ := n.Mask.Size()
+
var gw net.IP
if len(m["gw"]) > 0 {
gw = net.ParseIP(m["gw"][0])
}
- if len(m["rd"]) < 1 {
- return nil, nil, fmt.Errorf("specify RD")
- }
rd, err := bgp.ParseRouteDistinguisher(m["rd"][0])
if err != nil {
return nil, nil, err
}
- var etag uint32
- if len(m["etag"]) > 0 {
- e, err := strconv.Atoi(m["etag"][0])
- if err != nil {
- return nil, nil, err
- }
- etag = uint32(e)
+ e, err := strconv.Atoi(m["etag"][0])
+ if err != nil {
+ return nil, nil, fmt.Errorf("invalid etag: %s: %s", m["etag"][0], err)
}
+ etag := uint32(e)
var label uint32
if len(m["label"]) > 0 {
e, err := strconv.Atoi(m["label"][0])
if err != nil {
- return nil, nil, err
+ return nil, nil, fmt.Errorf("invalid label: %s: %s", m["label"][0], err)
}
label = uint32(e)
}
+ extcomms := make([]string, 0)
+ if len(m["rt"]) > 0 {
+ extcomms = append(extcomms, "rt")
+ extcomms = append(extcomms, m["rt"]...)
+ }
+ if len(m["encap"]) > 0 {
+ extcomms = append(extcomms, "encap", m["encap"][0])
+ }
+
r := &bgp.EVPNIPPrefixRoute{
RD: rd,
ETag: etag,
@@ -555,7 +568,7 @@ func ParseEvpnArgs(args []string) (bgp.AddrPrefixInterface, []string, error) {
case "multicast":
return ParseEvpnMulticastArgs(args)
case "prefix":
- return ParseEVPNIPPrefixArgs(args)
+ return ParseEvpnIPPrefixArgs(args)
}
return nil, nil, fmt.Errorf("invalid subtype. expect [macadv|multicast|prefix] but %s", subtype)
}
@@ -1073,7 +1086,7 @@ usage: %s rib %s%%smatch <MATCH_EXPR> then <THEN_EXPR> -a %%s
helpErrMap[bgp.RF_EVPN] = fmt.Errorf(`usage: %s rib %s { macadv <MACADV> | multicast <MULTICAST> | prefix <PREFIX> } -a evpn
<MACADV> : <mac address> <ip address> etag <etag> label <label> rd <rd> [rt <rt>...] [encap <encap type>]
<MULTICAST> : <ip address> etag <etag> rd <rd> [rt <rt>...] [encap <encap type>]
- <PREFIX> : <ip prefix> [gw <gateway>] etag <etag> rd <rd> rt <rt>... [encap <encap type>]`, cmdstr, modtype)
+ <PREFIX> : <ip prefix> [gw <gateway>] etag <etag> [label <label>] rd <rd> [rt <rt>...] [encap <encap type>]`, cmdstr, modtype)
helpErrMap[bgp.RF_OPAQUE] = fmt.Errorf(`usage: %s rib %s key <KEY> [value <VALUE>]`, cmdstr, modtype)
if err, ok := helpErrMap[rf]; ok {
return err