func showNeighborRib(r string, name string, args []string) error { showBest := false showAge := true showLabel := false def := addr2AddressFamily(net.ParseIP(name)) switch r { case CMD_GLOBAL: def = bgp.RF_IPv4_UC showBest = true case CMD_LOCAL: showBest = true case CMD_ADJ_OUT: showAge = false case CMD_VRF: def = bgp.RF_IPv4_UC } family, err := checkAddressFamily(def) if err != nil { return err } switch family { case bgp.RF_IPv4_MPLS, bgp.RF_IPv6_MPLS, bgp.RF_IPv4_VPN, bgp.RF_IPv6_VPN: showLabel = true } var filter []*table.LookupPrefix if len(args) > 0 { var option table.LookupOption if len(args) > 1 { if args[1] == "longer-prefixes" { option = table.LOOKUP_LONGER } else if args[1] == "shorter-prefixes" { option = table.LOOKUP_SHORTER } else { return fmt.Errorf("invalid format for route filtering") } } filter = []*table.LookupPrefix{&table.LookupPrefix{ Prefix: args[0], LookupOption: option, }, } } var rib *table.Table switch r { case CMD_GLOBAL: rib, err = client.GetRIB(family, filter) case CMD_LOCAL: rib, err = client.GetLocalRIB(name, family, filter) case CMD_ADJ_IN, CMD_ACCEPTED, CMD_REJECTED: rib, err = client.GetAdjRIBIn(name, family, filter) case CMD_ADJ_OUT: rib, err = client.GetAdjRIBOut(name, family, filter) case CMD_VRF: rib, err = client.GetVRFRIB(name, family, filter) } if err != nil { return err } switch r { case CMD_LOCAL, CMD_ADJ_IN, CMD_ACCEPTED, CMD_REJECTED, CMD_ADJ_OUT: if rib.Info("").NumDestination == 0 { peer, err := getNeighbor(name) if err != nil { return err } if peer.State.SessionState != config.SESSION_STATE_ESTABLISHED { return fmt.Errorf("Neighbor %v's BGP session is not established", name) } } } if globalOpts.Json { j, _ := json.Marshal(rib.GetDestinations()) fmt.Println(string(j)) return nil } counter := 0 for _, d := range rib.GetSortedDestinations() { var ps []*table.Path if r == CMD_ACCEPTED || r == CMD_REJECTED { for _, p := range d.GetAllKnownPathList() { switch r { case CMD_ACCEPTED: if p.Filtered("") > table.POLICY_DIRECTION_NONE { continue } case CMD_REJECTED: if p.Filtered("") == table.POLICY_DIRECTION_NONE { continue } } ps = append(ps, p) } } else { ps = d.GetAllKnownPathList() } if counter == 0 { ShowRoute(ps, showAge, showBest, showLabel, false, true) } else { ShowRoute(ps, showAge, showBest, showLabel, false, false) } counter++ } if counter == 0 { fmt.Println("Network not in table") } return nil }