如何使用ryu控制器向所有交换机发送数据包?



我需要测量 Ryu 控制器中的链路延迟。我想通过控制器为所有交换机发送数据包输出消息,并计算发送数据包输出消息和接收数据包传入消息之间的时间。我是Ryu的初学者,不知道如何将具有特定EtherType(例如0x8fc(的数据包发送到所有交换机。我已经获得了所有交换机的MAC并构建了一个数据包。如何将具有特定以太网类型的数据包发送到所有交换机?我不知道每个交换机的 db 参数是什么?

def send_packet(self, dp, port, pkt):
ofproto = dp.ofproto
parser = dp.ofproto_parser
pkt.serialize()
data = pkt.data
action = [parser.OFPActionOutput(port=port)]
out = parser.OFPPacketOut(
datapath=dp, buffer_id=ofproto.OFP_NO_BUFFER,
in_port=ofproto.OFPP_CONTROLLER,
actions=action, data=data)
dp.send_msg(out)
def create_packet(self):
i=l=0
for l in range(1,len(self.adjacency)+1):
#print("n")
for i in self.adjacency[l]:
ethertype = 0x8fc
dst = self.macaddr(i)
src = self.macaddr(l) 
e = ethernet.ethernet(dst, src, ethertype)                
p = packet.Packet()
p.add_protocol(e)
p.add_protocol(time.time())
p.serialize()
port=self.adjacency[l][i]
send_packet(self, dp **??????** , port, p):

DP 是 DataPathID 的缩写,是网络中 OpenFlow 交换机的 Uniq ID。

根据 OpenFlow 规范:

"datapath_id字段唯一标识数据路径。下部 48 位用于交换机 MAC 地址,而前 16 位 取决于实施者。前 16 位的示例用法是 用于区分单个虚拟交换机实例的 VLAN ID 物理开关。

例如,如果您使用的是 Mininet,并且运行线性拓扑:

mn --controller remote --topo linear,3

您的拓扑将是:

s1 -- s2 -- s3
|    |      |
h1    h2     h3

DataPathID将是:

S1:0x0000000000000001

S2:0x0000000000000002

S3:0x0000000000000003

请注意,在其他测试平台中,此数字可能不同,但它们始终是 16 位十六进制。

我认为p.add_protocol(time.time())行不通。

而是创建一个协议类:

from ryu.lib.packet import packet_base, packet_utils

class timep(packet_base.PacketBase):
_PACK_STR = '!I'
_PACK_LEN = struct.calcsize(_PACK_STR)
_MIN_LEN = _PACK_LEN + struct.calcsize(_CHECKSUM_STR)
_TYPE = {}
def __init__(self, timestamp, payload_len=0):
super().__init__()
self.timestamp = int(timestamp)
self.payload_len = payload_len
def __len__(self):
return timep._PACK_LEN
@classmethod
def parser(cls, buf):
(timestamp, payload_len) = struct.unpack_from(cls._PACK_STR, buf)
payload = buf[ppdp._MIN_LEN : ppdp._MIN_LEN + payload_len]
msg = cls(timestamp, payload_len)
return msg, None, payload
def serialize(self, payload, prev):
length = len(self)
buf = bytearray(length)
self.payload_len = len(payload)

struct.pack_into(ppdp._PACK_STR, buf, 0,
self.timestamp,
self.payload_len
)
return buf

不,你可以做p.add_protocol(timep(time.time()))

最新更新