summaryrefslogtreecommitdiffhomepage
path: root/internal/pkg/zebra
diff options
context:
space:
mode:
Diffstat (limited to 'internal/pkg/zebra')
-rw-r--r--internal/pkg/zebra/zapi.go45
1 files changed, 32 insertions, 13 deletions
diff --git a/internal/pkg/zebra/zapi.go b/internal/pkg/zebra/zapi.go
index 2094c8f6..931ddd1e 100644
--- a/internal/pkg/zebra/zapi.go
+++ b/internal/pkg/zebra/zapi.go
@@ -217,6 +217,7 @@ const (
FRR_ZAPI6_INTERFACE_UP
FRR_ZAPI6_INTERFACE_DOWN
FRR_ZAPI6_INTERFACE_SET_MASTER
+ //FRR_ZAPI6_INTERFACE_SET_PROTODOWN // Add Frr 7.2
FRR_ZAPI6_ROUTE_ADD
FRR_ZAPI6_ROUTE_DELETE
FRR_ZAPI6_ROUTE_NOTIFY_OWNER
@@ -536,6 +537,7 @@ const (
FRR_ZAPI6_ROUTE_PBR
FRR_ZAPI6_ROUTE_BFD
FRR_ZAPI6_ROUTE_OPENFABRIC // FRRRouting version 7 adds.
+ FRR_ZAPI6_ROUTE_VRRP // FRRRouting version 7.2 adds.
FRR_ZAPI6_ROUTE_ALL
FRR_ZAPI6_ROUTE_MAX
)
@@ -645,6 +647,8 @@ var routeTypeValueMapFrrZapi6 = map[string]ROUTE_TYPE{
"sharp": FRR_ZAPI6_ROUTE_SHARP,
"pbr": FRR_ZAPI6_ROUTE_PBR,
"bfd": FRR_ZAPI6_ROUTE_BFD,
+ "openfabric": FRR_ZAPI6_ROUTE_OPENFABRIC,
+ "vrrp": FRR_ZAPI6_ROUTE_VRRP,
"all": FRR_ZAPI6_ROUTE_ALL,
}
@@ -733,7 +737,8 @@ func RouteTypeFromString(typ string, version uint8, softwareName string) (ROUTE_
}
t, ok := delegateRouteTypeValueMap[typ]
if (version == 5 && softwareName == "frr4" && t == FRR_ZAPI5_ROUTE_PBR) ||
- (version == 6 && softwareName == "frr6" && t == FRR_ZAPI6_ROUTE_OPENFABRIC) {
+ (version == 6 && softwareName == "frr6" && t == FRR_ZAPI6_ROUTE_OPENFABRIC) ||
+ (version == 6 && softwareName != "frr7.2" && t == FRR_ZAPI6_ROUTE_VRRP) {
ok = false
}
if ok {
@@ -1064,7 +1069,7 @@ func NewClient(network, address string, typ ROUTE_TYPE, version uint8, software
if ((version == 2 || version == 3) && software != "" && software != "quagga") ||
(version == 4 && software != "" && software != "frr3") ||
(version == 5 && software != "" && software != "frr4" && software != "frr5" && software != "cumulus") ||
- (version == 6 && software != "" && software != "frr6" && software != "frr7" && software != "frr7.1") {
+ (version == 6 && software != "" && software != "frr6" && software != "frr7" && software != "frr7.1" && software != "frr7.2") {
isAllowableSoftware = false
}
if !isAllowableSoftware {
@@ -1238,6 +1243,11 @@ func (c *Client) SendCommand(command API_TYPE, vrfId uint32, body Body) error {
} else {
return err
}
+ } else if c.Version == 6 && c.SoftwareName == "frr7.2" {
+ // frr7.2 adds INTERFACE_SET_PROTODOWN between INTERFACE_SET_MASTER(6) and ROUTE_ADD
+ if command >= FRR_ZAPI6_ROUTE_ADD {
+ command++
+ }
} else if c.Version == 5 && c.SoftwareName == "frr4" {
if frr4Command, err := frr4Zapi5Command(command, c.SoftwareName, false); err == nil {
command = frr4Command
@@ -1725,6 +1735,7 @@ type InterfaceUpdateBody struct {
MTU uint32
MTU6 uint32
Bandwidth uint32
+ LinkIfindex uint32
Linktype LINK_TYPE
HardwareAddr net.HardwareAddr
LinkParam LinkParam
@@ -1756,16 +1767,19 @@ func (b *InterfaceUpdateBody) DecodeFromBytes(data []byte, version uint8, softwa
b.MTU = binary.BigEndian.Uint32(data[0:4])
b.MTU6 = binary.BigEndian.Uint32(data[4:8])
b.Bandwidth = binary.BigEndian.Uint32(data[8:12])
+ data = data[12:]
+ if version == 6 && softwareName == "frr7.2" {
+ b.LinkIfindex = binary.BigEndian.Uint32(data[:4])
+ data = data[4:]
+ }
if version >= 3 {
- b.Linktype = LINK_TYPE(binary.BigEndian.Uint32(data[12:16]))
- data = data[16:]
- } else {
- data = data[12:]
+ b.Linktype = LINK_TYPE(binary.BigEndian.Uint32(data[:4]))
+ data = data[4:]
}
l := binary.BigEndian.Uint32(data[:4])
if l > 0 {
if len(data) < 4+int(l) {
- return fmt.Errorf("lack of bytes. need %d but %d", 4+l, len(data))
+ return fmt.Errorf("lack of bytes in remain data. need %d but %d", 4+l, len(data))
}
b.HardwareAddr = data[4 : 4+l]
}
@@ -2145,7 +2159,7 @@ func (b *IPRouteBody) Serialize(version uint8, softwareName string) ([]byte, err
buf = append(buf, uint8(nexthop.Type))
- if version == 6 && softwareName == "frr7.1" {
+ if version == 6 && (softwareName == "frr7.1" || softwareName == "frr7.2") {
buf = append(buf, nexthop.Onlink)
}
if (version <= 3 && nexthop.Type == NEXTHOP_TYPE_IPV4) ||
@@ -2332,7 +2346,7 @@ func (b *IPRouteBody) DecodeFromBytes(data []byte, version uint8, softwareName s
nexthop.VrfId = binary.BigEndian.Uint32(data[pos : pos+4])
nexthop.Type = NEXTHOP_TYPE(data[pos+4])
pos += 5
- if softwareName == "frr7.1" {
+ if softwareName == "frr7.1" || softwareName == "frr7.2" {
nexthop.Onlink = uint8(data[pos])
pos += 1
}
@@ -3234,6 +3248,11 @@ func (m *Message) parseFrrZapi6Message(data []byte, software string) error {
} else {
return err
}
+ } else if software == "frr7.2" {
+ // frr7.2 adds INTERFACE_SET_PROTODOWN between INTERFACE_SET_MASTER(6) and ROUTE_ADD
+ if command >= FRR_ZAPI6_ROUTE_ADD {
+ command--
+ }
}
switch command {
case FRR_ZAPI6_INTERFACE_ADD, FRR_ZAPI6_INTERFACE_DELETE, FRR_ZAPI6_INTERFACE_UP, FRR_ZAPI6_INTERFACE_DOWN:
@@ -3300,18 +3319,18 @@ func ParseMessage(hdr *Header, data []byte, software string) (m *Message, err er
return m, nil
}
-// frr6Zapi6Command adjust command (API_TYPE) between Frr6 Zebra and latest Zapi6
+// frr6Zapi6Command adjust command (API_TYPE) between Frr6 Zebra and frr7 Zapi6
func frr6Zapi6Command(command API_TYPE, softwareName string, from bool) (API_TYPE, error) {
if softwareName != "frr6" {
return command, fmt.Errorf("softwareName %s is not supported", softwareName)
}
- // frr6 has ZEBRA_IPV4_ROUTE_IPV6_NEXTHOP_ADD (ID:28), frr7 (zapi6 latest) removes it.
+ // frr6 has ZEBRA_IPV4_ROUTE_IPV6_NEXTHOP_ADD (ID:28), frr7 removes it.
// frr7 adds ZEBRA_DUPLICATE_ADDR_DETECTION (ID:72).
if from && FRR_ZAPI6_BFD_DEST_REGISTER < command && command < FRR_ZAPI6_PW_ADD {
- // if true, command will be converted from Frr6 Zebra to latest Zapi6 (for parsing)
+ // if true, command will be converted from Frr6 Zebra to Frr7 Zapi6 (for parsing)
return command - 1, nil
} else if !from && FRR_ZAPI6_IMPORT_CHECK_UPDATE < command && command < FRR_ZAPI6_DUPLICATE_ADDR_DETECTION {
- // if false, command will be converted from latest Zapi6 to Frr6 Zebra (for send)
+ // if false, command will be converted from Frr7 Zapi6 to Frr6 Zebra (for send)
return command + 1, nil
}
return command, nil