日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

SDN实验---Ryu的应用开发(一)Hub实现

發(fā)布時間:2023/12/19 综合教程 53 生活家
生活随笔 收集整理的這篇文章主要介紹了 SDN实验---Ryu的应用开发(一)Hub实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

補充:

(一)Ubuntu下安裝Notepadqq

背景:為什么安裝Notepadqq

Notepad++ 不僅有語法高亮度顯示,也有語法折疊功能,并且支持宏以及擴充基本功能的外掛模組。
但是可惜的是Notepad++只能在Windows平臺下使用。 工作中必須使用Windows時,Notepad++是眾多程序員最喜愛的文本編輯器,
在Ubuntu下是否能夠使用到相同的軟件呢?
Notepadqq就是這樣一款與Notepad++非常接近的編輯器,擁有幾乎相同的功能。

安裝:

sudo add-apt-repository ppa:notepadqq-team/notepadqq
sudo apt-get update
sudo apt-get install notepadqq

安裝(2):

snap install --classic notepadqq

補充:什么是snap軟件包?

卸載:

sudo apt-get remove notepadqq
sudo add-apt-repository --remove ppa:notepadqq-team/notepadqq

(二)Ubuntu下安裝sublime

優(yōu)點:

一流的Git集成
增量差異功能可跟蹤正在編輯的文件的更改。
移動到GTK3,以及針對Linux的各種高DPI修復。
新的主題功能和塊插入支持。
支持Unicode 11.0
對代碼塊(block caret)的支持
語法高亮增加對 Clojure, D, Go, Lua 語言的支持

安裝:

1.由于最近下載速度太慢:http://pan.baidu.com/s/1kURLcZt 密碼: acm6

2.進行安裝:sudo dpkg -i sublime-text_build-3126_amd64.deb

3.安裝package control以及Anaconda插件https://www.jianshu.com/p/36df65bc78f9

卸載編輯器

sudo apt remove --autoremove sublime-text

零:如何編程

一:Hub/集線器(編程思路)《重點》

(一)明確問題

如何實現(xiàn)軟件定義的集線器?

(二)設計解決方案

通過控制器來實現(xiàn)集線器算法(泛洪),然后知道數(shù)據(jù)平面實現(xiàn)集線器操作

(三)確定具體的技術(shù)方案

控制器選用Ryu,數(shù)據(jù)平面通過Mininet模擬

(四)部署實施

在控制器上編程開發(fā)集線器應用,創(chuàng)建實驗網(wǎng)絡為驗證方案做準備

(五)驗證方案

運行程序,調(diào)試程序,驗證程序

(六)優(yōu)化

驗證成功后,優(yōu)化程序

二:集線器原理---設計解決方案

一個數(shù)據(jù)包從port1進入,會被復制,泛洪轉(zhuǎn)發(fā)到其他所有端口發(fā)出

三:部署實施---Ryu控制器API學習和使用(Hub集線器開發(fā))

(一)代碼實現(xiàn)

from ryu.base import app_manager
from ryu.ofproto import ofproto_v1_3
from ryu.controller import ofp_event
from ryu.controller.handler import MAIN_DISPATCHER,CONFIG_DISPATCHER
from ryu.controller.handler import set_ev_cls


class Hub(app_manager.RyuApp):
    OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION]

    def __init__(self,*args,**kwargs):
        super(Hub,self).__init__(*args,**kwargs)

    
    @set_ev_cls(ofp_event.EventOFPSwitchFeatures,CONFIG_DISPATCHER)
    def switch_features_handler(self,ev):
        datapath = ev.msg.datapath
        ofproto = datapath.ofproto
        ofp_parser = datapath.ofproto_parser

        match = ofp_parser.OFPMatch()
        actions = [ofp_parser.OFPActionOutput(ofproto.OFPP_CONTROLLER,ofproto.OFPCML_NO_BUFFER)]

        self.add_flow(datapath,0,match,actions,"default flow entry")

    def add_flow(self,datapath,priority,match,actions,remind_content):
        ofproto = datapath.ofproto
        ofp_parser = datapath.ofproto_parser

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

        mod = ofp_parser.OFPFlowMod(datapath=datapath,priority=priority,
                                    match=match,instructions=inst);
        print("install to datapath,"+remind_content)
        datapath.send_msg(mod);


    @set_ev_cls(ofp_event.EventOFPPacketIn,MAIN_DISPATCHER)
    def packet_in_handler(self,ev):
        msg = ev.msg
        datapath = msg.datapath
        ofproto = datapath.ofproto
        ofp_parser = datapath.ofproto_parser

        in_port = msg.match['in_port']

        print("get packet in, install flow entry,and lookback parket to datapath")
        
        match = ofp_parser.OFPMatch();
        actions = [ofp_parser.OFPActionOutput(ofproto.OFPP_FLOOD)]

        self.add_flow(datapath,1,match,actions,"hub flow entry")

        out = ofp_parser.OFPPacketOut(datapath=datapath,buffer_id=msg.buffer_id,
                                            in_port=in_port,actions=actions)    

        datapath.send_msg(out);
注意:注釋可能為你帶來不少錯誤...盡可能寫兩個版本,一個不帶注釋,用于調(diào)試。一個寫注釋,用于學習,回顧

(二)啟動控制器

ryu-manager hub.py --verbose  #進入目錄,在hub.py文件目錄下  --verbose顯示調(diào)試信息

(二)啟動Mininet進行連接測試

sudo mn --topo=linear,4 --controller=remote

Ryu控制器端響應:(注意:啟動mininet后,再先關(guān)閉Ryu,重新進入,測試效果更好)

openvswitch交換機與Ryu控制器連接,控制器下發(fā)默認流表,提示信息install to datapath,default flow entry

(三)使用pingall命令,使得主機向交換機發(fā)送數(shù)據(jù)包---從而實現(xiàn)交換機上傳數(shù)據(jù)包到控制器,實現(xiàn)流表獲取

獲取提示信息get packet in, install flow entry,and lookback parket to datapath

四: Hub代碼講解(注釋版)

from ryu.base import app_manager
from ryu.ofproto import ofproto_v1_3
from ryu.controller import ofp_event
from ryu.controller.handler import MAIN_DISPATCHER,CONFIG_DISPATCHER
from ryu.controller.handler import set_ev_cls


class Hub(app_manager.RyuApp):
    '''明確控制器所用OpenFlow版本'''
    OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION]

    def __init__(self,*args,**kwargs):
        super(Hub,self).__init__(*args,**kwargs)

    
    @set_ev_cls(ofp_event.EventOFPSwitchFeatures,CONFIG_DISPATCHER)
    def switch_features_handler(self,ev):
        '''
        在Ryu控制器上,我們需要寫一個函數(shù)去處理openvswitch的連接
        CONFIG_DISPATCHER : Version negotiated and sent features-request message
        '''
        #對事件進行解析
        datapath = ev.msg.datapath    #從連接中獲取數(shù)據(jù)平面的datapath數(shù)據(jù)結(jié)構(gòu)
        ofproto = datapath.ofproto    #獲取OpenFlow協(xié)議信息
        ofp_parser = datapath.ofproto_parser    #獲取協(xié)議解析
        #解析完成

   '''在連接建立成功以后,需要控制器下發(fā)一個默認流表
           來指揮所有匹配不到交換機的數(shù)據(jù),把他上傳到控制器上
        '''

        #install the table-miss flow entry

        match = ofp_parser.OFPMatch()        #匹配域
        
        #OFPActionOutput將數(shù)據(jù)包發(fā)送出去,
        #第一個參數(shù)OFPP_CONTROLLER是接收端口,
        #第二個是數(shù)據(jù)包在交換機上緩存buffer_id,由于我們將數(shù)據(jù)包全部傳送到控制器,所以不在交換機上緩存
        actions = [ofp_parser.OFPActionOutput(ofproto.OFPP_CONTROLLER,ofproto.OFPCML_NO_BUFFER)]

        self.add_flow(datapath,0,match,actions,"default flow entry")    #默認缺省流表項,設置優(yōu)先級最低即可
'''
    數(shù)據(jù)平面    是由若干網(wǎng)元(Network Element)組成,每個網(wǎng)元包含一個或多個SDN數(shù)據(jù)路徑(SDN Datapath)。
    SDN Datapath是邏輯上的網(wǎng)絡設備,負責轉(zhuǎn)發(fā)和處理數(shù)據(jù)無控制能力,
    一個SDN DataPath包含控制數(shù)據(jù)平面接口(Control Data Plane Interface,CDPI)、代理、轉(zhuǎn)發(fā)引擎(Forwarding Engine)表和處理功能(Processing Function) 
    SDN數(shù)據(jù)面(轉(zhuǎn)發(fā)面)的關(guān)鍵技術(shù):對數(shù)據(jù)面進行抽象建模。
    '''
    def add_flow(self,datapath,priority,match,actions,remind_content):
        '''構(gòu)建流表項 : add a flow entry, install it into datapath
        datapath:表示給哪一個邏輯設備下發(fā)流表
        priority:表示優(yōu)先級
        match,actions:匹配域和動作
        '''

        #datapath屬性        
        ofproto = datapath.ofproto
        ofp_parser = datapath.ofproto_parser

        #在OpenFlow1.3版本中定義了instruct指令集(交換機內(nèi)部的一些操作)
        #construct a flow msg and send it
        inst = [ofp_parser.OFPInstructionActions(ofproto.OFPIT_APPLY_ACTIONS,
                                             actions)]

        mod = ofp_parser.OFPFlowMod(datapath=datapath,priority=priority,
                                    match=match,instructions=inst);
        print("install to datapath,"+remind_content)
        #發(fā)送出去
        datapath.send_msg(mod);

        
'''接收數(shù)據(jù)
        Ryu控制器通過裝飾器去注冊監(jiān)聽某些事件,去處理這些事件。
        從而實現(xiàn)從數(shù)據(jù)平面的消息上傳到控制器,再從控制器平面到應用平面,應用程序去處理事件,再逐跳返回到openvswitch
    '''

    '''要處理這個事件,需要先去注冊監(jiān)聽他
    EventOFPPacketIn: 是我們要監(jiān)聽的事件
    MAIN_DISPATCHER : 是什么狀態(tài)下,去監(jiān)聽該事件---Switch-features message received and sent set-config message
    '''
    @set_ev_cls(ofp_event.EventOFPPacketIn,MAIN_DISPATCHER)
    def packet_in_handler(self,ev):
        '''Hub集線器類,所實現(xiàn)的功能:
        1.接收從OpenVSwitch發(fā)送過來的數(shù)據(jù)包
        2.將數(shù)據(jù)包泛洪到Hub中的其他端口中
        '''    

        #解析數(shù)據(jù)結(jié)構(gòu)
        msg = ev.msg
        datapath = msg.datapath
        ofproto = datapath.ofproto
        ofp_parser = datapath.ofproto_parser

        in_port = msg.match['in_port']        #獲取源端口

        print("get packet in, install flow entry,and lookback parket to datapath")
        
        match = ofp_parser.OFPMatch();        #因為我們是將所有轉(zhuǎn)發(fā),所以不用管匹配,填空表示全部匹配
        actions = [ofp_parser.OFPActionOutput(ofproto.OFPP_FLOOD)]  #注意:FLOOD是OpenFlow協(xié)議保留端口---泛洪使用

        #調(diào)用add_flow,將流表項發(fā)送    ,指導后續(xù)數(shù)據(jù)包轉(zhuǎn)發(fā)    install flwo entry to avoid packet in next time
        self.add_flow(datapath,1,match,actions,"hub flow entry")    #等級稍微比默認流表項高級

        #注意:我們將流表項下發(fā)了,但是數(shù)據(jù)包我們這次接收的,并沒有處理
        #就是再將控制器上的數(shù)據(jù)包,重新發(fā)送給datapath,讓他按照流表項處理
        #buffer_id是這個數(shù)據(jù)包,存放在控制器中的緩沖區(qū)位置,是在事件中的buffer_id獲取
        out = ofp_parser.OFPPacketOut(datapath=datapath,buffer_id=msg.buffer_id,
                                            in_port=in_port,actions=actions,data=msg.data)    

        datapath.send_msg(out);

通信流程:《重點》

1.當開始一個Hub集線器時,會先與控制器進行連接,我們需要在Ryu中設置函數(shù)去處理連接,設置并下發(fā)默認流表---------函數(shù)switch_features_handler實現(xiàn)

2.當主機之間通信時,主機上傳信息到OpenVSwitch交換機,而交換機無法匹配到流表項時,我們設置將數(shù)據(jù)全部上傳給Ryu控制器,我們在控制器端實現(xiàn)Hub集線器的泛洪功能,即設置流表項(match-actions為所有匹配數(shù)據(jù)包的動作為ofproto.OFPP_FLOOD,并且將該流變下發(fā)給原來datapath,同時我們要將之前交換機發(fā)送過來的數(shù)據(jù)包重新發(fā)送給交換機(讓其按照新的流表項進行處理)--------函數(shù)packet_in_handler實現(xiàn)

3.我們將公共函數(shù)add_flow,構(gòu)建流表項并且下發(fā)流表提出

五:實現(xiàn)整體程序運行了解《重點》

(一)程序入口在哪?------app_manager.RyuApp

    """
    The base class for Ryu applications.

    RyuApp subclasses are instantiated after ryu-manager loaded
    all requested Ryu application modules.
    __init__ should call RyuApp.__init__ with the same arguments.
    It's illegal to send any events in __init__.

    The instance attribute 'name' is the name of the class used for
    message routing among Ryu applications.  (Cf. send_event)
    It's set to __class__.__name__ by RyuApp.__init__.
    It's discouraged for subclasses to override this.
    """

1.app_manager.RyuApp是所有Ryu Applications的基類,我們要實現(xiàn)一個控制器應用,必須繼承該基類

2.我們自定義的子類(繼承于RyuAPP的子類),將在ryu-manager命令加載中被實例化(它是在ryu管理器加載所有請求的ryu應用程序模塊后實例化的)

即我們執(zhí)行ryu-manager hub.py --verbose命令開啟Ryu控制器時,并且處理了所有請求的ryu應用程序模塊,之后Hub子類就被實例化了

3.子類中的__init__方法需要調(diào)用父類的__init__方法,并且保持參數(shù)一致

    def __init__(self,*args,**kwargs):
        super(Hub,self).__init__(*args,**kwargs)

(二)設置OpenFlow協(xié)議---OFP_VERSIONS

    OFP_VERSIONS = None
    """
    A list of supported OpenFlow versions for this RyuApp.
    The default is all versions supported by the framework.

    Examples::

        OFP_VERSIONS = [ofproto_v1_0.OFP_VERSION,
                        ofproto_v1_2.OFP_VERSION]

    If multiple Ryu applications are loaded in the system,
    the intersection of their OFP_VERSIONS is used.
    """

我們設置的協(xié)議類型是1.3版本OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION],其中協(xié)議在 from ryu.ofproto import ofproto_v1_3 中

(三)事件監(jiān)聽----裝飾器實現(xiàn)set_ev_cls

1.from ryu.controller.handler import set_ev_cls

# should be named something like 'observe_event'
def set_ev_cls(ev_cls, dispatchers=None):
    """
    A decorator for Ryu application to declare an event handler.

    Decorated method will become an event handler.
    ev_cls is an event class whose instances this RyuApp wants to receive.
    dispatchers argument specifies one of the following negotiation phases
    (or a list of them) for which events should be generated for this handler.
    Note that, in case an event changes the phase, the phase before the change
    is used to check the interest.

    .. tabularcolumns:: |l|L|

    =========================================== ===============================
    Negotiation phase                           Description
    =========================================== ===============================
    ryu.controller.handler.HANDSHAKE_DISPATCHER Sending and waiting for hello
                                                message
    ryu.controller.handler.CONFIG_DISPATCHER    Version negotiated and sent
                                                features-request message
    ryu.controller.handler.MAIN_DISPATCHER      Switch-features message
                                                received and sent set-config
                                                message
    ryu.controller.handler.DEAD_DISPATCHER      Disconnect from the peer.  Or
                                                disconnecting due to some
                                                unrecoverable errors.
    =========================================== ===============================
    """
    def _set_ev_cls_dec(handler):
        if 'callers' not in dir(handler):
            handler.callers = {}
        for e in _listify(ev_cls):
            handler.callers[e] = _Caller(_listify(dispatchers), e.__module__)
        return handler
    return _set_ev_cls_dec

2.被set_ev_cls裝飾的函數(shù)將成為一個事件處理器,參數(shù)ev_cls是一個事件類,在controller下的ofp_event下(未找到....動態(tài)創(chuàng)建類type實現(xiàn)??),dispatchers參數(shù)是事件的協(xié)商階段

@set_ev_cls(ofp_event.EventOFPSwitchFeatures,CONFIG_DISPATCHER)  

(1)協(xié)商階段

    =========================================== ===============================
    Negotiation phase                           Description
    =========================================== ===============================
    ryu.controller.handler.HANDSHAKE_DISPATCHER Sending and waiting for hello  
                                                message
    ryu.controller.handler.CONFIG_DISPATCHER    Version negotiated and sent
                                                features-request message
    ryu.controller.handler.MAIN_DISPATCHER      Switch-features message
                                                received and sent set-config
                                                message
    ryu.controller.handler.DEAD_DISPATCHER      Disconnect from the peer.  Or
                                                disconnecting due to some
                                                unrecoverable errors.
    =========================================== ===============================

發(fā)送并等待Hello消息

雙方通過握手消息Hello建立安全連接

版本協(xié)商并發(fā)送功能請求消息

雙方建立TLS隧道后,方法發(fā)送hello消息進行版本協(xié)商
如果協(xié)議版本協(xié)商成功,則連接建立。否則發(fā)送Error消息描述協(xié)商失敗原因,并終止連接

交換機特征消息接收和發(fā)送設置配置消息

協(xié)商完成后,控制器和交換機之間發(fā)送Features消息,獲取交換機參數(shù)
參數(shù)包括支持的buffer數(shù)目、流表數(shù)、Actions等
控制器發(fā)送SET_CONFIG消息向交換機發(fā)送配置參數(shù)
通過GET_CONFIG消息得到交換機修改后的配置信息
控制器與OpenFlow交換機之間,發(fā)送PACKET_OUT和PACKET_IN消息。通過PACKET_OUT中內(nèi)置的LLDP包進行網(wǎng)絡拓撲的探測
控制器通過FLOW_MOD向控制器下發(fā)流表操作

斷開與對等方的連接。或者由于一些不可恢復的錯誤而斷開連接

3.裝飾器實現(xiàn)代碼

def set_ev_cls(ev_cls, dispatchers=None):
    def _set_ev_cls_dec(handler):
        if 'callers' not in dir(handler):
            handler.callers = {}
        for e in _listify(ev_cls):
            handler.callers[e] = _Caller(_listify(dispatchers), e.__module__)
        return handler
    return _set_ev_cls_dec
外部函數(shù)是用來接收事件處理函數(shù)和函數(shù)參數(shù)

內(nèi)聯(lián)函數(shù)是用來
@set_ev_cls(ofp_event.EventOFPSwitchFeatures,CONFIG_DISPATCHER)
def switch_features_handler(self,ev):

(四)協(xié)議解析

1.def switch_features_handler(self,ev):自定義函數(shù)參數(shù)中ev

get ev info:
<ryu.controller.ofp_event.EventOFPSwitchFeatures object at 0x7f659220f668>  就是我們監(jiān)聽的事件類實例
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__',
'msg', 'timestamp']

2.查看事件中的msg類信息

EVENT ofp_event->Hub EventOFPPacketIn
version=0x4,
msg_type=0xa,
msg_len=0x80,
xid=0x0,
OFPPacketIn(
  buffer_id=4294967295,
  cookie=0,
  data=b'33xffx9axd7xb1x1ajxffx9axd7xb1x86xdd`x00x00x00x00 :xffx00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00xffx02x00x00x00x00x00x00x00x00x00x01xffx9axd7xb1x87x00~fx00x00x00x00xfex80x00x00x00x00x00x00x18jxffxffxfex9axd7xb1x0ex01x1cxddVxffxb4xd8',
  match=OFPMatch(oxm_fields={'in_port': 2}),
  reason=0,
  table_id=0,
  total_len=86)
['_TYPE', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_base_attributes', '_class_prefixes', '_class_suffixes', '_decode_value', '_encode_value', '_get_decoder', '_get_default_decoder', '_get_default_encoder', '_get_encoder', '_get_type', '_is_class', '_opt_attributes', '_reserved', '_restore_args', '_serialize_body', '_serialize_header', '_serialize_pre', 

'auxiliary_id', 'buf', 'capabilities', 'cls_from_jsondict_key', 'cls_msg_type', 'datapath', 'datapath_id', 'from_jsondict', 'msg_len', 'msg_type', 'n_buffers', 'n_tables', 'obj_from_jsondict', 'parser', 'serialize', 'set_buf', 'set_classes', 'set_headers', 'set_xid', 'stringify_attrs', 'to_jsondict', 'version', 'xid']
msg所提供的方法和屬性

'auxiliary_id', 'buf', 'capabilities', 'cls_from_jsondict_key', 'cls_msg_type', 

'datapath', 'datapath_id',

'from_jsondict', 'msg_len', 'msg_type', 'n_buffers', 'n_tables',

'obj_from_jsondict', 'parser', 'serialize',

'set_buf', 'set_classes', 'set_headers', 'set_xid',

'stringify_attrs', 'to_jsondict', 'version', 'xid']

3.獲取邏輯設備datapath類信息

<ryu.controller.controller.Datapath object at 0x7fe1560c6048>
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_close_write', '_echo_request_loop', '_ports', '_recv_loop', '_send_loop', '_send_q_sem', 

'acknowledge_echo_reply', 'address', 'close', 'echo_request_interval', 'flow_format',

'id', 'is_active', 'is_reserved_port', 'max_unreplied_echo_requests', 'ofp_brick', 'ofproto', 'ofproto_parser',

'ports', 'send',

'send_barrier', 'send_delete_all_flows', 'send_flow_del', 'send_flow_mod', 'send_msg', 'send_nxt_set_flow_format', 'send_packet_out', 'send_q',

'serve', 'set_state', 'set_version', 'set_xid', 'socket', 'state', 'supported_ofp_version', 'unreplied_echo_requests', 'xid']

4.獲取邏輯設備datapath中OpenFlow協(xié)議信息

<module 'ryu.ofproto.ofproto_v1_3' from '/usr/local/lib/python3.6/dist-packages/ryu/ofproto/ofproto_v1_3.py'>

['DESC_STR_LEN', 'DESC_STR_LEN_STR', 'MAX_XID', 'OFPAT_COPY_TTL_IN', 'OFPAT_COPY_TTL_OUT', 'OFPAT_DEC_MPLS_TTL', 'OFPAT_DEC_NW_TTL', 'OFPAT_EXPERIMENTER', 'OFPAT_GROUP', 'OFPAT_OUTPUT', 'OFPAT_POP_MPLS', 'OFPAT_POP_PBB', 'OFPAT_POP_VLAN', 'OFPAT_PUSH_MPLS', 'OFPAT_PUSH_PBB', 'OFPAT_PUSH_VLAN', 'OFPAT_SET_FIELD', 'OFPAT_SET_MPLS_TTL', 'OFPAT_SET_NW_TTL', 'OFPAT_SET_QUEUE', 'OFPBAC_BAD_ARGUMENT', 'OFPBAC_BAD_EXPERIMENTER', 'OFPBAC_BAD_EXP_TYPE', 'OFPBAC_BAD_LEN', 'OFPBAC_BAD_OUT_GROUP', 'OFPBAC_BAD_OUT_PORT', 'OFPBAC_BAD_QUEUE', 'OFPBAC_BAD_SET_ARGUMENT', 'OFPBAC_BAD_SET_LEN', 'OFPBAC_BAD_SET_TYPE', 'OFPBAC_BAD_TAG', 'OFPBAC_BAD_TYPE', 'OFPBAC_EPERM', 'OFPBAC_MATCH_INCONSISTENT', 'OFPBAC_TOO_MANY', 'OFPBAC_UNSUPPORTED_ORDER', 'OFPBIC_BAD_EXPERIMENTER', 'OFPBIC_BAD_EXP_TYPE', 'OFPBIC_BAD_LEN', 'OFPBIC_BAD_TABLE_ID', 'OFPBIC_EPERM', 'OFPBIC_UNKNOWN_INST', 'OFPBIC_UNSUP_INST', 'OFPBIC_UNSUP_METADATA', 'OFPBIC_UNSUP_METADATA_MASK', 'OFPBMC_BAD_DL_ADDR_MASK', 'OFPBMC_BAD_FIELD', 'OFPBMC_BAD_LEN', 'OFPBMC_BAD_MASK', 'OFPBMC_BAD_NW_ADDR_MASK', 'OFPBMC_BAD_PREREQ', 'OFPBMC_BAD_TAG', 'OFPBMC_BAD_TYPE', 'OFPBMC_BAD_VALUE', 'OFPBMC_BAD_WILDCARDS', 'OFPBMC_DUP_FIELD', 'OFPBMC_EPERM', 'OFPBRC_BAD_EXPERIMENTER', 'OFPBRC_BAD_EXP_TYPE', 'OFPBRC_BAD_LEN', 'OFPBRC_BAD_MULTIPART', 'OFPBRC_BAD_PACKET', 'OFPBRC_BAD_PORT', 'OFPBRC_BAD_TABLE_ID', 'OFPBRC_BAD_TYPE', 'OFPBRC_BAD_VERSION', 'OFPBRC_BUFFER_EMPTY', 'OFPBRC_BUFFER_UNKNOWN', 'OFPBRC_EPERM', 'OFPBRC_IS_SLAVE', 'OFPBRC_MULTIPART_BUFFER_OVERFLOW', 'OFPCML_MAX', 'OFPCML_NO_BUFFER', 'OFPCR_ROLE_EQUAL', 'OFPCR_ROLE_MASTER', 'OFPCR_ROLE_NOCHANGE', 'OFPCR_ROLE_SLAVE', 'OFPC_FLOW_STATS', 'OFPC_FRAG_DROP', 'OFPC_FRAG_MASK', 'OFPC_FRAG_NORMAL', 'OFPC_FRAG_REASM', 'OFPC_GROUP_STATS', 'OFPC_IP_REASM', 'OFPC_PORT_BLOCKED', 'OFPC_PORT_STATS', 'OFPC_QUEUE_STATS', 'OFPC_TABLE_STATS', 'OFPET_BAD_ACTION', 'OFPET_BAD_INSTRUCTION', 'OFPET_BAD_MATCH', 'OFPET_BAD_REQUEST', 'OFPET_EXPERIMENTER', 'OFPET_FLOW_MOD_FAILED', 'OFPET_GROUP_MOD_FAILED', 'OFPET_HELLO_FAILED', 'OFPET_METER_MOD_FAILED', 'OFPET_PORT_MOD_FAILED', 'OFPET_QUEUE_OP_FAILED', 'OFPET_ROLE_REQUEST_FAILED', 'OFPET_SWITCH_CONFIG_FAILED', 'OFPET_TABLE_FEATURES_FAILED', 'OFPET_TABLE_MOD_FAILED', 'OFPFC_ADD', 'OFPFC_DELETE', 'OFPFC_DELETE_STRICT', 'OFPFC_MODIFY', 'OFPFC_MODIFY_STRICT', 'OFPFF_CHECK_OVERLAP', 'OFPFF_NO_BYT_COUNTS', 'OFPFF_NO_PKT_COUNTS', 'OFPFF_RESET_COUNTS', 'OFPFF_SEND_FLOW_REM', 'OFPFMFC_BAD_COMMAND', 'OFPFMFC_BAD_FLAGS', 'OFPFMFC_BAD_TABLE_ID', 'OFPFMFC_BAD_TIMEOUT', 'OFPFMFC_EPERM', 'OFPFMFC_OVERLAP', 'OFPFMFC_TABLE_FULL', 'OFPFMFC_UNKNOWN', 'OFPGC_ADD', 'OFPGC_DELETE', 'OFPGC_MODIFY', 'OFPGFC_CHAINING', 'OFPGFC_CHAINING_CHECKS', 'OFPGFC_SELECT_LIVENESS', 'OFPGFC_SELECT_WEIGHT', 'OFPGMFC_BAD_BUCKET', 'OFPGMFC_BAD_COMMAND', 'OFPGMFC_BAD_TYPE', 'OFPGMFC_BAD_WATCH', 'OFPGMFC_CHAINED_GROUP', 'OFPGMFC_CHAINING_UNSUPPORTED', 'OFPGMFC_EPERM', 'OFPGMFC_GROUP_EXISTS', 'OFPGMFC_INVALID_GROUP', 'OFPGMFC_LOOP', 'OFPGMFC_OUT_OF_BUCKETS', 'OFPGMFC_OUT_OF_GROUPS', 'OFPGMFC_UNKNOWN_GROUP', 'OFPGMFC_WATCH_UNSUPPORTED', 'OFPGMFC_WEIGHT_UNSUPPORTED', 'OFPGT_ALL', 'OFPGT_FF', 'OFPGT_INDIRECT', 'OFPGT_SELECT', 'OFPG_ALL', 'OFPG_ANY', 'OFPG_MAX', 'OFPHET_VERSIONBITMAP', 'OFPHFC_EPERM', 'OFPHFC_INCOMPATIBLE', 'OFPIEH_AUTH', 'OFPIEH_DEST', 'OFPIEH_ESP', 'OFPIEH_FRAG', 'OFPIEH_HOP', 'OFPIEH_NONEXT', 'OFPIEH_ROUTER', 'OFPIEH_UNREP', 'OFPIEH_UNSEQ', 'OFPIT_APPLY_ACTIONS', 'OFPIT_CLEAR_ACTIONS', 'OFPIT_EXPERIMENTER', 'OFPIT_GOTO_TABLE', 'OFPIT_METER', 'OFPIT_WRITE_ACTIONS', 'OFPIT_WRITE_METADATA', 'OFPMBT_DROP', 'OFPMBT_DSCP_REMARK', 'OFPMBT_EXPERIMENTER', 'OFPMC_ADD', 'OFPMC_DELETE', 'OFPMC_MODIFY', 'OFPMF_BURST', 'OFPMF_KBPS', 'OFPMF_PKTPS', 'OFPMF_STATS', 'OFPMMFC_BAD_BAND', 'OFPMMFC_BAD_BAND_VALUE', 'OFPMMFC_BAD_BURST', 'OFPMMFC_BAD_COMMAND', 'OFPMMFC_BAD_FLAGS', 'OFPMMFC_BAD_RATE', 'OFPMMFC_INVALID_METER', 'OFPMMFC_METER_EXISTS', 'OFPMMFC_OUT_OF_BANDS', 'OFPMMFC_OUT_OF_METERS', 'OFPMMFC_UNKNOWN', 'OFPMMFC_UNKNOWN_METER', 'OFPMPF_REPLY_MORE', 'OFPMPF_REQ_MORE', 'OFPMP_AGGREGATE', 'OFPMP_DESC', 'OFPMP_EXPERIMENTER', 'OFPMP_FLOW', 'OFPMP_GROUP', 'OFPMP_GROUP_DESC', 'OFPMP_GROUP_FEATURES', 'OFPMP_METER', 'OFPMP_METER_CONFIG', 'OFPMP_METER_FEATURES', 'OFPMP_PORT_DESC', 'OFPMP_PORT_STATS', 'OFPMP_QUEUE', 'OFPMP_TABLE', 'OFPMP_TABLE_FEATURES', 'OFPMT_OXM', 'OFPMT_STANDARD', 'OFPM_ALL', 'OFPM_CONTROLLER', 'OFPM_MAX', 'OFPM_SLOWPATH', 'OFPPC_NO_FWD', 'OFPPC_NO_PACKET_IN', 'OFPPC_NO_RECV', 'OFPPC_PORT_DOWN', 'OFPPF_100GB_FD', 'OFPPF_100MB_FD', 'OFPPF_100MB_HD', 'OFPPF_10GB_FD', 'OFPPF_10MB_FD', 'OFPPF_10MB_HD', 'OFPPF_1GB_FD', 'OFPPF_1GB_HD', 'OFPPF_1TB_FD', 'OFPPF_40GB_FD', 'OFPPF_AUTONEG', 'OFPPF_COPPER', 'OFPPF_FIBER', 'OFPPF_OTHER', 'OFPPF_PAUSE', 'OFPPF_PAUSE_ASYM', 'OFPPMFC_BAD_ADVERTISE', 'OFPPMFC_BAD_CONFIG', 'OFPPMFC_BAD_HW_ADDR', 'OFPPMFC_BAD_PORT', 'OFPPMFC_EPERM', 'OFPPR_ADD', 'OFPPR_DELETE', 'OFPPR_MODIFY', 'OFPPS_BLOCKED', 'OFPPS_LINK_DOWN', 'OFPPS_LIVE', 'OFPP_ALL', 'OFPP_ANY', 'OFPP_CONTROLLER', 'OFPP_FLOOD', 'OFPP_IN_PORT', 'OFPP_LOCAL', 'OFPP_MAX', 'OFPP_NORMAL', 'OFPP_TABLE', 'OFPQCFC_EPERM', 'OFPQOFC_BAD_PORT', 'OFPQOFC_BAD_QUEUE', 'OFPQOFC_EPERM', 'OFPQT_EXPERIMENTER', 'OFPQT_MAX_RATE', 'OFPQT_MIN_RATE', 'OFPQ_ALL', 'OFPRRFC_BAD_ROLE', 'OFPRRFC_STALE', 'OFPRRFC_UNSUP', 'OFPRR_DELETE', 'OFPRR_GROUP_DELETE', 'OFPRR_HARD_TIMEOUT', 'OFPRR_IDLE_TIMEOUT', 'OFPR_ACTION', 'OFPR_INVALID_TTL', 'OFPR_NO_MATCH', 'OFPSCFC_BAD_FLAGS', 'OFPSCFC_BAD_LEN', 'OFPSCFC_EPERM', 'OFPTFFC_BAD_ARGUMENT', 'OFPTFFC_BAD_LEN', 'OFPTFFC_BAD_METADATA', 'OFPTFFC_BAD_TABLE', 'OFPTFFC_BAD_TYPE', 'OFPTFFC_EPERM', 'OFPTFPT_APPLY_ACTIONS', 'OFPTFPT_APPLY_ACTIONS_MISS', 'OFPTFPT_APPLY_SETFIELD', 'OFPTFPT_APPLY_SETFIELD_MISS', 'OFPTFPT_EXPERIMENTER', 'OFPTFPT_EXPERIMENTER_MISS', 'OFPTFPT_INSTRUCTIONS', 'OFPTFPT_INSTRUCTIONS_MISS', 'OFPTFPT_MATCH', 'OFPTFPT_NEXT_TABLES', 'OFPTFPT_NEXT_TABLES_MISS', 'OFPTFPT_WILDCARDS', 'OFPTFPT_WRITE_ACTIONS', 'OFPTFPT_WRITE_ACTIONS_MISS', 'OFPTFPT_WRITE_SETFIELD', 'OFPTFPT_WRITE_SETFIELD_MISS', 'OFPTMFC_BAD_CONFIG', 'OFPTMFC_BAD_TABLE', 'OFPTMFC_EPERM', 'OFPTT_ALL', 'OFPTT_MAX', 'OFPT_BARRIER_REPLY', 'OFPT_BARRIER_REQUEST', 'OFPT_ECHO_REPLY', 'OFPT_ECHO_REQUEST', 'OFPT_ERROR', 'OFPT_EXPERIMENTER', 'OFPT_FEATURES_REPLY', 'OFPT_FEATURES_REQUEST', 'OFPT_FLOW_MOD', 'OFPT_FLOW_REMOVED', 'OFPT_GET_ASYNC_REPLY', 'OFPT_GET_ASYNC_REQUEST', 'OFPT_GET_CONFIG_REPLY', 'OFPT_GET_CONFIG_REQUEST', 'OFPT_GROUP_MOD', 'OFPT_HELLO', 'OFPT_METER_MOD', 'OFPT_MULTIPART_REPLY', 'OFPT_MULTIPART_REQUEST', 'OFPT_PACKET_IN', 'OFPT_PACKET_OUT', 'OFPT_PORT_MOD', 'OFPT_PORT_STATUS', 'OFPT_QUEUE_GET_CONFIG_REPLY', 'OFPT_QUEUE_GET_CONFIG_REQUEST', 'OFPT_ROLE_REPLY', 'OFPT_ROLE_REQUEST', 'OFPT_SET_ASYNC', 'OFPT_SET_CONFIG', 'OFPT_TABLE_MOD', 'OFPVID_NONE', 'OFPVID_PRESENT', 'OFPXMC_EXPERIMENTER', 'OFPXMC_NXM_0', 'OFPXMC_NXM_1', 'OFPXMC_OPENFLOW_BASIC', 'OFPXMT_OFB_ARP_OP', 'OFPXMT_OFB_ARP_SHA', 'OFPXMT_OFB_ARP_SPA', 'OFPXMT_OFB_ARP_THA', 'OFPXMT_OFB_ARP_TPA', 'OFPXMT_OFB_ETH_DST', 'OFPXMT_OFB_ETH_SRC', 'OFPXMT_OFB_ETH_TYPE', 'OFPXMT_OFB_ICMPV4_CODE', 'OFPXMT_OFB_ICMPV4_TYPE', 'OFPXMT_OFB_ICMPV6_CODE', 'OFPXMT_OFB_ICMPV6_TYPE', 'OFPXMT_OFB_IN_PHY_PORT', 'OFPXMT_OFB_IN_PORT', 'OFPXMT_OFB_IPV4_DST', 'OFPXMT_OFB_IPV4_SRC', 'OFPXMT_OFB_IPV6_DST', 'OFPXMT_OFB_IPV6_EXTHDR', 'OFPXMT_OFB_IPV6_FLABEL', 'OFPXMT_OFB_IPV6_ND_SLL', 'OFPXMT_OFB_IPV6_ND_TARGET', 'OFPXMT_OFB_IPV6_ND_TLL', 'OFPXMT_OFB_IPV6_SRC', 'OFPXMT_OFB_IP_DSCP', 'OFPXMT_OFB_IP_ECN', 'OFPXMT_OFB_IP_PROTO', 'OFPXMT_OFB_METADATA', 'OFPXMT_OFB_MPLS_BOS', 'OFPXMT_OFB_MPLS_LABEL', 'OFPXMT_OFB_MPLS_TC', 'OFPXMT_OFB_PBB_ISID', 'OFPXMT_OFB_SCTP_DST', 'OFPXMT_OFB_SCTP_SRC', 'OFPXMT_OFB_TCP_DST', 'OFPXMT_OFB_TCP_SRC', 'OFPXMT_OFB_TUNNEL_ID', 'OFPXMT_OFB_UDP_DST', 'OFPXMT_OFB_UDP_SRC', 'OFPXMT_OFB_VLAN_PCP', 'OFPXMT_OFB_VLAN_VID', 'OFP_ACTION_EXPERIMENTER_HEADER_PACK_STR', 'OFP_ACTION_EXPERIMENTER_HEADER_SIZE', 'OFP_ACTION_GROUP_PACK_STR', 'OFP_ACTION_GROUP_SIZE', 'OFP_ACTION_HEADER_PACK_STR', 'OFP_ACTION_HEADER_SIZE', 'OFP_ACTION_MPLS_TTL_PACK_STR', 'OFP_ACTION_MPLS_TTL_SIZE', 'OFP_ACTION_NW_TTL_PACK_STR', 'OFP_ACTION_NW_TTL_SIZE', 'OFP_ACTION_OUTPUT_PACK_STR', 'OFP_ACTION_OUTPUT_SIZE', 'OFP_ACTION_POP_MPLS_PACK_STR', 'OFP_ACTION_POP_MPLS_SIZE', 'OFP_ACTION_PUSH_PACK_STR', 'OFP_ACTION_PUSH_SIZE', 'OFP_ACTION_SET_FIELD_PACK_STR', 'OFP_ACTION_SET_FIELD_SIZE', 'OFP_ACTION_SET_QUEUE_PACK_STR', 'OFP_ACTION_SET_QUEUE_SIZE', 'OFP_AGGREGATE_STATS_REPLY_PACK_STR', 'OFP_AGGREGATE_STATS_REPLY_SIZE', 'OFP_AGGREGATE_STATS_REQUEST_0_PACK_STR', 'OFP_AGGREGATE_STATS_REQUEST_0_SIZE', 'OFP_AGGREGATE_STATS_REQUEST_PACK_STR', 'OFP_AGGREGATE_STATS_REQUEST_SIZE', 'OFP_ASYNC_CONFIG_PACK_STR', 'OFP_ASYNC_CONFIG_SIZE', 'OFP_BUCKET_COUNTER_PACK_STR', 'OFP_BUCKET_COUNTER_SIZE', 'OFP_BUCKET_PACK_STR', 'OFP_BUCKET_SIZE', 'OFP_DEFAULT_PRIORITY', 'OFP_DESC_PACK_STR', 'OFP_DESC_SIZE', 'OFP_ERROR_EXPERIMENTER_MSG_PACK_STR', 'OFP_ERROR_EXPERIMENTER_MSG_SIZE', 'OFP_ERROR_MSG_PACK_STR', 'OFP_ERROR_MSG_SIZE', 'OFP_ETH_ALEN', 'OFP_ETH_ALEN_STR', 'OFP_EXPERIMENTER_HEADER_PACK_STR', 'OFP_EXPERIMENTER_HEADER_SIZE', 'OFP_EXPERIMENTER_MULTIPART_HEADER_PACK_STR', 'OFP_EXPERIMENTER_MULTIPART_HEADER_SIZE', 'OFP_FLOW_MOD_PACK_STR', 'OFP_FLOW_MOD_PACK_STR0', 'OFP_FLOW_MOD_SIZE', 'OFP_FLOW_REMOVED_PACK_STR', 'OFP_FLOW_REMOVED_PACK_STR0', 'OFP_FLOW_REMOVED_SIZE', 'OFP_FLOW_STATS_0_PACK_STR', 'OFP_FLOW_STATS_0_SIZE', 'OFP_FLOW_STATS_PACK_STR', 'OFP_FLOW_STATS_REQUEST_0_PACK_STR', 'OFP_FLOW_STATS_REQUEST_0_SIZE', 'OFP_FLOW_STATS_REQUEST_PACK_STR', 'OFP_FLOW_STATS_REQUEST_SIZE', 'OFP_FLOW_STATS_SIZE', 'OFP_GROUP_DESC_PACK_STR', 'OFP_GROUP_DESC_SIZE', 'OFP_GROUP_DESC_STATS_PACK_STR', 'OFP_GROUP_DESC_STATS_SIZE', 'OFP_GROUP_FEATURES_PACK_STR', 'OFP_GROUP_FEATURES_SIZE', 'OFP_GROUP_MOD_PACK_STR', 'OFP_GROUP_MOD_SIZE', 'OFP_GROUP_STATS_PACK_STR', 'OFP_GROUP_STATS_REQUEST_PACK_STR', 'OFP_GROUP_STATS_REQUEST_SIZE', 'OFP_GROUP_STATS_SIZE', 'OFP_HEADER_PACK_STR', 'OFP_HEADER_SIZE', 'OFP_HELLO_ELEM_HEADER_PACK_STR', 'OFP_HELLO_ELEM_HEADER_SIZE', 'OFP_HELLO_ELEM_VERSIONBITMAP_HEADER_PACK_STR', 'OFP_HELLO_ELEM_VERSIONBITMAP_HEADER_SIZE', 'OFP_HELLO_HEADER_SIZE', 'OFP_INSTRUCTION_ACTIONS_PACK_STR', 'OFP_INSTRUCTION_ACTIONS_SIZE', 'OFP_INSTRUCTION_GOTO_TABLE_PACK_STR', 'OFP_INSTRUCTION_GOTO_TABLE_SIZE', 'OFP_INSTRUCTION_METER_PACK_STR', 'OFP_INSTRUCTION_METER_SIZE', 'OFP_INSTRUCTION_WRITE_METADATA_PACK_STR', 'OFP_INSTRUCTION_WRITE_METADATA_SIZE', 'OFP_MATCH_PACK_STR', 'OFP_MATCH_SIZE', 'OFP_MAX_PORT_NAME_LEN', 'OFP_MAX_TABLE_NAME_LEN', 'OFP_MAX_TABLE_NAME_LEN_STR', 'OFP_METER_BAND_DROP_PACK_STR', 'OFP_METER_BAND_DROP_SIZE', 'OFP_METER_BAND_DSCP_REMARK_PACK_STR', 'OFP_METER_BAND_DSCP_REMARK_SIZE', 'OFP_METER_BAND_EXPERIMENTER_PACK_STR', 'OFP_METER_BAND_EXPERIMENTER_SIZE', 'OFP_METER_BAND_HEADER_PACK_STR', 'OFP_METER_BAND_HEADER_SIZE', 'OFP_METER_BAND_STATS_PACK_STR', 'OFP_METER_BAND_STATS_SIZE', 'OFP_METER_CONFIG_PACK_STR', 'OFP_METER_CONFIG_SIZE', 'OFP_METER_FEATURES_PACK_STR', 'OFP_METER_FEATURES_SIZE', 'OFP_METER_MOD_PACK_STR', 'OFP_METER_MOD_SIZE', 'OFP_METER_MULTIPART_REQUEST_PACK_STR', 'OFP_METER_MULTIPART_REQUEST_SIZE', 'OFP_METER_STATS_PACK_STR', 'OFP_METER_STATS_SIZE', 'OFP_MULTIPART_REPLY_PACK_STR', 'OFP_MULTIPART_REPLY_SIZE', 'OFP_MULTIPART_REQUEST_PACK_STR', 'OFP_MULTIPART_REQUEST_SIZE', 'OFP_NO_BUFFER', 'OFP_OXM_EXPERIMENTER_HEADER_PACK_STR', 'OFP_OXM_EXPERIMENTER_HEADER_SIZE', 'OFP_PACKET_IN_PACK_STR', 'OFP_PACKET_IN_SIZE', 'OFP_PACKET_OUT_PACK_STR', 'OFP_PACKET_OUT_SIZE', 'OFP_PACKET_QUEUE_PACK_STR', 'OFP_PACKET_QUEUE_SIZE', 'OFP_PORT_MOD_PACK_STR', 'OFP_PORT_MOD_SIZE', 'OFP_PORT_PACK_STR', 'OFP_PORT_SIZE', 'OFP_PORT_STATS_PACK_STR', 'OFP_PORT_STATS_REQUEST_PACK_STR', 'OFP_PORT_STATS_REQUEST_SIZE', 'OFP_PORT_STATS_SIZE', 'OFP_PORT_STATUS_DESC_OFFSET', 'OFP_PORT_STATUS_PACK_STR', 'OFP_PORT_STATUS_SIZE', 'OFP_PROP_EXPERIMENTER_PACK_STR', 'OFP_PROP_EXPERIMENTER_SIZE', 'OFP_QUEUE_GET_CONFIG_REPLY_PACK_STR', 'OFP_QUEUE_GET_CONFIG_REPLY_SIZE', 'OFP_QUEUE_GET_CONFIG_REQUEST_PACK_STR', 'OFP_QUEUE_GET_CONFIG_REQUEST_SIZE', 'OFP_QUEUE_PROP_EXPERIMENTER_PACK_STR', 'OFP_QUEUE_PROP_EXPERIMENTER_SIZE', 'OFP_QUEUE_PROP_HEADER_PACK_STR', 'OFP_QUEUE_PROP_HEADER_SIZE', 'OFP_QUEUE_PROP_MAX_RATE_PACK_STR', 'OFP_QUEUE_PROP_MAX_RATE_SIZE', 'OFP_QUEUE_PROP_MIN_RATE_PACK_STR', 'OFP_QUEUE_PROP_MIN_RATE_SIZE', 'OFP_QUEUE_STATS_PACK_STR', 'OFP_QUEUE_STATS_REQUEST_PACK_STR', 'OFP_QUEUE_STATS_REQUEST_SIZE', 'OFP_QUEUE_STATS_SIZE', 'OFP_ROLE_REQUEST_PACK_STR', 'OFP_ROLE_REQUEST_SIZE', 'OFP_SWITCH_CONFIG_PACK_STR', 'OFP_SWITCH_CONFIG_SIZE', 'OFP_SWITCH_FEATURES_PACK_STR', 'OFP_SWITCH_FEATURES_SIZE', 'OFP_TABLE_FEATURES_PACK_STR', 'OFP_TABLE_FEATURES_SIZE', 'OFP_TABLE_FEATURE_PROP_ACTIONS_PACK_STR', 'OFP_TABLE_FEATURE_PROP_ACTIONS_SIZE', 'OFP_TABLE_FEATURE_PROP_INSTRUCTIONS_PACK_STR', 'OFP_TABLE_FEATURE_PROP_INSTRUCTIONS_SIZE', 'OFP_TABLE_FEATURE_PROP_NEXT_TABLES_PACK_STR', 'OFP_TABLE_FEATURE_PROP_NEXT_TABLES_SIZE', 'OFP_TABLE_FEATURE_PROP_OXM_PACK_STR', 'OFP_TABLE_FEATURE_PROP_OXM_SIZE', 'OFP_TABLE_MOD_PACK_STR', 'OFP_TABLE_MOD_SIZE', 'OFP_TABLE_STATS_PACK_STR', 'OFP_TABLE_STATS_SIZE', 'OFP_TCP_PORT', 'OFP_VERSION', 'ONFERR_DUP_INSTRUCTION', 'ONFERR_ET_ASYNC_EPERM', 'ONFERR_ET_ASYNC_INVALUD', 'ONFERR_ET_ASYNC_UNSUPPORTED', 'ONFERR_ET_BAD_FLAGS', 'ONFERR_ET_BAD_ID', 'ONFERR_ET_BAD_PRIORITY', 'ONFERR_ET_BAD_TYPE', 'ONFERR_ET_BUNDLE_CLOSED', 'ONFERR_ET_BUNDLE_EXIST', 'ONFERR_ET_BUNDLE_IN_PROGRESS', 'ONFERR_ET_CANT_SYNC', 'ONFERR_ET_EPERM', 'ONFERR_ET_FAILED', 'ONFERR_ET_MPART_REPLY_TIMEOUT', 'ONFERR_ET_MPART_REQUEST_TIMEOUT', 'ONFERR_ET_MSG_BAD_LEN', 'ONFERR_ET_MSG_BAD_XID', 'ONFERR_ET_MSG_CONFLICT', 'ONFERR_ET_MSG_TOO_MANY', 'ONFERR_ET_MSG_UNSUP', 'ONFERR_ET_OUT_OF_BUNDLES', 'ONFERR_ET_TIMEOUT', 'ONFERR_ET_UNKNOWN', 'ONFFME_ABBREV', 'ONFFME_ADDED', 'ONFFME_DELETED', 'ONFFME_MODIFIED', 'ONFFMF_ACTIONS', 'ONFFMF_ADD', 'ONFFMF_DELETE', 'ONFFMF_INITIAL', 'ONFFMF_MODIFY', 'ONFFMF_OWN', 'ONFMP_FLOW_MONITOR', 'ONFT_FLOW_MONITOR_CANCEL', 'ONFT_FLOW_MONITOR_PAUSED', 'ONFT_FLOW_MONITOR_RESUMED', 'ONF_BCT_CLOSE_REPLY', 'ONF_BCT_CLOSE_REQUEST', 'ONF_BCT_COMMIT_REPLY', 'ONF_BCT_COMMIT_REQUEST', 'ONF_BCT_DISCARD_REPLY', 'ONF_BCT_DISCARD_REQUEST', 'ONF_BCT_OPEN_REPLY', 'ONF_BCT_OPEN_REQUEST', 'ONF_BF_ATOMIC', 'ONF_BF_ORDERED', 'ONF_BUNDLE_ADD_MSG_PACK_STR', 'ONF_BUNDLE_ADD_MSG_SIZE', 'ONF_BUNDLE_CTRL_PACK_STR', 'ONF_BUNDLE_CTRL_SIZE', 'ONF_ET_BPT_EXPERIMENTER', 'ONF_ET_BUNDLE_ADD_MESSAGE', 'ONF_ET_BUNDLE_CONTROL', 'ONF_FLOW_MONITOR_REQUEST_PACK_STR', 'ONF_FLOW_MONITOR_REQUEST_SIZE', 'ONF_FLOW_UPDATE_ABBREV_PACK_STR', 'ONF_FLOW_UPDATE_ABBREV_SIZE', 'ONF_FLOW_UPDATE_FULL_PACK_STR', 'ONF_FLOW_UPDATE_FULL_SIZE', 'ONF_FLOW_UPDATE_HEADER_PACK_STR', 'ONF_FLOW_UPDATE_HEADER_SIZE', 'OXM_OF_ARP_OP', 'OXM_OF_ARP_OP_W', 'OXM_OF_ARP_SHA', 'OXM_OF_ARP_SHA_W', 'OXM_OF_ARP_SPA', 'OXM_OF_ARP_SPA_W', 'OXM_OF_ARP_THA', 'OXM_OF_ARP_THA_W', 'OXM_OF_ARP_TPA', 'OXM_OF_ARP_TPA_W', 'OXM_OF_ETH_DST', 'OXM_OF_ETH_DST_W', 'OXM_OF_ETH_SRC', 'OXM_OF_ETH_SRC_W', 'OXM_OF_ETH_TYPE', 'OXM_OF_ETH_TYPE_W', 'OXM_OF_ICMPV4_CODE', 'OXM_OF_ICMPV4_CODE_W', 'OXM_OF_ICMPV4_TYPE', 'OXM_OF_ICMPV4_TYPE_W', 'OXM_OF_ICMPV6_CODE', 'OXM_OF_ICMPV6_CODE_W', 'OXM_OF_ICMPV6_TYPE', 'OXM_OF_ICMPV6_TYPE_W', 'OXM_OF_IN_PHY_PORT', 'OXM_OF_IN_PHY_PORT_W', 'OXM_OF_IN_PORT', 'OXM_OF_IN_PORT_W', 'OXM_OF_IPV4_DST', 'OXM_OF_IPV4_DST_W', 'OXM_OF_IPV4_SRC', 'OXM_OF_IPV4_SRC_W', 'OXM_OF_IPV6_DST', 'OXM_OF_IPV6_DST_W', 'OXM_OF_IPV6_EXTHDR', 'OXM_OF_IPV6_EXTHDR_W', 'OXM_OF_IPV6_FLABEL', 'OXM_OF_IPV6_FLABEL_W', 'OXM_OF_IPV6_ND_SLL', 'OXM_OF_IPV6_ND_SLL_W', 'OXM_OF_IPV6_ND_TARGET', 'OXM_OF_IPV6_ND_TARGET_W', 'OXM_OF_IPV6_ND_TLL', 'OXM_OF_IPV6_ND_TLL_W', 'OXM_OF_IPV6_SRC', 'OXM_OF_IPV6_SRC_W', 'OXM_OF_IP_DSCP', 'OXM_OF_IP_DSCP_W', 'OXM_OF_IP_ECN', 'OXM_OF_IP_ECN_W', 'OXM_OF_IP_PROTO', 'OXM_OF_IP_PROTO_W', 'OXM_OF_METADATA', 'OXM_OF_METADATA_W', 'OXM_OF_MPLS_BOS', 'OXM_OF_MPLS_BOS_W', 'OXM_OF_MPLS_LABEL', 'OXM_OF_MPLS_LABEL_W', 'OXM_OF_MPLS_TC', 'OXM_OF_MPLS_TC_W', 'OXM_OF_PBB_ISID', 'OXM_OF_PBB_ISID_W', 'OXM_OF_SCTP_DST', 'OXM_OF_SCTP_DST_W', 'OXM_OF_SCTP_SRC', 'OXM_OF_SCTP_SRC_W', 'OXM_OF_TCP_DST', 'OXM_OF_TCP_DST_W', 'OXM_OF_TCP_SRC', 'OXM_OF_TCP_SRC_W', 'OXM_OF_TUNNEL_ID', 'OXM_OF_TUNNEL_ID_W', 'OXM_OF_UDP_DST', 'OXM_OF_UDP_DST_W', 'OXM_OF_UDP_SRC', 'OXM_OF_UDP_SRC_W', 'OXM_OF_VLAN_PCP', 'OXM_OF_VLAN_PCP_W', 'OXM_OF_VLAN_VID', 'OXM_OF_VLAN_VID_W', 'SERIAL_NUM_LEN', 'SERIAL_NUM_LEN_STR', '_OFP_AGGREGATE_STATS_REQUEST_0_PACK_STR', '_OFP_FLOW_MOD_PACK_STR0', '_OFP_FLOW_REMOVED_PACK_STR0', '_OFP_FLOW_STATS_0_PACK_STR', '_OFP_FLOW_STATS_REQUEST_0_PACK_STR', '_OFP_MATCH_PACK_STR', '_OFP_PORT_PACK_STR', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_oxm_field_desc', '_oxm_tlv_header', 'calcsize', 'nicira_ext', 'ofp_error_code_to_str', 'ofp_error_to_jsondict', 'ofp_error_type_to_str', 'ofp_msg_type_to_str', 'ofproto_utils', 'oxm_fields', 'oxm_from_jsondict', 'oxm_from_user', 'oxm_from_user_header', 'oxm_get_field_info_by_name', 'oxm_normalize_user', 'oxm_parse', 'oxm_parse_header', 'oxm_serialize', 'oxm_serialize_header', 'oxm_tlv_header', 'oxm_tlv_header_extract_hasmask', 'oxm_tlv_header_extract_length', 'oxm_tlv_header_w', 'oxm_to_jsondict', 'oxm_to_user', 'oxm_to_user_header', 'oxm_types', 'type_desc']

View Code

5.獲取邏輯設備datapath中OpenFlow協(xié)議解析信息

<module 'ryu.ofproto.ofproto_v1_3_parser' from '/usr/local/lib/python3.6/dist-packages/ryu/ofproto/ofproto_v1_3_parser.py'>

['Flow', 'FlowWildcards', 'LOG', 'MTArpOp', 'MTArpSha', 'MTArpSpa', 'MTArpTha', 'MTArpTpa', 'MTEthDst', 'MTEthSrc', 'MTEthType', 'MTICMPV4Code', 'MTICMPV4Type', 'MTICMPV6Code', 'MTICMPV6Type', 'MTIPDscp', 'MTIPECN', 'MTIPProto', 'MTIPV4Dst', 'MTIPV4Src', 'MTIPv6', 'MTIPv6Dst', 'MTIPv6ExtHdr', 'MTIPv6Flabel', 'MTIPv6NdSll', 'MTIPv6NdTarget', 'MTIPv6NdTll', 'MTIPv6Src', 'MTInPhyPort', 'MTInPort', 'MTMetadata', 'MTMplsBos', 'MTMplsLabel', 'MTMplsTc', 'MTPbbIsid', 'MTSCTPDst', 'MTSCTPSrc', 'MTTCPDst', 'MTTCPSrc', 'MTTunnelId', 'MTUDPDst', 'MTUDPSrc', 'MTVlanPcp', 'MTVlanVid', 'MsgBase', 'NXAction', 'NXActionBundle', 'NXActionBundleLoad', 'NXActionCT', 'NXActionCTClear', 'NXActionConjunction', 'NXActionController', 'NXActionController2', 'NXActionDecMplsTtl', 'NXActionDecNshTtl', 'NXActionDecTtl', 'NXActionDecTtlCntIds', 'NXActionEncapEther', 'NXActionEncapNsh', 'NXActionExit', 'NXActionFinTimeout', 'NXActionLearn', 'NXActionMultipath', 'NXActionNAT', 'NXActionNote', 'NXActionOutputReg', 'NXActionOutputReg2', 'NXActionOutputTrunc', 'NXActionPopMpls', 'NXActionPopQueue', 'NXActionPushMpls', 'NXActionRegLoad', 'NXActionRegLoad2', 'NXActionRegMove', 'NXActionResubmit', 'NXActionResubmitTable', 'NXActionSample', 'NXActionSample2', 'NXActionSetMplsLabel', 'NXActionSetMplsTc', 'NXActionSetMplsTtl', 'NXActionSetQueue', 'NXActionSetTunnel', 'NXActionSetTunnel64', 'NXActionStackPop', 'NXActionStackPush', 'NXActionUnknown', 'NXFlowSpecLoad', 'NXFlowSpecMatch', 'NXFlowSpecOutput', 'OFPAction', 'OFPActionCopyTtlIn', 'OFPActionCopyTtlOut', 'OFPActionDecMplsTtl', 'OFPActionDecNwTtl', 'OFPActionExperimenter', 'OFPActionExperimenterUnknown', 'OFPActionGroup', 'OFPActionHeader', 'OFPActionId', 'OFPActionOutput', 'OFPActionPopMpls', 'OFPActionPopPbb', 'OFPActionPopVlan', 'OFPActionPushMpls', 'OFPActionPushPbb', 'OFPActionPushVlan', 'OFPActionSetField', 'OFPActionSetMplsTtl', 'OFPActionSetNwTtl', 'OFPActionSetQueue', 'OFPAggregateStats', 'OFPAggregateStatsReply', 'OFPAggregateStatsRequest', 'OFPBarrierReply', 'OFPBarrierRequest', 'OFPBucket', 'OFPBucketCounter', 'OFPDescStats', 'OFPDescStatsReply', 'OFPDescStatsRequest', 'OFPEchoReply', 'OFPEchoRequest', 'OFPErrorExperimenterMsg', 'OFPErrorMsg', 'OFPExperimenter', 'OFPExperimenterMultipart', 'OFPExperimenterOxmId', 'OFPExperimenterStatsReply', 'OFPExperimenterStatsRequest', 'OFPExperimenterStatsRequestBase', 'OFPFeaturesRequest', 'OFPFlowMod', 'OFPFlowRemoved', 'OFPFlowStats', 'OFPFlowStatsReply', 'OFPFlowStatsRequest', 'OFPFlowStatsRequestBase', 'OFPGetAsyncReply', 'OFPGetAsyncRequest', 'OFPGetConfigReply', 'OFPGetConfigRequest', 'OFPGroupDescStats', 'OFPGroupDescStatsReply', 'OFPGroupDescStatsRequest', 'OFPGroupFeaturesStats', 'OFPGroupFeaturesStatsReply', 'OFPGroupFeaturesStatsRequest', 'OFPGroupMod', 'OFPGroupStats', 'OFPGroupStatsReply', 'OFPGroupStatsRequest', 'OFPHello', 'OFPHelloElemVersionBitmap', 'OFPInstruction', 'OFPInstructionActions', 'OFPInstructionGotoTable', 'OFPInstructionId', 'OFPInstructionMeter', 'OFPInstructionWriteMetadata', 'OFPMatch', 'OFPMatchField', 'OFPMeterBand', 'OFPMeterBandDrop', 'OFPMeterBandDscpRemark', 'OFPMeterBandExperimenter', 'OFPMeterBandHeader', 'OFPMeterBandStats', 'OFPMeterConfigStats', 'OFPMeterConfigStatsReply', 'OFPMeterConfigStatsRequest', 'OFPMeterFeaturesStats', 'OFPMeterFeaturesStatsReply', 'OFPMeterFeaturesStatsRequest', 'OFPMeterMod', 'OFPMeterStats', 'OFPMeterStatsReply', 'OFPMeterStatsRequest', 'OFPMultipartReply', 'OFPMultipartRequest', 'OFPOxmId', 'OFPPacketIn', 'OFPPacketOut', 'OFPPacketQueue', 'OFPPort', 'OFPPortDescStatsReply', 'OFPPortDescStatsRequest', 'OFPPortMod', 'OFPPortStats', 'OFPPortStatsReply', 'OFPPortStatsRequest', 'OFPPortStatus', 'OFPPropBase', 'OFPPropCommonExperimenter4ByteData', 'OFPPropUnknown', 'OFPQueueGetConfigReply', 'OFPQueueGetConfigRequest', 'OFPQueueProp', 'OFPQueuePropExperimenter', 'OFPQueuePropHeader', 'OFPQueuePropMaxRate', 'OFPQueuePropMinRate', 'OFPQueueStats', 'OFPQueueStatsReply', 'OFPQueueStatsRequest', 'OFPRoleReply', 'OFPRoleRequest', 'OFPSetAsync', 'OFPSetConfig', 'OFPSwitchFeatures', 'OFPTableFeatureProp', 'OFPTableFeaturePropActions', 'OFPTableFeaturePropExperimenter', 'OFPTableFeaturePropInstructions', 'OFPTableFeaturePropNextTables', 'OFPTableFeaturePropOxm', 'OFPTableFeaturePropUnknown', 'OFPTableFeaturesStats', 'OFPTableFeaturesStatsReply', 'OFPTableFeaturesStatsRequest', 'OFPTableMod', 'OFPTableStats', 'OFPTableStatsReply', 'OFPTableStatsRequest', 'ONFBundleAddMsg', 'ONFBundleCtrlMsg', 'ONFFlowMonitorRequest', 'ONFFlowMonitorStatsRequest', 'StringifyMixin', 'UINT16_MAX', 'UINT32_MAX', 'UINT64_MAX', '_MSG_PARSERS', '_NXFlowSpec', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_register_exp_type', '_register_parser', '_set_msg_type', '_set_stats_type', 'addrconv', 'base64', 'ether', 'exception', 'logging', 'mac', 'msg_pack_into', 'msg_parser', 'nx_actions', 'ofproto', 'ofproto_common', 'ofproto_parser', 'packet', 'six', 'struct', 'utils']

View Code

https://blog.csdn.net/Neo233/article/details/79933849

5.通過ofp_parser中獲取match類匹配

OFPMatch(oxm_fields={})

['_TYPE', '__class__', '__contains__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_base_attributes', '_class_prefixes', '_class_suffixes', '_composed_with_old_api', '_decode_value', '_encode_value', '_fields2', '_flow', '_get_decoder', '_get_default_decoder', '_get_default_encoder', '_get_encoder', '_get_type', '_is_class', '_opt_attributes', '_restore_args', '_wc', 'append_field', 'cls_from_jsondict_key', 'fields', 'from_jsondict', 'get', 'items', 'iteritems', 'length', 'obj_from_jsondict', 'parser', 'parser_old', 'serialize', 'serialize_old', 'set_arp_opcode', 'set_arp_sha', 'set_arp_sha_masked', 'set_arp_spa', 'set_arp_spa_masked', 'set_arp_tha', 'set_arp_tha_masked', 'set_arp_tpa', 'set_arp_tpa_masked', 'set_classes', 'set_dl_dst', 'set_dl_dst_masked', 'set_dl_src', 'set_dl_src_masked', 'set_dl_type', 'set_icmpv4_code', 'set_icmpv4_type', 'set_icmpv6_code', 'set_icmpv6_type', 'set_in_phy_port', 'set_in_port', 'set_ip_dscp', 'set_ip_ecn', 'set_ip_proto', 'set_ipv4_dst', 'set_ipv4_dst_masked', 'set_ipv4_src', 'set_ipv4_src_masked', 'set_ipv6_dst', 'set_ipv6_dst_masked', 'set_ipv6_exthdr', 'set_ipv6_exthdr_masked', 'set_ipv6_flabel', 'set_ipv6_flabel_masked', 'set_ipv6_nd_sll', 'set_ipv6_nd_target', 'set_ipv6_nd_tll', 'set_ipv6_src', 'set_ipv6_src_masked', 'set_metadata', 'set_metadata_masked', 'set_mpls_bos', 'set_mpls_label', 'set_mpls_tc', 'set_pbb_isid', 'set_pbb_isid_masked', 'set_sctp_dst', 'set_sctp_src', 'set_tcp_dst', 'set_tcp_src', 'set_tunnel_id', 'set_tunnel_id_masked', 'set_udp_dst', 'set_udp_src', 'set_vlan_pcp', 'set_vlan_vid', 'set_vlan_vid_masked', 'set_vlan_vid_none', 'stringify_attrs', 'to_jsondict', 'type']

View Code

5.通過ofp_parser中獲取actions類匹配

[OFPActionOutput(len=16,max_len=65535,port=4294967293,type=0)]

['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

View Code

6.match = ofp_parser.OFPMatch()中OFPMatch類協(xié)議支持的匹配方式

class OFPMatch(StringifyMixin):
    """
    Flow Match Structure

    This class is implementation of the flow match structure having
    compose/query API.
    There are new API and old API for compatibility. the old API is
    supposed to be removed later.

    You can define the flow match by the keyword arguments.
    The following arguments are available.

    ================ =============== ==================================
    Argument         Value           Description
    ================ =============== ==================================
    in_port          Integer 32bit   Switch input port
    in_phy_port      Integer 32bit   Switch physical input port
    metadata         Integer 64bit   Metadata passed between tables
    eth_dst          MAC address     Ethernet destination address
    eth_src          MAC address     Ethernet source address
    eth_type         Integer 16bit   Ethernet frame type
    vlan_vid         Integer 16bit   VLAN id
    vlan_pcp         Integer 8bit    VLAN priority
    ip_dscp          Integer 8bit    IP DSCP (6 bits in ToS field)
    ip_ecn           Integer 8bit    IP ECN (2 bits in ToS field)
    ip_proto         Integer 8bit    IP protocol
    ipv4_src         IPv4 address    IPv4 source address
    ipv4_dst         IPv4 address    IPv4 destination address
    tcp_src          Integer 16bit   TCP source port
    tcp_dst          Integer 16bit   TCP destination port
    udp_src          Integer 16bit   UDP source port
    udp_dst          Integer 16bit   UDP destination port
    sctp_src         Integer 16bit   SCTP source port
    sctp_dst         Integer 16bit   SCTP destination port
    icmpv4_type      Integer 8bit    ICMP type
    icmpv4_code      Integer 8bit    ICMP code
    arp_op           Integer 16bit   ARP opcode
    arp_spa          IPv4 address    ARP source IPv4 address
    arp_tpa          IPv4 address    ARP target IPv4 address
    arp_sha          MAC address     ARP source hardware address
    arp_tha          MAC address     ARP target hardware address
    ipv6_src         IPv6 address    IPv6 source address
    ipv6_dst         IPv6 address    IPv6 destination address
    ipv6_flabel      Integer 32bit   IPv6 Flow Label
    icmpv6_type      Integer 8bit    ICMPv6 type
    icmpv6_code      Integer 8bit    ICMPv6 code
    ipv6_nd_target   IPv6 address    Target address for ND
    ipv6_nd_sll      MAC address     Source link-layer for ND
    ipv6_nd_tll      MAC address     Target link-layer for ND
    mpls_label       Integer 32bit   MPLS label
    mpls_tc          Integer 8bit    MPLS TC
    mpls_bos         Integer 8bit    MPLS BoS bit
    pbb_isid         Integer 24bit   PBB I-SID
    tunnel_id        Integer 64bit   Logical Port Metadata
    ipv6_exthdr      Integer 16bit   IPv6 Extension Header pseudo-field
    pbb_uca          Integer 8bit    PBB UCA header field
                                     (EXT-256 Old version of ONF Extension)
    tcp_flags        Integer 16bit   TCP flags
                                     (EXT-109 ONF Extension)
    actset_output    Integer 32bit   Output port from action set metadata
                                     (EXT-233 ONF Extension)
    ================ =============== ==================================

    Example::

        >>> # compose
        >>> match = parser.OFPMatch(
        ...     in_port=1,
        ...     eth_type=0x86dd,
        ...     ipv6_src=('2001:db8:bd05:1d2:288a:1fc0:1:10ee',
        ...               'ffff:ffff:ffff:ffff::'),
        ...     ipv6_dst='2001:db8:bd05:1d2:288a:1fc0:1:10ee')
        >>> # query
        >>> if 'ipv6_src' in match:
        ...     print match['ipv6_src']
        ...
        ('2001:db8:bd05:1d2:288a:1fc0:1:10ee', 'ffff:ffff:ffff:ffff::')

    .. Note::

        For the list of the supported Nicira experimenter matches,
        please refer to :ref:`ryu.ofproto.nx_match <nx_match_structures>`.

    .. Note::

        For VLAN id match field, special values are defined in OpenFlow Spec.

        1) Packets with and without a VLAN tag

            - Example::

                match = parser.OFPMatch()

            - Packet Matching

                ====================== =====
                non-VLAN-tagged        MATCH
                VLAN-tagged(vlan_id=3) MATCH
                VLAN-tagged(vlan_id=5) MATCH
                ====================== =====

        2) Only packets without a VLAN tag

            - Example::

                match = parser.OFPMatch(vlan_vid=0x0000)

            - Packet Matching

                ====================== =====
                non-VLAN-tagged        MATCH
                VLAN-tagged(vlan_id=3)   x
                VLAN-tagged(vlan_id=5)   x
                ====================== =====

        3) Only packets with a VLAN tag regardless of its value

            - Example::

                match = parser.OFPMatch(vlan_vid=(0x1000, 0x1000))

            - Packet Matching

                ====================== =====
                non-VLAN-tagged          x
                VLAN-tagged(vlan_id=3) MATCH
                VLAN-tagged(vlan_id=5) MATCH
                ====================== =====

        4) Only packets with VLAN tag and VID equal

            - Example::

                match = parser.OFPMatch(vlan_vid=(0x1000 | 3))

            - Packet Matching

                ====================== =====
                non-VLAN-tagged          x
                VLAN-tagged(vlan_id=3) MATCH
                VLAN-tagged(vlan_id=5)   x
                ====================== =====
    """

7.out = ofp_parser.OFPPacketOut(datapath=datapath,buffer_id=msg.buffer_id,in_port=in_port,actions=actions,data=msg.data)

        out = ofp_parser.OFPPacketOut(datapath=datapath,buffer_id=msg.buffer_id,
                                            in_port=in_port,actions=actions)    

        datapath.send_msg(out);

控制器使用此消息通過交換機發(fā)送數(shù)據(jù)包(存在控制器的消息緩存,我們需要發(fā)送給交換機,讓他進行發(fā)送)---注意我們不僅要傳遞buffer_id還要傳遞data才可以實現(xiàn)將數(shù)據(jù)返回

@_set_msg_type(ofproto.OFPT_PACKET_OUT)
class OFPPacketOut(MsgBase):
    """
    Packet-Out message

    The controller uses this message to send a packet out throught the
    switch.

    ================ ======================================================
    Attribute        Description
    ================ ======================================================
    buffer_id        ID assigned by datapath (OFP_NO_BUFFER if none)
    in_port          Packet's input port or ``OFPP_CONTROLLER``
    actions          list of OpenFlow action class
    data             Packet data of a binary type value or
                     an instances of packet.Packet.
    ================ ======================================================

    Example::

        def send_packet_out(self, datapath, buffer_id, in_port):
            ofp = datapath.ofproto
            ofp_parser = datapath.ofproto_parser

            actions = [ofp_parser.OFPActionOutput(ofp.OFPP_FLOOD, 0)]
            req = ofp_parser.OFPPacketOut(datapath, buffer_id,
                                          in_port, actions)
            datapath.send_msg(req)
    """

    def __init__(self, datapath, buffer_id=None, in_port=None, actions=None,
                 data=None, actions_len=None):
        assert in_port is not None

        super(OFPPacketOut, self).__init__(datapath)
        self.buffer_id = buffer_id
        self.in_port = in_port
        self.actions_len = 0
        self.actions = actions
        self.data = data

    def _serialize_body(self):
        self.actions_len = 0
        offset = ofproto.OFP_PACKET_OUT_SIZE
        for a in self.actions:
            a.serialize(self.buf, offset)
            offset += a.len
            self.actions_len += a.len

        if self.data is not None:
            assert self.buffer_id == 0xffffffff
            if isinstance(self.data, packet.Packet):
                self.data.serialize()
                self.buf += self.data.data
            else:
                self.buf += self.data

        msg_pack_into(ofproto.OFP_PACKET_OUT_PACK_STR,
                      self.buf, ofproto.OFP_HEADER_SIZE,
                      self.buffer_id, self.in_port, self.actions_len)

    @classmethod
    def from_jsondict(cls, dict_, decode_string=base64.b64decode,
                      **additional_args):
        if isinstance(dict_['data'], dict):
            data = dict_.pop('data')
            ins = super(OFPPacketOut, cls).from_jsondict(dict_,
                                                         decode_string,
                                                         **additional_args)
            ins.data = packet.Packet.from_jsondict(data['Packet'])
            dict_['data'] = data
        else:
            ins = super(OFPPacketOut, cls).from_jsondict(dict_,
                                                         decode_string,
                                                         **additional_args)

        return ins

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

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

        mod = ofp_parser.OFPFlowMod(datapath=datapath,priority=priority,
                                    match=match,instructions=inst)
        datapath.send_msg(mod);

此指令寫入/應用/清除操作。就是說通過這個類實現(xiàn)我們對聲明的actions行為進行應用(應用這個動作)、還是清除(不需要這個動作了)、還是寫入操作

class OFPInstruction(StringifyMixin):
    _INSTRUCTION_TYPES = {}

    @staticmethod
    def register_instruction_type(types):
        def _register_instruction_type(cls):
            for type_ in types:
                OFPInstruction._INSTRUCTION_TYPES[type_] = cls
            return cls
        return _register_instruction_type

    @classmethod
    def parser(cls, buf, offset):
        (type_, len_) = struct.unpack_from('!HH', buf, offset)
        cls_ = cls._INSTRUCTION_TYPES.get(type_)
        return cls_.parser(buf, offset)
@OFPInstruction.register_instruction_type([ofproto.OFPIT_WRITE_ACTIONS,
                                           ofproto.OFPIT_APPLY_ACTIONS,
                                           ofproto.OFPIT_CLEAR_ACTIONS])
class OFPInstructionActions(OFPInstruction):
    """
    Actions instruction

    This instruction writes/applies/clears the actions.

    ================ ======================================================
    Attribute        Description
    ================ ======================================================
    type             One of following values.

                     | OFPIT_WRITE_ACTIONS
                     | OFPIT_APPLY_ACTIONS
                     | OFPIT_CLEAR_ACTIONS
    actions          list of OpenFlow action class
    ================ ======================================================

    ``type`` attribute corresponds to ``type_`` parameter of __init__.
    """

    def __init__(self, type_, actions=None, len_=None):
        super(OFPInstructionActions, self).__init__()
        self.type = type_
        for a in actions:
            assert isinstance(a, OFPAction)
        self.actions = actions

    @classmethod
    def parser(cls, buf, offset):
        (type_, len_) = struct.unpack_from(
            ofproto.OFP_INSTRUCTION_ACTIONS_PACK_STR,
            buf, offset)

        offset += ofproto.OFP_INSTRUCTION_ACTIONS_SIZE
        actions = []
        actions_len = len_ - ofproto.OFP_INSTRUCTION_ACTIONS_SIZE
        exc = None
        try:
            while actions_len > 0:
                a = OFPAction.parser(buf, offset)
                actions.append(a)
                actions_len -= a.len
                offset += a.len
        except struct.error as e:
            exc = e

        inst = cls(type_, actions)
        inst.len = len_
        if exc is not None:
            raise exception.OFPTruncatedMessage(ofpmsg=inst,
                                                residue=buf[offset:],
                                                original_exception=exc)
        return inst

    def serialize(self, buf, offset):
        action_offset = offset + ofproto.OFP_INSTRUCTION_ACTIONS_SIZE
        if self.actions:
            for a in self.actions:
                a.serialize(buf, action_offset)
                action_offset += a.len

        self.len = action_offset - offset
        pad_len = utils.round_up(self.len, 8) - self.len
        msg_pack_into("%dx" % pad_len, buf, action_offset)
        self.len += pad_len

        msg_pack_into(ofproto.OFP_INSTRUCTION_ACTIONS_PACK_STR,
                      buf, offset, self.type, self.len)

9.mod = ofp_parser.OFPFlowMod(datapath=datapath,priority=priority,match=match,instructions=inst); 修改流表項消息 控制器發(fā)送此消息以修改流表。

@_register_parser
@_set_msg_type(ofproto.OFPT_FLOW_MOD)
class OFPFlowMod(MsgBase):
    """
    Modify Flow entry message

    The controller sends this message to modify the flow table.

    ================ ======================================================
    Attribute        Description
    ================ ======================================================
    cookie           Opaque controller-issued identifier
    cookie_mask      Mask used to restrict the cookie bits that must match
                     when the command is ``OPFFC_MODIFY*`` or
                     ``OFPFC_DELETE*``
    table_id         ID of the table to put the flow in
    command          One of the following values.

                     | OFPFC_ADD
                     | OFPFC_MODIFY
                     | OFPFC_MODIFY_STRICT
                     | OFPFC_DELETE
                     | OFPFC_DELETE_STRICT
    idle_timeout     Idle time before discarding (seconds)
    hard_timeout     Max time before discarding (seconds)
    priority         Priority level of flow entry
    buffer_id        Buffered packet to apply to (or OFP_NO_BUFFER)
    out_port         For ``OFPFC_DELETE*`` commands, require matching
                     entries to include this as an output port
    out_group        For ``OFPFC_DELETE*`` commands, require matching
                     entries to include this as an output group
    flags            Bitmap of the following flags.

                     | OFPFF_SEND_FLOW_REM
                     | OFPFF_CHECK_OVERLAP
                     | OFPFF_RESET_COUNTS
                     | OFPFF_NO_PKT_COUNTS
                     | OFPFF_NO_BYT_COUNTS
    match            Instance of ``OFPMatch``
    instructions     list of ``OFPInstruction*`` instance
    ================ ======================================================

    Example::

        def send_flow_mod(self, datapath):
            ofp = datapath.ofproto
            ofp_parser = datapath.ofproto_parser

            cookie = cookie_mask = 0
            table_id = 0
            idle_timeout = hard_timeout = 0
            priority = 32768
            buffer_id = ofp.OFP_NO_BUFFER
            match = ofp_parser.OFPMatch(in_port=1, eth_dst='ff:ff:ff:ff:ff:ff')
            actions = [ofp_parser.OFPActionOutput(ofp.OFPP_NORMAL, 0)]
            inst = [ofp_parser.OFPInstructionActions(ofp.OFPIT_APPLY_ACTIONS,
                                                     actions)]
            req = ofp_parser.OFPFlowMod(datapath, cookie, cookie_mask,
                                        table_id, ofp.OFPFC_ADD,
                                        idle_timeout, hard_timeout,
                                        priority, buffer_id,
                                        ofp.OFPP_ANY, ofp.OFPG_ANY,
                                        ofp.OFPFF_SEND_FLOW_REM,
                                        match, inst)
            datapath.send_msg(req)
    """

    def __init__(self, datapath, cookie=0, cookie_mask=0, table_id=0,
                 command=ofproto.OFPFC_ADD,
                 idle_timeout=0, hard_timeout=0,
                 priority=ofproto.OFP_DEFAULT_PRIORITY,
                 buffer_id=ofproto.OFP_NO_BUFFER,
                 out_port=0, out_group=0, flags=0,
                 match=None,
                 instructions=None):
        instructions = instructions if instructions else []
        super(OFPFlowMod, self).__init__(datapath)
        self.cookie = cookie
        self.cookie_mask = cookie_mask
        self.table_id = table_id
        self.command = command
        self.idle_timeout = idle_timeout
        self.hard_timeout = hard_timeout
        self.priority = priority
        self.buffer_id = buffer_id
        self.out_port = out_port
        self.out_group = out_group
        self.flags = flags
        if match is None:
            match = OFPMatch()
        assert isinstance(match, OFPMatch)
        self.match = match
        for i in instructions:
            assert isinstance(i, OFPInstruction)
        self.instructions = instructions

    def _serialize_body(self):
        msg_pack_into(ofproto.OFP_FLOW_MOD_PACK_STR0, self.buf,
                      ofproto.OFP_HEADER_SIZE,
                      self.cookie, self.cookie_mask, self.table_id,
                      self.command, self.idle_timeout, self.hard_timeout,
                      self.priority, self.buffer_id, self.out_port,
                      self.out_group, self.flags)

        offset = (ofproto.OFP_FLOW_MOD_SIZE -
                  ofproto.OFP_MATCH_SIZE)

        match_len = self.match.serialize(self.buf, offset)
        offset += match_len

        for inst in self.instructions:
            inst.serialize(self.buf, offset)
            offset += inst.len

    @classmethod
    def parser(cls, datapath, version, msg_type, msg_len, xid, buf):
        msg = super(OFPFlowMod, cls).parser(
            datapath, version, msg_type, msg_len, xid, buf)

        (msg.cookie, msg.cookie_mask, msg.table_id,
         msg.command, msg.idle_timeout, msg.hard_timeout,
         msg.priority, msg.buffer_id, msg.out_port,
         msg.out_group, msg.flags) = struct.unpack_from(
            ofproto.OFP_FLOW_MOD_PACK_STR0, msg.buf,
            ofproto.OFP_HEADER_SIZE)
        offset = ofproto.OFP_FLOW_MOD_SIZE - ofproto.OFP_HEADER_SIZE

        try:
            msg.match = OFPMatch.parser(buf, offset)
        except exception.OFPTruncatedMessage as e:
            msg.match = e.ofpmsg
            e.ofpmsg = msg
            raise e

        offset += utils.round_up(msg.match.length, 8)

        instructions = []
        try:
            while offset < msg_len:
                i = OFPInstruction.parser(buf, offset)
                instructions.append(i)
                offset += i.len
        except exception.OFPTruncatedMessage as e:
            instructions.append(e.ofpmsg)
            msg.instructions = instructions
            e.ofpmsg = msg
            raise e
        except struct.error as e:
            msg.instructions = instructions
            raise exception.OFPTruncatedMessage(ofpmsg=msg,
                                                residue=buf[offset:],
                                                original_exception=e)
        msg.instructions = instructions

        return msg

10.actions = [ofp_parser.OFPActionOutput(ofproto.OFPP_CONTROLLER,ofproto.OFPCML_NO_BUFFER)]---此操作表示將數(shù)據(jù)包輸出到交換機端口

@OFPAction.register_action_type(ofproto.OFPAT_OUTPUT,
                                ofproto.OFP_ACTION_OUTPUT_SIZE)
class OFPActionOutput(OFPAction):
    """
    Output action

    This action indicates output a packet to the switch port.

    ================ ======================================================
    Attribute        Description
    ================ ======================================================
    port             Output port
    max_len          Max length to send to controller
    ================ ======================================================
    """

    def __init__(self, port, max_len=ofproto.OFPCML_MAX,
                 type_=None, len_=None):
        super(OFPActionOutput, self).__init__()
        self.port = port
        self.max_len = max_len

    @classmethod
    def parser(cls, buf, offset):
        type_, len_, port, max_len = struct.unpack_from(
            ofproto.OFP_ACTION_OUTPUT_PACK_STR, buf, offset)
        return cls(port, max_len)

    def serialize(self, buf, offset):
        msg_pack_into(ofproto.OFP_ACTION_OUTPUT_PACK_STR, buf,
                      offset, self.type, self.len, self.port, self.max_len)

11.ofproto.OFPP_CONTROLLER,ofproto.OFPCML_NO_BUFFER  一個輸出端口,一個是數(shù)據(jù)包最大長度

<module 'ryu.ofproto.ofproto_v1_3' from '/usr/local/lib/python3.6/dist-packages/ryu/ofproto/ofproto_v1_3.py'>
# enum ofp_port_no
OFPP_MAX = 0xffffff00
OFPP_IN_PORT = 0xfffffff8       # Send the packet out the input port. This
                                # virtual port must be explicitly used
                                # in order to send back out of the input
                                # port.
OFPP_TABLE = 0xfffffff9         # Perform actions in flow table.
                                # NB: This can only be the destination
                                # port for packet-out messages.
OFPP_NORMAL = 0xfffffffa        # Process with normal L2/L3 switching.
OFPP_FLOOD = 0xfffffffb         # All physical ports except input port and
                                # those disabled by STP.
OFPP_ALL = 0xfffffffc           # All physical ports except input port.
OFPP_CONTROLLER = 0xfffffffd    # Send to controller.  這是讓交換機將數(shù)據(jù)包發(fā)送給控制器《重點》
OFPP_LOCAL = 0xfffffffe         # Local openflow "port".
OFPP_ANY = 0xffffffff             # Not associated with a physical port.
actions = [ofp_parser.OFPActionOutput(ofproto.OFPP_CONTROLLER,ofproto.OFPCML_NO_BUFFER)] 流表項動作表示將數(shù)據(jù)包發(fā)送給控制器
# enum ofp_controller_max_len
OFPCML_MAX = 0xffe5         # maximum max_len value which can be used to    可用于請求特定字節(jié)長度的最大Max值。(是向控制器請求的最大數(shù)據(jù)長度)
                            # request a specific byte length.
OFPCML_NO_BUFFER = 0xffff   # indicates that no buffering should be    指示不應應用緩沖,并且將整個數(shù)據(jù)包發(fā)送到控制器
                            # applied and the whole packet is to be
                            # sent to the controller.
actions = [ofp_parser.OFPActionOutput(ofproto.OFPP_CONTROLLER,ofproto.OFPCML_NO_BUFFER)] 表示交換機中不用緩存數(shù)據(jù)包,全部發(fā)送給控制器即可

12.@set_ev_cls(ofp_event.EventOFPSwitchFeatures,CONFIG_DISPATCHER)中的事件,由ofp_event下面的代碼動態(tài)生成

NAME = 'ofp_event'


class EventOFPMsgBase(event.EventBase):
    """
    The base class of OpenFlow event class.

    OpenFlow event classes have at least the following attributes.

    .. tabularcolumns:: |l|L|

    ============ ==============================================================
    Attribute    Description
    ============ ==============================================================
    msg          An object which describes the corresponding OpenFlow message.
    msg.datapath A ryu.controller.controller.Datapath instance
                 which describes an OpenFlow switch from which we received
                 this OpenFlow message.
    timestamp    Timestamp when Datapath instance generated this event.
    ============ ==============================================================

    The msg object has some more additional members whose values are extracted
    from the original OpenFlow message.
    """

    def __init__(self, msg):
        self.timestamp = time.time()
        super(EventOFPMsgBase, self).__init__()
        self.msg = msg


#
# Create ofp_event type corresponding to OFP Msg
#

_OFP_MSG_EVENTS = {}


def _ofp_msg_name_to_ev_name(msg_name):
    return 'Event' + msg_name


def ofp_msg_to_ev(msg):
    return ofp_msg_to_ev_cls(msg.__class__)(msg)


def ofp_msg_to_ev_cls(msg_cls):
    name = _ofp_msg_name_to_ev_name(msg_cls.__name__)
    return _OFP_MSG_EVENTS[name]


def _create_ofp_msg_ev_class(msg_cls):
    name = _ofp_msg_name_to_ev_name(msg_cls.__name__)
    # print 'creating ofp_event %s' % name

    if name in _OFP_MSG_EVENTS:
        return

    cls = type(name, (EventOFPMsgBase,),
               dict(__init__=lambda self, msg:
                    super(self.__class__, self).__init__(msg)))
    globals()[name] = cls
    _OFP_MSG_EVENTS[name] = cls


def _create_ofp_msg_ev_from_module(ofp_parser):
    # print mod
    for _k, cls in inspect.getmembers(ofp_parser, inspect.isclass):
        if not hasattr(cls, 'cls_msg_type'):
            continue
        _create_ofp_msg_ev_class(cls)


for ofp_mods in ofproto.get_ofp_modules().values():
    ofp_parser = ofp_mods[1]
    # print 'loading module %s' % ofp_parser
    _create_ofp_msg_ev_from_module(ofp_parser)

總結(jié)

以上是生活随笔為你收集整理的SDN实验---Ryu的应用开发(一)Hub实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

国产一区二区三区视频在线 | 日韩精品免费一区二区 | 精品国产免费一区二区三区五区 | 丝袜足交在线 | 亚洲欧美精品在线 | 国产视频中文字幕 | 国产成在线观看免费视频 | 99r精品视频在线观看 | 国产裸体无遮挡 | 亚洲国产97在线精品一区 | 色99导航 | 精品国产免费看 | 99中文视频在线 | 人人干人人干人人干 | 色欧美视频 | 亚洲精品免费观看 | 日韩久久一区二区 | 久久伊人国产精品 | 亚洲精品久久久久中文字幕二区 | 欧美天堂久久 | 正在播放五月婷婷狠狠干 | 午夜精品久久久久久久99水蜜桃 | 国产亚洲一级高清 | 91天堂在线观看 | 黄色电影在线免费观看 | 在线观看免费高清视频大全追剧 | 久久草草热国产精品直播 | 干av在线| 中文日韩在线视频 | 色噜噜狠狠色综合中国 | 亚洲日本欧美在线 | av动图 | 嫩草av影院| 五月婷婷在线视频观看 | 成人网在线免费视频 | 91精品国产92久久久久 | 国产精品6999成人免费视频 | 欧美视频国产视频 | 黄色国产高清 | 全久久久久久久久久久电影 | av在线等| 国产精品毛片完整版 | 麻豆国产在线视频 | 久久久久久久久久久福利 | 天天摸天天操天天爽 | 97人人澡人人爽人人模亚洲 | 成人av在线播放网站 | 日韩大片免费在线观看 | 久久天天躁狠狠躁夜夜不卡公司 | 黄色亚洲大片免费在线观看 | 手机在线永久免费观看av片 | 亚洲日韩中文字幕在线播放 | 国产午夜激情视频 | 久热av | 少妇bbb搡bbbb搡bbbb′ | 91av免费观看 | 日韩欧美高清视频在线观看 | 免费h视频 | 麻豆一区在线观看 | 亚洲国产高清视频 | 久久字幕网 | 久久国产欧美日韩精品 | 国产午夜精品理论片在线 | 97人人爽人人 | 日韩欧美一区二区不卡 | 日韩网站中文字幕 | 亚洲精品视 | 麻豆视屏 | 少妇视频一区 | 久久综合中文色婷婷 | 国产综合激情 | 日韩r级在线 | 五月天综合婷婷 | www色av| 国产成本人视频在线观看 | 国产成人亚洲在线电影 | 亚洲一区二区三区毛片 | 成年人在线观看网站 | 久久人人爽视频 | 91片黄在线观看动漫 | 91视视频在线直接观看在线看网页在线看 | 黄色大全免费网站 | 国产精品福利视频 | 国产资源网 | 91成人精品一区在线播放 | 最近中文字幕久久 | 免费在线观看av | 免费大片黄在线 | 亚洲久在线 | 国产亚洲婷婷免费 | h文在线观看免费 | 五月婷婷操 | 最新av电影网址 | 亚洲欧美国产精品18p | 日韩免费在线视频观看 | 国产亚洲一区二区在线观看 | 一区二区三区污 | 97理论片| 日日草视频 | 日本动漫做毛片一区二区 | 国产资源免费 | 亚洲成人av片在线观看 | 亚洲精品色婷婷 | 一区二区免费不卡在线 | 亚洲一区二区三区毛片 | 中文字幕日韩国产 | 六月丁香婷婷久久 | 97视频在线观看网址 | 五月天狠狠操 | 国产成人精品综合久久久 | 久久av伊人 | 99热国内精品 | 激情视频区 | 国产一区私人高清影院 | 麻花传媒mv免费观看 | 狠狠色香婷婷久久亚洲精品 | 91精品中文字幕 | 日韩电影一区二区在线观看 | 97成人超碰 | 国产精品18久久久久久首页狼 | 超碰在线人人爱 | 日色在线视频 | 中文字幕日韩国产 | 波多野结衣电影一区二区 | 国产中文字幕在线观看 | 尤物九九久久国产精品的分类 | 成 人 黄 色 片 在线播放 | 国产成人久久精品亚洲 | 狠狠色丁香婷婷综合久小说久 | 国产成人精品免高潮在线观看 | 国内久久精品 | 99亚洲国产 | 久操视频在线观看 | 午夜影院在线观看18 | 日韩在线电影一区二区 | 精品国产乱码久久久久久三级人 | 国产一区二区高清不卡 | 亚洲精品网站在线 | 久久久久免费网站 | 午夜黄色大片 | 一级α片 | 日日干干夜夜 | 国产精品福利在线 | 国产视频 亚洲视频 | 日韩色综合网 | 国产小视频福利在线 | 日韩高清国产精品 | 手机在线小视频 | 精品国产成人在线影院 | 久久福利在线 | 免费久久99精品国产婷婷六月 | 最近中文字幕免费av | 波多在线视频 | 最新av网址大全 | 免费久久网 | 天天摸天天操天天爽 | 天天干天天做 | 色妞色视频一区二区三区四区 | 成人97人人超碰人人99 | 成人免费大片黄在线播放 | 精品国产一区二区三区噜噜噜 | 美女黄网久久 | 日韩免费区 | 久久久久久亚洲精品 | 亚洲视频久久 | 久久综合给合久久狠狠色 | 深夜免费福利视频 | 久久久久久久久久久黄色 | www91在线| 日韩性色 | 韩国一区二区三区视频 | 人人玩人人爽 | 69亚洲乱| 国产色黄网站 | 96超碰在线 | 狠狠干夜夜操 | 亚洲久草在线 | 黄色av高清 | 久久国产亚洲 | 天天干天天射天天爽 | 久久歪歪 | av黄色成人 | 亚洲 欧美 变态 国产 另类 | 色偷偷97 | 最近高清中文字幕在线国语5 | 久久婷婷一区二区三区 | 日韩在线短视频 | www五月天| 久久久久久久毛片 | 国产精品免费高清 | 免费高清av在线看 | 亚洲黄色在线观看 | 在线草 | 激情五月激情综合网 | 欧美国产日韩中文 | 久久精品第一页 | 综合天天色 | 在线观看中文字幕网站 | 色婷婷88av视频一二三区 | 一级黄色电影网站 | 91av视频观看| 国产视频在线观看一区 | 国产精品日韩 | 欧美色图88| 国产精品一区二区在线免费观看 | 九九九九精品 | 欧美日韩69| 日韩中文在线电影 | 国产h在线播放 | 日本不卡123区 | 超碰免费成人 | 日韩在线视频免费看 | 婷婷久久综合九色综合 | 久草在线视频资源 | 在线看国产视频 | 日韩高清无线码2023 | 国产91精品看黄网站 | 国产精品欧美一区二区 | 超碰成人网| 最新国产精品亚洲 | 99精品免费久久久久久日本 | 国产成人在线免费观看 | 久久九九九九 | 欧美日韩一区二区视频在线观看 | 日韩久久精品一区二区三区下载 | 女人18片毛片90分钟 | 人人澡人人草 | 国产一线在线 | 九九免费在线看完整版 | 国产精华国产精品 | 国产成人一区二区精品非洲 | 色噜噜噜 | 亚洲成人999 | 又大又硬又黄又爽视频在线观看 | 91精品视频一区二区三区 | av理论电影| 国产福利一区二区三区在线观看 | 91精品免费在线观看 | 黄色特级片 | 欧美亚洲另类在线视频 | 国产黄a三级三级三级三级三级 | 青青草国产成人99久久 | 日韩精品一二三 | www.天天综合| 国产精品网址在线观看 | 丁香 婷婷 激情 | 91资源在线免费观看 | 欧美一区二区日韩一区二区 | 国产成人精品女人久久久 | 视频精品一区二区三区 | 国产日韩精品一区二区三区 | 免费观看国产视频 | 黄色毛片视频免费 | 人人澡超碰碰 | 天天爱天天操天天射 | 国产日本三级 | 夜夜看av | 国产亚洲激情视频在线 | 一色av | 国产福利不卡视频 | 激情视频一区二区三区 | 黄色网中文字幕 | 日韩欧美91 | 五月的婷婷| 五月综合久久 | 午夜精品视频在线 | 在线视频日韩精品 | 日韩国产高清在线 | 色婷婷av国产精品 | 在线国产不卡 | 国产一区欧美一区 | 久久免费视频这里只有精品 | 久久图 | 久久艹在线 | 日本性xxx | 国产精品福利av | 伊人看片 | 国产精品日韩在线观看 | 久久精品中文视频 | 91视频免费网址 | 日韩欧美综合在线视频 | 天天干天天干天天干天天干天天干天天干 | 亚州人成在线播放 | 香蕉久久国产 | 亚洲综合激情五月 | 中文字幕在线观看完整版电影 | 欧美小视频在线观看 | 国产一级二级在线观看 | 精品久久久久久综合日本 | 日韩免费播放 | 日韩av电影一区 | 免费观看第二部31集 | 久久丝袜视频 | 国产精品va在线观看入 | 中文字幕日韩av | 国产主播大尺度精品福利免费 | 欧美国产日韩一区二区三区 | 黄av在线| 亚洲精品午夜久久久久久久 | 国产成人无码AⅤ片在线观 日韩av不卡在线 | 美女网站视频免费黄 | 美女黄视频免费 | 91亚洲国产成人久久精品网站 | 黄色一级在线视频 | 亚洲精品日韩在线观看 | 婷婷久久五月天 | 天堂av免费观看 | 很污的网站 | 欧美精品一二 | 狠狠色狠狠色合久久伊人 | 国产专区精品视频 | 亚洲成人午夜av | 激情综合色图 | 成人黄大片视频在线观看 | 久久私人影院 | 色欲综合视频天天天 | 国产一区高清在线 | 国产精品美女www爽爽爽视频 | 久久在线精品视频 | 激情久久久久 | 日韩精品字幕 | 久久久久久久网 | 欧美精品亚洲精品日韩精品 | 91探花国产综合在线精品 | 13日本xxxxxⅹxxx20 | 久久久久福利视频 | 久久无码精品一区二区三区 | 久久精品99国产精品日本 | 亚洲高清视频在线播放 | 91成人免费看片 | 日本黄色免费大片 | 国产精品一区二区三区免费视频 | 在线观看免费黄视频 | 手机在线观看国产精品 | 亚洲国产美女久久久久 | www久久精品| 日日干精品| 99在线看 | 久久成人免费电影 | a黄色| 国产亚洲精品成人av久久ww | 国产在线观看免费 | 免费三级黄 | 国产高清久久久 | 成人h视频| 不卡视频一区二区三区 | 91丨精品丨蝌蚪丨白丝jk | 免费v片 | 一区二区三区在线看 | 美女精品久久久 | 中文视频一区二区 | 一级免费黄视频 | 亚洲精品视频在线观看网站 | 亚洲综合色丁香婷婷六月图片 | 欧美日本不卡视频 | 国产午夜精品在线 | 1024手机看片国产 | 国产一区免费视频 | 91在线精品秘密一区二区 | 午夜成人影视 | 免费中文字幕 | 国产高清在线精品 | 久草精品电影 | 日韩中文幕 | 日韩大片在线观看 | 六月色丁 | 国产精品普通话 | 亚洲欧美视频网站 | 中文字幕亚洲精品在线观看 | 欧美怡红院 | 一区二区三区在线观看免费 | 国产精品v a免费视频 | 国产小视频免费在线网址 | 在线观看成人小视频 | 亚洲精品美女久久17c | 综合网伊人 | 人人插人人射 | 99性视频| 一区二区视频在线免费观看 | 中文字幕视频网 | 日韩免费一区二区三区 | 天堂av在线网| 久久久久99999| 97免费视频在线播放 | 欧美aⅴ在线观看 | 国内精品视频在线播放 | 天堂av免费在线 | 超碰公开在线 | 久久蜜臀一区二区三区av | 久久精品视频免费播放 | 久草色在线观看 | 精品久久久国产 | 国产在线精品区 | 国产精品一区二区久久 | 欧美日韩性视频在线 | 国产品久精国精产拍 | 中文在线免费观看 | 色婷婷激情电影 | 伊人五月 | 亚洲午夜精品在线观看 | 亚洲精品在线观看的 | 色综合久久久久网 | av看片在线观看 | 涩涩在线 | 射久久 | 高潮久久久久久 | 国产麻豆视频免费观看 | 国产伦理剧| 国产超碰在线观看 | 日韩av在线小说 | 日本99热 | av免费黄色 | av中文字幕剧情 | 婷婷激情5月天 | 国产色视频一区二区三区qq号 | 国产成人一区二区啪在线观看 | 在线小视频你懂的 | 日韩综合色 | 久久精品一区二区三区国产主播 | 欧美日韩高清国产 | 国产精品免费小视频 | 岛国大片免费视频 | 日韩精品一区二区三区在线视频 | 国产成人综合在线观看 | 国产一级特黄毛片在线毛片 | 久久少妇| 99爱视频| 国产精品久久嫩一区二区免费 | 亚洲精品三级 | 日韩精品亚洲专区在线观看 | 国产国语在线 | 最近中文字幕mv免费高清在线 | 国产拍揄自揄精品视频麻豆 | 欧美日韩亚洲国产一区 | 在线观看免费av网 | av片在线观看 | 色婷婷伊人 | 国产亚洲人成网站在线观看 | 夜夜操网站 | 精品一区二区在线免费观看 | 亚洲精品白浆高清久久久久久 | 免费看黄网站在线 | 日韩免费视频一区二区 | 日韩免费高清在线观看 | 女人18片毛片90分钟 | 色999五月色| 黄色av三级在线 | 日韩r级在线 | 午夜视频色 | 免费看的黄网站软件 | 97国产在线观看 | 日韩剧情 | 亚洲精品久久久久久久不卡四虎 | 激情视频一区二区 | 玖玖玖影院 | 亚洲电影一区二区 | 久久视频6 | 91精品国自产在线 | 天天干,天天干 | 绯色av一区 | 亚洲高清精品在线 | 欧美日本在线观看视频 | 深爱开心激情 | 精品久久电影 | 久久99热精品 | 成人免费一级片 | 久久激情影院 | 日韩激情网 | 五月婷婷电影网 | 天天躁天天躁天天躁婷 | 久久一线 | 中文字幕在线观看2018 | 九九交易行官网 | 91干干干 | 全久久久久久久久久久电影 | 欧美日韩aaaa | 中文字幕在线观看1 | 日韩激情视频 | 免费在线电影网址大全 | 国产精品久久艹 | 亚洲九九 | 日日日日 | 五月丁香 | 最新日韩视频在线观看 | 在线亚洲免费视频 | 色婷婷成人网 | 视频在线观看一区 | 五月婷婷六月丁香 | 婷婷av色综合 | 91激情视频在线播放 | 久久精品精品电影网 | 天天综合网在线 | 狠狠干夜夜操 | 在线观看网站av | 欧美a级在线播放 | 中文字幕韩在线第一页 | 亚洲精品高清视频在线观看 | 成人wwwxxx视频 | 中文字幕 二区 | 亚洲欧美偷拍另类 | 亚洲五月婷婷 | 免费观看特级毛片 | 人人澡av| 欧美日韩xx | 日韩一级成人av | 亚洲成av人影片在线观看 | 免费成人av网站 | wwwwwww色| 久久 在线| 在线你懂的视频 | 国产精品免费视频久久久 | 国产成人亚洲在线电影 | 日本一区二区三区免费观看 | 国产一区二区高清不卡 | 中国黄色一级大片 | 国产免费片 | 热久久视久久精品18亚洲精品 | www成人精品 | 国产精品福利在线播放 | 91精品天码美女少妇 | 日韩色区 | 中文字幕资源在线 | 成人一区二区在线 | av电影在线播放 | 欧美一区免费观看 | 免费看成年人 | 国产 在线观看 | av福利电影| 五月天亚洲精品 | 91精品在线看 | 毛片永久新网址首页 | 久久免费播放视频 | 久一久久 | 永久免费精品视频网站 | 激情中文在线 | 在线播放一区 | www.久久91 | 国产精品一区二区久久 | 成人国产一区二区 | 久操免费视频 | 日韩欧美成 | 日韩有码专区 | 97色视频在线 | 狠狠色丁香婷婷综合最新地址 | 97国产一区 | 久99久中文字幕在线 | 人人擦 | 亚洲在线精品视频 | japanesefreesex中国少妇 | 国产午夜三级一区二区三 | 最新中文在线视频 | 在线观看中文字幕亚洲 | 精品视频在线观看 | 综合久久婷婷 | 二区在线播放 | 国产免费国产 | 九九热精品视频在线观看 | 97在线视频免费播放 | 日韩中字在线 | 中文字幕在线免费看线人 | 亚洲日日日 | 国产成人在线综合 | 久久九九网站 | 天天爽夜夜爽精品视频婷婷 | 最近日本韩国中文字幕 | 国产高清视频在线播放一区 | 日本精品视频网站 | 超碰在线最新地址 | 国产精品麻豆91 | 最新av免费在线观看 | 五月婷婷综合在线视频 | 91视频在线看 | 久久69av| av免费看av| 99视频久久 | 99久久日韩精品免费热麻豆美女 | 99色在线播放 | 激情久久伊人 | 成人va天堂| 精品久久久久久久久中文字幕 | 探花视频在线观看免费 | 日日干夜夜爱 | 久久久久久久久久久久国产精品 | 亚洲性少妇性猛交wwww乱大交 | 成年人网站免费在线观看 | 久久精品精品电影网 | 91九色蝌蚪 | 天天舔天天搞 | 久草色在线观看 | 色天天综合网 | 成年人在线免费看视频 | 精品欧美一区二区三区久久久 | 永久免费av在线播放 | 欧美日本不卡视频 | 国产精品久久久久久久免费观看 | 久久亚洲影院 | 欧美日韩精品综合 | 中文字幕一区二区三区视频 | 国产精品福利av | 一级免费黄色 | 91av视频在线观看免费 | 在线欧美国产 | 国产精品va在线 | 日韩黄色免费 | 国产精品资源在线 | 五月婷久久| av在线com| 久久久国产高清 | 99国产精品一区二区 | av黄色成人 | 久久久久欧美精品999 | 久久国产精品99久久久久久丝袜 | 国产成人亚洲精品自产在线 | 欧美激情综合五月色丁香 | 麻豆小视频在线观看 | 国产美女视频免费观看的网站 | 国产 成人 久久 | 国产精品久久久久久久久大全 | 色噜噜色噜噜 | av在线影片 | 久久久亚洲精华液 | 最新av在线免费观看 | 日韩精品一区二区在线观看视频 | 久久久九色精品国产一区二区三区 | 中文字幕成人在线观看 | 国产精品一区二区 91 | 久久综合九色欧美综合狠狠 | 久久毛片网 | 久久精品xxx | 国产在线小视频 | 欧美亚洲另类在线视频 | 一区二区三区精品在线视频 | 国产在线播放一区二区三区 | 久久久久国产精品免费网站 | 天堂av观看 | 热久久国产精品 | 中文字幕一区二区三区久久蜜桃 | 免费看片黄色 | 天天爱综合 | 国产 日韩 欧美 中文 在线播放 | 国产高清在线永久 | 手机看片午夜 | 日本中文字幕系列 | 久久激情日本aⅴ | 亚洲 综合 专区 | 日韩免费视频 | 婷婷性综合 | 久久综合精品国产一区二区三区 | 亚洲精品 在线视频 | 国产123区在线观看 国产精品麻豆91 | 中文久久精品 | 免费涩涩网站 | 天天曰天天曰 | www亚洲视频 | 天天天色综合 | 亚洲精品免费在线观看 | 欧美日本日韩aⅴ在线视频 插插插色综合 | 激情电影影院 | 国产精品99久久久久久久久久久久 | 在线免费试看 | 91大神精品视频在线观看 | 免费在线观看成年人视频 | 国精产品999国精产品视频 | 99国产精品久久久久老师 | 超级碰99 | 免费亚洲婷婷 | 日韩成人在线免费观看 | 操操综合 | 天天操天天干天天操天天干 | 欧美日韩久久久 | 久久免费毛片 | 亚洲国产精品久久久久久 | 中文字幕日韩一区二区三区不卡 | 精品国产欧美一区二区三区不卡 | a午夜在线| 99精品视频在线播放观看 | 亚洲精品色视频 | 亚洲美女视频网 | 国产黄色精品在线 | jizz999| 国产一级h | 亚洲人成在线电影 | 欧美国产日韩在线视频 | 97精品欧美91久久久久久 | 天天舔天天搞 | 五月丁香 | 亚洲精品国产成人 | 天天在线免费视频 | 99精品热| 亚洲欧美国产精品久久久久 | 久久久久国产成人精品亚洲午夜 | 色国产视频| 免费在线成人 | wwwwwww黄 | 久久艹艹 | 日韩欧美在线一区 | 久久午夜影院 | 91精品视频一区二区三区 | 国产成人福利片 | 婷婷av电影| 中文字幕888 | 色婷婷亚洲 | 免费在线观看视频一区 | 91看片在线免费观看 | 伊人久久一区 | 久久综合久色欧美综合狠狠 | 欧美男同视频网站 | 狠狠婷婷 | 91精品国产成人观看 | 99精品国产99久久久久久97 | 中文字幕在线有码 | 正在播放国产91 | 青春草免费在线视频 | 欧美另类高潮 | 久久久91精品国产 | 亚洲国产伊人 | 亚洲高清资源 | 日韩亚洲欧美中文字幕 | 欧美国产亚洲精品久久久8v | 五月婷婷激情 | 又黄又爽的免费高潮视频 | 国产午夜一区二区 | 国产精品福利在线观看 | 2019中文字幕第一页 | 69国产盗摄一区二区三区五区 | 少妇视频一区 | 国产免费区 | 日韩网站一区二区 | 色吊丝在线永久观看最新版本 | 日韩精品视频免费专区在线播放 | 免费不卡中文字幕视频 | 国产日韩精品在线观看 | 国产精品va最新国产精品视频 | 五月天.com | 久久香蕉国产 | 四虎影院在线观看av | 不卡av在线免费观看 | 国产1区2区 | 99热最新网址| 日本在线观看中文字幕无线观看 | 国产成人1区| 日日夜夜骑 | 四虎成人精品永久免费av | 免费黄色小网站 | 欧美午夜精品久久久久久孕妇 | 久久综合狠狠综合久久激情 | 91麻豆精品国产91久久久久久久久 | 免费在线观看亚洲视频 | 日产中文字幕 | 国产在线观看h | 97超碰人人爱 | 久草在线网址 | 久久成人午夜 | 欧美日韩国语 | 午夜黄色影院 | 91成人免费| 91精品婷婷国产综合久久蝌蚪 | 欧美日韩国产在线精品 | 久久亚洲私人国产精品 | 午夜精品在线看 | 国产精品精品久久久久久 | 91探花系列在线播放 | 日韩av视屏在线观看 | 国产一级淫片在线观看 | 亚洲国产69 | 亚洲精品视频免费观看 | av电影免费在线看 | 日韩精品高清视频 | 日韩精品一二三 | 黄色亚洲 | 日韩毛片精品 | 欧美成天堂网地址 | 中文字幕色站 | 亚洲国产精品视频在线观看 | 天天操夜| 毛片888 | 81精品国产乱码久久久久久 | 91桃色在线免费观看 | av成人动漫| 人人射 | 四季av综合网站 | 天天色天天射天天干 | 日本巨乳在线 | 免费在线观看日韩视频 | 日韩在线观看一区二区 | 啪啪激情网 | 久久久久国产精品www | 免费一级特黄毛大片 | 婷婷丁香色综合狠狠色 | 免费三级a | 岛国av在线免费 | 国产护士av | 五月天婷亚洲天综合网鲁鲁鲁 | 久草在线高清视频 | 丁香影院在线 | 天天爱天天操天天射 | 最新国产一区二区三区 | 亚洲女同videos| 久久精品视频在线 | 午夜美女av | av片一区二区 | 蜜臀av一区二区 | 亚洲综合色网站 | 亚洲精品一区二区久 | 久久看毛片 | 国产欧美精品一区二区三区四区 | 99精品福利视频 | 日本99热| 国产视频97 | 超碰官网 | 日韩av播放在线 | 久久99久久99| 亚洲女欲精品久久久久久久18 | 国产日韩精品一区二区三区在线 | 91爱爱视频 | 91视频观看免费 | 亚洲精品国产区 | 中文一区二区三区在线观看 | 五月天视频网 | 欧美日韩中文在线观看 | www成人av| 99国产情侣在线播放 | 欧美日韩精品网站 | 国产精品午夜在线 | 国产视频 亚洲视频 | 午夜精品久久久 | 日韩高清在线不卡 | 亚洲欧美色婷婷 | 成年人在线电影 | 天天操天天插 | 日韩欧美一区二区三区视频 | 成人av亚洲 | 天天舔天天射天天操 | 三级黄色欧美 | 久久成人一区二区 | 特级黄色片免费看 | 久久伊人八月婷婷综合激情 | 91综合久久一区二区 | 国产一级一片免费播放放 | 久久伊人精品一区二区三区 | 婷婷av网 | 亚洲国产午夜精品 | 欧美日韩高清国产 | 日韩视频欧美视频 | 一区av在线播放 | 黄色不卡av | 在线免费观看视频一区二区三区 | 91丨九色丨蝌蚪丨对白 | 色狠狠久久av五月综合 | 成人蜜桃网 | 欧美日本中文字幕 | 色综合天天综合 | 欧美精品乱码久久久久久 | 69久久夜色精品国产69 | 久久久久www | 欧美色图视频一区 | 欧美激情精品久久久久久免费印度 | 精品国产成人av在线免 | 伊人va | 成人一区不卡 | 国产视频首页 | 日日爽日日操 | 国产一区二区三区免费在线 | 国产成a人亚洲精v品在线观看 | 五月天天天操 | 国产探花视频在线播放 | 亚洲精品乱码久久久久久蜜桃欧美 | 黄色大片视频网站 | 国产亚洲精品免费 | 香蕉免费 | 99热这里只有精品1 av中文字幕日韩 | 国产精品久久99综合免费观看尤物 | 日本黄色免费观看 | 人人添人人澡人人澡人人人爽 | 99草在线视频 | 国内一区二区视频 | 九九99 | 在线观看亚洲电影 | 在线观看国产一区二区 | 欧美激情综合色综合啪啪五月 | 精品国产99国产精品 | 99久热在线精品视频观看 | 人人舔人人射 | 人人澡超碰碰97碰碰碰软件 | 天天综合中文 | 久久免费成人网 | 在线观看免费国产小视频 | 日韩av在线高清 | 国产a国产a国产a | 国内视频 | 日韩国产高清在线 | 五月婷婷综合久久 | 人九九精品 | 久久久久国产一区二区三区四区 | 婷婷伊人网 | 在线观看免费国产小视频 | 日韩三级免费 | 亚洲精品国产视频 | 久久久久久高潮国产精品视 | 久久精品精品 | 天天天在线综合网 | 国产欧美在线一区 | 婷婷av网 | 狠狠干夜夜操天天爽 | 国产69精品久久99不卡的观看体验 | 中文免费在线观看 | 一区二区在线影院 | 在线观看黄色 | 国产免费精彩视频 | av久久在线| 五月激情丁香图片 | 夜夜澡人模人人添人人看 | 在线国产精品视频 | 99热只有精品在线观看 | 久久人人爽人人爽人人片 | 69av久久| 免费高清在线观看电视网站 | 青青草国产精品 | 日韩美女久久 | 国产精品免费久久久久 | 久草久草久草久草 | 欧美精品在线一区 | 91精品夜夜 | 精品久久久久久久久久久久久久久久久久 | .国产精品成人自产拍在线观看6 | 久久只精品99品免费久23小说 | 亚洲涩涩网 | 久久精品之 | 超碰人人在线观看 | 亚洲激情视频 | 国产精品久久久久久久久搜平片 | 国产精品欧美一区二区三区不卡 | 久久精品久久精品久久 | 天天色天天上天天操 | 中文字幕欧美日韩va免费视频 | 91九色蝌蚪视频网站 | 亚洲精品中文字幕视频 | 怡红院av久久久久久久 | 久久伊人色综合 | 亚洲 欧洲 国产 日本 综合 | 国产精品视频观看 | 四虎www.| 精品福利视频在线 | 亚洲成人一区 | 成人网页在线免费观看 | av中文字幕网| 国产成人精品av在线 | 国产福利不卡视频 | 欧美日韩国产网站 | 久久成熟| 天天操天天操天天操天天操 | 日韩欧美高清 | 久草爱视频 | 国产精品第 | 精品黄色在线 | 97在线成人 | 欧美日韩免费在线视频 | 日韩一级成人av | 色狠狠狠| 99精品在这里 | 91丨九色丨国产在线观看 | 区一区二区三在线观看 | 亚洲成人免费在线 | 狠狠操电影网 | 亚洲成人av在线播放 | 久久免费的视频 | 久久精品国产免费观看 | 成人av在线亚洲 | 日日碰狠狠躁久久躁综合网 | 丝袜+亚洲+另类+欧美+变态 | 亚洲综合爱| 91视频麻豆 | 黄色亚洲大片免费在线观看 | 在线观看av免费 | 69视频永久免费观看 | 国产网红在线观看 | 九九九在线观看 | 精品国产乱码久久 | 在线观看国产中文字幕 | 免费三级黄色 | 久久久香蕉视频 | 久久久久久蜜av免费网站 | 国产视频一区二区在线 | 天天干天天射天天爽 | 97超碰人人澡人人 | 午夜av日韩 | 欧美一级黄色片 | 亚洲成av人片在线观看 | 精品国产美女在线 | www.婷婷色| 精品国产乱码久久久久久三级人 | av电影在线免费观看 | 国产精品久久久久久a | 国产精品18久久久久久首页狼 | 激情五月色播五月 | 精品福利网 | 五月天av在线 | 国产亚洲精品久久久久久 |