MCPcopy
hub / github.com/osrg/gobgp / decodeFromBytes

Method decodeFromBytes

pkg/zebra/zapi.go:1955–2050  ·  view source on GitHub ↗

Ref: zebra_interface_if_set_value in lib/zclient.c of Quagga1.2&FRR3&FRR4&FRR5&FRR6&FRR7.x&FRR8 (ZAPI3&4&5&6)

(data []byte, version uint8, software Software)

Source from the content-addressed store, hash-verified

1953
1954// Ref: zebra_interface_if_set_value in lib/zclient.c of Quagga1.2&FRR3&FRR4&FRR5&FRR6&FRR7.x&FRR8 (ZAPI3&4&5&6)
1955func (b *interfaceUpdateBody) decodeFromBytes(data []byte, version uint8, software Software) error {
1956 ifNameSize := interfaceNameSize
1957 if version == 6 && software.name == "frr" && software.version >= 8.3 {
1958 ifNameSize = osIfNameSize
1959 }
1960 // version 2: index(4)+status(1)+flags(8)+metric(4)+mtu(4)+mtu6(4)+bandwidth(4)+hw_addr_len(4)
1961 necessaryDataSize := ifNameSize + 33
1962 if version > 3 {
1963 necessaryDataSize += 6 // add ptmEnable(1)+ptmStatus(1)+speed(4)
1964 }
1965 if version > 2 {
1966 necessaryDataSize += 4 // add linktype(4)
1967 }
1968 if version == 6 && software.name == "frr" && software.version >= 7.2 {
1969 necessaryDataSize += 4 // add linkIfIndex(4)
1970 }
1971 if len(data) < necessaryDataSize {
1972 return fmt.Errorf("lack of bytes. need %d but %d", necessaryDataSize, len(data))
1973 }
1974
1975 b.name = strings.Trim(string(data[:ifNameSize]), "\u0000")
1976 data = data[ifNameSize:]
1977 b.index = binary.BigEndian.Uint32(data[:4])
1978 b.status = interfaceStatus(data[4])
1979 b.flags = binary.BigEndian.Uint64(data[5:13])
1980 if version > 3 {
1981 b.ptmEnable = ptmEnable(data[13])
1982 b.ptmStatus = ptmStatus(data[14])
1983 b.metric = binary.BigEndian.Uint32(data[15:19])
1984 b.speed = binary.BigEndian.Uint32(data[19:23])
1985 data = data[23:]
1986 } else {
1987 b.metric = binary.BigEndian.Uint32(data[13:17])
1988 data = data[17:]
1989 }
1990 b.mtu = binary.BigEndian.Uint32(data[:4])
1991 b.mtu6 = binary.BigEndian.Uint32(data[4:8])
1992 b.bandwidth = binary.BigEndian.Uint32(data[8:12])
1993 data = data[12:]
1994
1995 // frr 7.2 and later versions have link Ifindex
1996 if version == 6 && software.name == "frr" && software.version >= 7.2 {
1997 b.linkIfindex = binary.BigEndian.Uint32(data[:4])
1998 data = data[4:]
1999 }
2000 if version > 2 {
2001 b.linktype = linkType(binary.BigEndian.Uint32(data[:4]))
2002 data = data[4:]
2003 }
2004 l := binary.BigEndian.Uint32(data[:4]) // STREAM_GETL(s, ifp->hw_addr_len)
2005 if l > 0 {
2006 if len(data) < 4+int(l) {
2007 return fmt.Errorf("lack of bytes in remain data. need %d but %d", 4+l, len(data))
2008 }
2009 b.hardwareAddr = data[4 : 4+l] // STREAM_GET(ifp->hw_addr, s, MIN(ifp->hw_addr_len, INTERFACE_HWADDR_MAX));
2010 }
2011 if version > 2 {
2012 if len(data) < 4+int(l)+1 {

Callers 1

Test_interfaceUpdateBodyFunction · 0.95

Calls 4

interfaceStatusTypeAlias · 0.85
ptmEnableTypeAlias · 0.85
ptmStatusTypeAlias · 0.85
linkTypeTypeAlias · 0.85

Tested by 1

Test_interfaceUpdateBodyFunction · 0.76