3

l3_learning.py では、class l3_switchnamedにメソッドがあり_handle_PacketInます。これで、このイベントは、テーブルにエントリがない対応するパケットを受信したときに、スイッチがコントローラーに接続したときであることがわかりました。

わからないのはここ

packet = event.parsed

では とはpacket.nextどういう意味isinstance(packet.next, ipv4)ですか?

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
4

1 に答える 1

4

私はそれを理解したと思います。

パケットは、データリンク層が物理層に送信するパケット全体です。packet.next は、データリンク層のカプセル化を取り除き、IP パケット (IP 層からデータリンク層に送信されるパケット) を明らかにします。したがって、送信元 MAC アドレスを取得するには packet.src を使用し、送信元の IP アドレスを取得するには packet.next.srcip を使用します。

于 2016-03-25T12:30:12.643 に答える