diff options
author | IWASE Yusuke <iwase.yusuke0@gmail.com> | 2017-11-13 16:14:48 +0900 |
---|---|---|
committer | FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> | 2017-11-21 10:56:23 +0900 |
commit | b94f12feaec48a8968f5b60c5dd9197dec4b6e43 (patch) | |
tree | 56becb5ab5ae3a0e2f5bfb2e34da46e05dd252ee | |
parent | cb328610d865bc0045f6b82391c2dadd529febe9 (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.go | 47 |
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 |