在POX中操作数据包
标签(空格分隔): 博客 SDN
想在SDN控制器中做点事情,必须要能够解析上来的packet,在POX中利用pox.lib.packet中的组件很方便,重点是熟悉各个协议的字段。POX文档 POX Wiki 相对比较完善,值得好好看看。
各个协议类继承了packet_base, 里面的find 方法很实用,在解析packet的时候, find(‘protocol’)就会解析得到对应协议的包。
解析到传输层后的payload类型是str,我们可以探测里面的内容,但是长度不一定是整个packet(可以修改)。
下面是我解析UDP包的过程,得到里面的内容之后,就可以对应设计自己的策略。
def spy_udp_packet(self, packet):
ip = packet.find('ipv4')
if ip is None:
return
log.debug('protocol={},srcip={},dstip={}'.format(ip.protocol, ip.srcip, ip.dstip))
# we only care about UDP packet
udp_packet = ip.find('udp')
if udp_packet is None:
return
log.debug('srcport={},dstport={}'.format(udp_packet.srcport, udp_packet.dstport))
udp_payload = udp_packet.payload
# The payload include a '\n' , and its type is <type 'str'>
log.debug('udp playload(len={}): {},type={}'.format(len(udp_payload), str(udp_payload), type(udp_payload)))