英文:
How to use decodeLinkLayerDiscovery in lldp.go?
问题
我想解码LLDP数据包中的信息:lldp.go使用decodeLinkLayerDiscovery函数来完成,但我不知道如何使用它。例如,我想获取MgmtAddress的值。我该怎么做?
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)
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)
}
}
}
以上是一个读取LLDP数据包的示例代码。在代码中,使用lldpLayer := packet.Layer(layers.LayerTypeLinkLayerDiscovery)
来获取LLDP层。然后,可以通过lldp
对象来访问LLDP的各个字段,例如lldp.MgmtAddress
来获取MgmtAddress的值。
英文:
I would like to decode informations in a LLDP packet : lldp.go do it with decodeLinkLayerDiscovery function but I don't know how to use it. For example, I want to get value of MgmtAddress. How can I do it ?
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)
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)
}
}
}
答案1
得分: 1
我找到了解决方案,我必须使用LayerTypeLinkLayerDiscoveryInfo:
lldpLayerInfos := packet.Layer(layers.LayerTypeLinkLayerDiscoveryInfo)
if lldpLayerInfos == nil {
continue
}
lldpInfos := lldpLayerInfos.(*layers.LinkLayerDiscoveryInfo)
log.Printf("[%v] ************************************************", iface.Name)
log.Printf("[%v] PortDescription : %s", iface.Name, lldpInfos.PortDescription)
log.Printf("[%v] SysName : %s", iface.Name, lldpInfos.SysName)
log.Printf("[%v] SysDescription : %s", iface.Name, lldpInfos.SysDescription)
var mgmtAddress string
switch lldpInfos.MgmtAddress.Subtype {
case layers.IANAAddressFamilyIPV4:
mgmtAddress = net.IP(lldpInfos.MgmtAddress.Address).String()
default:
mgmtAddress = string(lldpInfos.MgmtAddress.Address)
}
log.Printf("[%v] MgmtAddress : %s", iface.Name, mgmtAddress)
英文:
I found solution, I must use LayerTypeLinkLayerDiscoveryInfo :
lldpLayerInfos := packet.Layer(layers.LayerTypeLinkLayerDiscoveryInfo)
if lldpLayerInfos == nil {
continue
}
lldpInfos := lldpLayerInfos.(*layers.LinkLayerDiscoveryInfo)
log.Printf("[%v] ************************************************", iface.Name)
log.Printf("[%v] PortDescription : %s", iface.Name, lldpInfos.PortDescription)
log.Printf("[%v] SysName : %s", iface.Name, lldpInfos.SysName)
log.Printf("[%v] SysDescription : %s", iface.Name, lldpInfos.SysDescription)
var mgmtAddress string
switch lldpInfos.MgmtAddress.Subtype {
case layers.IANAAddressFamilyIPV4:
mgmtAddress = net.IP(lldpInfos.MgmtAddress.Address).String()
default:
mgmtAddress = string(lldpInfos.MgmtAddress.Address)
}
log.Printf("[%v] MgmtAddress : %s", iface.Name, mgmtAddress)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论