在l3_learning.py中,class l3_switch中有一个名为_handle_PacketIn的方法。现在我知道这个事件是当交换机接收到一个在其表中没有对应条目的数据包时联系控制器的事件。
我不明白的是这里
packet = event.parsed那么在isinstance(packet.next, ipv4)中packet.next是什么意思呢?
def _handle_PacketIn (self, event):
dpid = event.connection.dpid
inport = event.port
packet = event.parsed
if not packet.parsed:
log.warning("%i %i ignoring unparsed packet", dpid, inport)
return
if dpid not in self.arpTable:
# New switch -- create an empty table
self.arpTable[dpid] = {}
for fake in self.fakeways:
self.arpTable[dpid][IPAddr(fake)] = Entry(of.OFPP_NONE,
dpid_to_mac(dpid))
if packet.type == ethernet.LLDP_TYPE:
# Ignore LLDP packets
return
if isinstance(packet.next, ipv4):
log.debug("%i %i IP %s => %s", dpid,inport,
packet.next.srcip,packet.next.dstip)
# Send any waiting packets...
self._send_lost_buffers(dpid, packet.next.srcip, packet.src, inport)
# Learn or update port/MAC info
if packet.next.srcip in self.arpTable[dpid]:
if self.arpTable[dpid][packet.next.srcip] != (inport, packet.src):
log.info("%i %i RE-learned %s", dpid,inport,packet.next.srcip)
else:
log.debug("%i %i learned %s", dpid,inport,str(packet.next.srcip))
self.arpTable[dpid][packet.next.srcip] = Entry(inport, packet.src)
# Try to forward
dstaddr = packet.next.dstip
if dstaddr in self.arpTable[dpid]:
# We have info about what port to send it out on...
prt = self.arpTable[dpid][dstaddr].port
mac = self.arpTable[dpid][dstaddr].mac发布于 2016-03-25 20:30:13
我想我已经弄明白了。
数据包是数据链路层发送到物理层的整个数据包。packet.next去掉了对数据链路层的封装,将IP数据包( IP层发送到数据链路层的数据包)暴露出来。因此,为了获得源地址,我们使用packet.src,为了获得源的IP地址,我们使用packet.next.srcip
https://stackoverflow.com/questions/36219238
复制相似问题