LLDP报文格式

LLDP报文格式前面已经知道了FloodlightController是通过从SW发送LLDP帧来获得链路信息的,链路层发现协议(L2)是通过在本地网络中广播LLDP报文来通告自己的设备信息,从而服务于拓扑计算,(wikipedia:LLDPinformationissentbydevicesfromeachoftheirinterfacesatafixedinterval,i

大家好,又见面了,我是你们的朋友全栈君。


     前面已经知道了Floodlight Controller是通过从SW发送LLDP帧来获得链路信息的,链路层发现协议(L2)是通过在本地网络中广播LLDP报文来通告自己的设备信息,从而服务于拓扑计算,(wikipedia:LLDP information is sent by devices from each of their interfaces at a fixed interval, in the form of an Ethernet frame. Each frame contains one LLDP Data Unit (LLDPDU). Each LLDPDU is a sequence of type-length-value (TLV) structures.)报文格式如下:
LLDP报文格式

type-length-value 的设计很常见(比如netlink中attribute也是这种格式),这里的TLV结构是:
LLDP报文格式
LLDP报文格式

此时再看代码就很容易理解:
public 
class 
LLDPTLV {
     
protected 
byte 
type 
;
     
protected 
short 
length 
;
     
protected 
byte
[] 
value 
;

     
public 
byte 
getType() {
           
return 
type 
;
     }

     
public 
LLDPTLV setType( 
byte 
type) {
           
this
.
type 
= type;
           
return 
this 
;
     }

     
public 
short 
getLength() {
           
return 
length 
;
     }

     
public 
LLDPTLV setLength( 
short 
length) {
           
this
.
length 
= length;
           
return 
this 
;
     }

     
public 
byte
[] getValue() {
           
return 
value 
;
     }

     
public 
LLDPTLV setValue( 
byte
[] value) {
           
this
.
value 
= value;
           
return 
this 
;
     }

     
// serialization – Turn data into a stream of bytes
     
public 
byte
[] serialize() {
           
// type = 7 bits
           
// info string length 9 bits, each value == byte
           
// info string
           
short 
scratch = (
short
) (((0x7f & 
this
. 
type
) << 9) | (0x1ff & 
this 
.
length 
));
           
// 7+9 = 2B
           
byte
[] data = 
new 
byte
[2 + 
this
.
length 
];
          ByteBuffer bb = ByteBuffer. wrap(data);
          bb.putShort(scratch);
           
if 
(
this 
.
value 
!= 
null
)
              bb.put( 
this
.
value 
);
           
return 
data;
     }

     
// deserialization – Turn a stream of bytes back into a copy of the original
     
// object.
     
public 
LLDPTLV deserialize(ByteBuffer bb) {
           
short 
sscratch;
          sscratch = bb.getShort();
           
this
.
type 
= (
byte
) ((sscratch >> 9) & 0x7f);
           
this
.
length 
= (
short
) (sscratch & 0x1ff);
           
if 
(
this 
.
length 
> 0) {
               
this
.
value 
= 
new 
byte
[ 
this
.
length 
];

               
// if there is an underrun just toss the TLV
               
if 
(bb.remaining() < 
this
.
length
)
                    
return 
null 
;
              bb.get( 
this
.
value 
);
          }
           
return 
this 
;
     }
}

public 
class 
LLDP 
extends 
BasePacket {
     
protected 
LLDPTLV 
chassisId
;
     
protected 
LLDPTLV 
portId
;
     
protected 
LLDPTLV 
ttl
;
     
protected 
List<LLDPTLV> 
optionalTLVList
;
     
protected 
short 
ethType 
;
     
//上述几个字段都是LLDP协议规定的

     
public 
LLDP() {
           
this
.
optionalTLVList 
= 
new 
ArrayList<LLDPTLV>();
           
this
.
ethType 
= Ethernet.
TYPE_LLDP
; 
// 0x88cc
     }
     
public 
LLDPTLV getChassisId() {
           
return 
chassisId 
;
     }

     
public 
LLDP setChassisId(LLDPTLV chassisId) {
           
this
.
chassisId 
= chassisId;
           
return 
this 
;
     }

     
public 
LLDPTLV getPortId() {
           
return 
portId 
;
     }

     
public 
LLDP setPortId(LLDPTLV portId) {
           
this
.
portId 
= portId;
           
return 
this 
;
     }

     
public 
LLDPTLV getTtl() {
           
return 
ttl 
;
     }

     
public 
LLDP setTtl(LLDPTLV ttl) {
           
this
.
ttl 
= ttl;
           
return 
this 
;
     }

     
public 
List<LLDPTLV> getOptionalTLVList() {
           
return 
optionalTLVList 
;
     }

     
public 
LLDP setOptionalTLVList(List<LLDPTLV> optionalTLVList) {
           
this
.
optionalTLVList 
= optionalTLVList;
           
return 
this 
;
     }

     
@Override
     
public 
byte
[] serialize() {
           
int 
length = 2 + 
this
.
chassisId
.getLength() + 2
                   + 
this
.
portId 
.getLength() + 2 + 
this
.
ttl 
.getLength() + 2;
           
for 
(LLDPTLV tlv : 
this
.
optionalTLVList
) {
              length += 2 + tlv.getLength();
          }

           
byte
[] data = 
new 
byte
[length];
          ByteBuffer bb = ByteBuffer. wrap(data);
          bb.put( 
this
.
chassisId 
.serialize());
          bb.put( 
this
.
portId 
.serialize());
          bb.put( 
this
.
ttl 
.serialize());
           
for 
(LLDPTLV tlv : 
this
.
optionalTLVList
) {
              bb.put(tlv.serialize());
          }
          bb.putShort(( 
short
) 0); 
// End of LLDPDU

           
if 
(
this 
.
parent 
!= 
null 
&& 
this
. 
parent 
instanceof 
Ethernet)
              ((Ethernet) 
this
.
parent 
).setEtherType(
ethType
);

           
return 
data;
     }

     
@Override
     
public 
IPacket deserialize( 
byte
[] data, 
int 
offset, 
int 
length) {
          ByteBuffer bb = ByteBuffer. wrap(data, offset, length);
          LLDPTLV tlv;
           
do 
{
              tlv = 
new 
LLDPTLV().deserialize(bb);

               
// if there was a failure to deserialize stop processing TLVs
               
if 
(tlv == 
null 
)
                    
break
;
               
switch 
(tlv.getType()) {
               
case 
0x0:
                    
// can throw this one away, its just an end delimiter
                    
break
;
               
case 
0x1:
                    
this
.
chassisId 
= tlv;
                    
break
;
               
case 
0x2:
                    
this
.
portId 
= tlv;
                    
break
;
               
case 
0x3:
                    
this
.
ttl 
= tlv;
                    
break
;
               
default
:
                    
this
.
optionalTLVList 
.add(tlv);
                    
break
;
              }
          } 
while 
(tlv.getType() != 0 && bb.hasRemaining());
           
return 
this 
;
     }
}


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/140278.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • java多线程面试题总结

    java多线程面试题总结java多线程面试题总结

  • 永远埋藏我的故事_把你藏进我的回忆

    永远埋藏我的故事_把你藏进我的回忆因为本身大家看来可能就很俗套吧!可是昨天他的一句话,我地动山摇,他还是牺牲了我来成全他的事业!在我没发生这件事情之前,我也很轻描淡写的劝我曾经遇见这样事情的大学同学,可是没想到一向心高气傲的我也会这样不理智,甚至可以说是堕落!      今年我大学毕业,说来很可笑,我现在还是初恋,没遇见他之前我的手都没让男生拉过,借别的系的师兄说的话,我是冷美人,可望不可急。是的,我一直都认为漂亮不是资本,而事业

  • “SqlTransaction 已完成;它再也无法使用”解决方法

    “SqlTransaction 已完成;它再也无法使用”解决方法 当只是使用一次事务时,只用简单的事务就可以了示例代码:      SqlServerDataBaseobj=newSqlServerDataBase();       SqlConnectionconn=obj.DBconn();       conn.Open();       SqlTransactionmyTrans;       myTrans=co

  • 查看 android打包证书签名

    查看 android打包证书签名查看android打包证书签名用javakeytool查看证书签名keytool-list-v-keystore证书路径输入证书密码之后会看到MD5\SHA1\SHA256签名。这里插一句题外话,有的平台需要的也是签名例如微信系列的直接把签名大写改成小写去掉冒号即可。…

  • 计算机网络p2p协议在第几页_p2p传输协议

    计算机网络p2p协议在第几页_p2p传输协议在上篇文章中说过,要写写P2P协议的,嗯,来写写,虽然写的不是太好.P2P是什么?还是要回到这个场景:如果想要下载一个电影,一般都是通过什么方式呢?我希望这次你的答案,除了HTTP方式,还有FTP方式(要不上篇文章岂不是白写了?)但是你发现了嘛,不管是HTTP的方式,还是FTP的方式,都有一个比较大的缺点,就是难以解决单一服务器的带宽压力,因为它们使用的都是传统的…

    2022年10月21日
  • Assert.assertEquals()方法参数详解

    Assert.assertEquals()方法参数详解junit.framework包下的Assert提供了多个断言方法.主用于比较测试传递进去的两个参数.Assert.assertEquals();及其重载方法:1.如果两者一致,程序继续往下运行.2.如果两者不一致,中断测试方法,抛出异常信息AssertionFailedError.查看源码,以Assert.assertEquals(intexpected,inta…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号