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)
| 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) |
| 1955 | func (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 { |