You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在lldp.go中使用decodeLinkLayerDiscovery获取MgmtAddress取值

实现方法

你使用的gopacket的layers库已经封装了LLDP报文的解码逻辑,无需手动调用底层decodeLinkLayerDiscovery函数,只需在拿到*layers.LinkLayerDiscovery实例后,遍历可选TLV字段提取管理地址即可。

依赖说明

代码依赖以下包,需提前安装:

  • github.com/google/gopacket
  • github.com/google/gopacket/layers
  • github.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 11:36:04