如何在lldp.go中使用decodeLinkLayerDiscovery获取MgmtAddress取值
实现方法
你使用的gopacket的layers库已经封装了LLDP报文的解码逻辑,无需手动调用底层decodeLinkLayerDiscovery函数,只需在拿到*layers.LinkLayerDiscovery实例后,遍历可选TLV字段提取管理地址即可。
依赖说明
代码依赖以下包,需提前安装:
github.com/google/gopacketgithub.com/google/gopacket/layersgithub.com/google/gopacket/pcap
完整修改后代码示例
func readLLDP(handle *pcap.Handle, iface *net.Interface, stop chan struct{}) { src := gopacket.NewPacketSource(handle, layers.LayerTypeEthernet) in := src.Packets() // 原示例中这两行代码无实际作用,可以删除 // p := gopacket.PacketBuilder{} // p.AddLayer() for { var packet gopacket.Packet select { case <-stop: return case packet = <-in: lldpLayer := packet.Layer(layers.LayerTypeLinkLayerDiscovery) if lldpLayer == nil { continue } lldp := lldpLayer.(*layers.LinkLayerDiscovery) // 原有获取ChassisID逻辑 var chassisID string switch lldp.ChassisID.Subtype { case layers.LLDPChassisIDSubTypeMACAddr: chassisID = net.HardwareAddr(lldp.ChassisID.ID).String() default: chassisID = string(lldp.ChassisID.ID) } log.Printf("[%v] ChassisID %v", iface.Name, chassisID) // 新增:获取MgmtAddress管理地址 var mgmtAddr string for _, tlv := range lldp.OptionalTLVs { if tlv.Type != layers.LLDPTLVTypeManagementAddress { continue } mgmtTLV, ok := tlv.Value.(*layers.LLDPManagementAddress) if !ok { continue } // 根据地址子类型格式化输出 switch mgmtTLV.AddressSubtype { case layers.LLDPAddressSubtypeIPv4: fallthrough case layers.LLDPAddressSubtypeIPv6: mgmtAddr = net.IP(mgmtTLV.Address).String() default: mgmtAddr = fmt.Sprintf("未知类型地址: %x", mgmtTLV.Address) } log.Printf("[%v] 管理地址: %v", iface.Name, mgmtAddr) // 一般LLDP报文只有一个管理地址,找到即可退出循环 break } } } }
注意事项
- 需确保依赖的
layers库版本为最新正式版,避免旧版本LLDP管理地址解码异常 - 部分设备LLDP报文可能不携带管理地址TLV,此时
mgmtAddr会为空,可根据业务需要增加空值判断逻辑
内容的提问来源于stack exchange,提问作者ipStack
相关产品推荐
相关产品推荐

