openflow的初步认识及RYU控制器实践

拓扑图如下:


无控制器下的openflow流表下发演示

创建一个交换机,3台主机,无控制器,流表手工下发:

# mn --topo single,3 --controller=none --mac

mininet>sh ovs-ofctl add-flow s1 "table=0,dl_dst=00:00:00:00:00:01,dl_type=0x0800,actions=output:1"

mininet>sh ovs-ofctl add-flow s1 "table=0,dl_dst=00:00:00:00:00:02,dl_type=0x0800,actions=output:2"

mininet>sh ovs-ofctl add-flow s1 "table=0,dl_dst=00:00:00:00:00:03,dl_type=0x0800,actions=output:3"

mininet>sh ovs-ofctl add-flow s1 "table=0,priority=100,dl_type=0x0806,actions=flood"

有控制器下的演示:

用RYU作控制器:

[root@localhost~]# ryu-manager simple_controller.py

[root@localhost~]# mn --topo single,3  --mac  --controller=remote,ip=127.0.0.1,port=6633

mininet> h1 ping h2 -c2

PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.

64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.049 ms

64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=0.061 ms

--- 10.0.0.2 ping statistics ---

2 packets transmitted, 2 received, 0% packet loss, time 1004ms

rtt min/avg/max/mdev = 0.049/0.055/0.061/0.006 ms

mininet>

mininet> sh ovs-ofctl dump-flows  s1

NXST_FLOW reply (xid=0x4):

cookie=0x0, duration=2067.822s, table=0, n_packets=142, n_bytes=5964, idle_age=5, priority=100,arp actions=FLOOD

cookie=0x0, duration=2066.811s, table=0, n_packets=1934, n_bytes=189532, idle_age=0, priority=10,ip,dl_dst=00:00:00:00:00:02 actions=output:2

cookie=0x0, duration=2065.819s, table=0, n_packets=1949, n_bytes=191002, idle_age=0, priority=10,ip,dl_dst=00:00:00:00:00:01 actions=output:1

cookie=0x0, duration=185.310s, table=0, n_packets=17, n_bytes=1666, idle_age=168, priority=10,ip,dl_dst=00:00:00:00:00:03 actions=output:3

cookie=0x0, duration=194.586s, table=0, n_packets=10, n_bytes=756, idle_age=185, priority=0 actions=CONTROLLER:65535

控制器代码如下:

[root@localhost~]# cat simple_controller.py

from ryu.base import app_manager

from ryu.controller import ofp_event

from ryu.controller.handler import CONFIG_DISPATCHER, MAIN_DISPATCHER

from ryu.controller.handler import set_ev_cls

from ryu.ofproto import ofproto_v1_3

from ryu.ofproto import ofproto_v1_3_parser

from ryu.lib.packet import packet

from ryu.lib.packet import ethernet,arp,ipv4

from ryu.lib.packet import ether_types

from ryu.lib.packet import ipv4

from ryu.topology import switches

from ryu.topology.event import EventSwitchEnter, EventSwitchLeave

mac2port = { "00:00:00:00:00:01":1,

"00:00:00:00:00:02":2,

"00:00:00:00:00:03":3,

}

class SimpleSwitch13(app_manager.RyuApp):

OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION]

def __init__(self, *args, **kwargs):

super(SimpleSwitch13, self).__init__(*args, **kwargs)

self.mac_to_port = {}

@set_ev_cls(ofp_event.EventOFPSwitchFeatures, CONFIG_DISPATCHER)

def switch_features_handler(self, ev):

datapath = ev.msg.datapath

ofproto = datapath.ofproto

parser = datapath.ofproto_parser

table_id = 0

match = parser.OFPMatch()

actions = [parser.OFPActionOutput(ofproto.OFPP_CONTROLLER,

ofproto.OFPCML_NO_BUFFER)]

self.add_flow(datapath, table_id, 0, match, actions)

def add_flow(self, datapath, table_id ,priority, match, actions, buffer_id=None):

ofproto = datapath.ofproto

parser = datapath.ofproto_parser

inst = [parser.OFPInstructionActions(ofproto.OFPIT_APPLY_ACTIONS, actions)]

if buffer_id:

mod = parser.OFPFlowMod(datapath=datapath, table_id = table_id, command=ofproto.OFPFC_ADD, buffer_id=buffer_id,

priority=priority, match=match, instructions=inst)

else:

mod = parser.OFPFlowMod(datapath=datapath, table_id = table_id, command=ofproto.OFPFC_ADD, priority=priority,

match=match, instructions=inst)

datapath.send_msg(mod)

def init_flow(self, datapath, table_id, priority, match, inst):

"""Create OFP flow mod message."""

ofproto = datapath.ofproto

out  = datapath.ofproto_parser.OFPFlowMod(datapath=datapath,

table_id=table_id,

command=ofproto.OFPFC_ADD,

priority=priority,

match=match,

instructions=inst)

datapath.send_msg(out)

@set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)

def _packet_in_handler(self, ev):

# If you hit this you might want to increase

# the "miss_send_length" of your switch

if ev.msg.msg_len < ev.msg.total_len:

self.logger.debug("packet truncated: only %s of %s bytes",

ev.msg.msg_len, ev.msg.total_len)

msg = ev.msg

datapath = msg.datapath

ofproto = datapath.ofproto

parser = datapath.ofproto_parser

in_port = msg.match['in_port']

pkt = packet.Packet(msg.data)

eth = pkt.get_protocols(ethernet.ethernet)[0]

dst_mac = eth.dst

src_mac = eth.src

dpid = datapath.id

print eth.ethertype

self.logger.info("packet in %s %s %s %s", dpid, src_mac, dst_mac, in_port)

if eth.ethertype == ether_types.ETH_TYPE_ARP:

dst_ip = pkt.get_protocol(arp.arp).dst_ip

src_ip = pkt.get_protocol(arp.arp).src_ip

out_port = ofproto.OFPP_FLOOD

table_id =  0

match = parser.OFPMatch(eth_type=0x0806)

actions =[parser.OFPActionOutput(out_port)]

inst = [parser.OFPInstructionActions(ofproto.OFPIT_APPLY_ACTIONS,actions)]

self.init_flow(datapath, table_id, 100, match, inst)

if eth.ethertype == ether_types.ETH_TYPE_IP:

out_port = mac2port[dst_mac]

table_id = 0

match = parser.OFPMatch(eth_type=0x0800,eth_dst = dst_mac)

actions =[parser.OFPActionOutput(out_port)]

inst = [parser.OFPInstructionActions(ofproto.OFPIT_APPLY_ACTIONS,actions)]

self.init_flow(datapath, table_id, 10, match, inst)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容