Hi all,

As follows, I want to send an OFPFlowMod message, which has an action
to copy lower 12 bits tunnel_id into vlan_vid (On OVS, which is
equivalent to"move:NXM_NX_TUN_ID[0..11]->NXM_OF_VLAN_TCI[0..11]" ).

But in case of NXActionRegMove,  OFPET_BAD_ACTION
(OFPBAC_BAD_EXP_TYPE) error occurs.
In case of OFPActionCopyField, OFPET_BAD_ACTION (OFPBAC_BAD_LEN) error occurs.
Is there a way to do " move:src[start..end]->dst[start..end]" on Ryu
application ?

Ryu version: 3.26

#### ovs add-br command
$ sudo ovs-vsctl --may-exist add-br testbr0 \
-- set bridge testbr0 protocols=OpenFlow15 fail-mode=secure \
-- set-controller testbr0 tcp:127.0.0.1:6633


##### test application source code ####
import functools
from ryu.base import app_manager
from ryu.controller import ofp_event
from ryu.controller import handler
from ryu.ofproto import ofproto_v1_5

OVS_IN_PORT = 0xfff8

class TestApp(app_manager.RyuApp):

    OFP_VERSIONS = [ofproto_v1_5.OFP_VERSION]

    @handler.set_ev_cls(
        ofp_event.EventOFPSwitchFeatures,
        handler.CONFIG_DISPATCHER,
    )
    def handle_ovs_switch_features(self, event):
        datapath = event.msg.datapath
        ofproto = datapath.ofproto
        ofparser = datapath.ofproto_parser
        flow_mod_factory = functools.partial(
            ofparser.OFPFlowMod,
            datapath=datapath,
            # cookie=0xf00,
            command=ofproto.OFPFC_ADD,
        )
        apply_actions_factory = functools.partial(
            ofparser.OFPInstructionActions,
            type_=ofproto.OFPIT_APPLY_ACTIONS,
        )

        datapath.send_msg(
            flow_mod_factory(
                table_id=0,
                priority=100,
                match=ofparser.OFPMatch(
                    tunnel_id=(1 << 12, 0xfff << 12),
                ),
                instructions=[
                    apply_actions_factory(actions=[
                        ofparser.OFPActionPushVlan(),
                        ofparser.OFPActionSetField(
                            vlan_pcp=1,
                        ),
                        ofparser.NXActionRegMove(
                            src_field='tunnel_id', src_ofs=0,
                            dst_field='vlan_vid', dst_ofs=0,
                            n_bits=12,
                        ),
                        # ofparser.OFPActionCopyField(
                        #     n_bits=12,
                        #     src_offset=0,
                        #     dst_offset=0,
                        #     oxm_ids=[
                        #         ofparser.OFPOxmId('tunnel_id'),
                        #         ofparser.OFPOxmId('vlan_vid'),
                        #     ]
                        # ),
                        ofparser.NXActionResubmitTable(
                            in_port=OVS_IN_PORT,
                            table_id=20,
                        ),
                    ]),
                ],
            ),
        )
        return


#### error message (in case of NXActionRegMove)
# ryu-manager --verbose testmanager
loading app testmanager
loading app ryu.controller.ofp_handler
instantiating app testmanager of TestApp
instantiating app ryu.controller.ofp_handler of OFPHandler
BRICK TestApp
  CONSUMES EventOFPSwitchFeatures
BRICK ofp_event
  PROVIDES EventOFPSwitchFeatures TO {'TestApp': {'config'}}
  CONSUMES EventOFPSwitchFeatures
  CONSUMES EventOFPPortDescStatsReply
  CONSUMES EventOFPEchoRequest
  CONSUMES EventOFPErrorMsg
  CONSUMES EventOFPHello
connected socket:<eventlet.greenio.base.GreenSocket object at
0x7f911f9dd2b0> address:('127.0.0.1', 56714)
hello ev <ryu.controller.ofp_event.EventOFPHello object at 0x7f911f9e6d68>
move onto config mode
EVENT ofp_event->TestApp EventOFPSwitchFeatures
switch features ev
version=0x6,msg_type=0x6,msg_len=0x20,xid=0xd2da111d,OFPSwitchFeatures(auxiliary_id=0,capabilities=79,datapath_id=183359575435075,n_buffers=256,n_tables=254)
EventOFPErrorMsg received.
version=0x6, msg_type=0x1, msg_len=0x24, xid=0xd2da111f
 `-- msg_type: OFPT_ERROR(1)
OFPErrorMsg(type=0x1, code=0x6,
data=b'\x06\x12\x00\x18\xd2\xda\x11\x1f\x00\x0d\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00')
 |-- type: OFPET_BAD_REQUEST(1)
 |-- code: OFPBRC_BAD_LEN(6)
 `-- data: version=0x6, msg_type=0x12, msg_len=0x18, xid=0xd2da111f
     `-- msg_type: OFPT_MULTIPART_REQUEST(18)
EventOFPErrorMsg received.
version=0x6, msg_type=0x1, msg_len=0x4c, xid=0xd2da1120
 `-- msg_type: OFPT_ERROR(1)
OFPErrorMsg(type=0x2, code=0x3,
data=b'\x06\x0e\x00\x90\xd2\xda\x11\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x18\x80\x00\x4d\x10\x00\x00\x00\x00\x00\x00\x10\x00')
 |-- type: OFPET_BAD_ACTION(2)
 |-- code: OFPBAC_BAD_EXP_TYPE(3)
 `-- data: version=0x6, msg_type=0xe, msg_len=0x90, xid=0xd2da1120
     `-- msg_type: OFPT_FLOW_MOD(14)


#### error message (in case of OFPActionCopyField)
# ryu-manager --verbose testmanager
loading app testmanager
loading app ryu.controller.ofp_handler
instantiating app ryu.controller.ofp_handler of OFPHandler
instantiating app testmanager of TestApp
BRICK ofp_event
  PROVIDES EventOFPSwitchFeatures TO {'TestApp': {'config'}}
  CONSUMES EventOFPHello
  CONSUMES EventOFPSwitchFeatures
  CONSUMES EventOFPPortDescStatsReply
  CONSUMES EventOFPEchoRequest
  CONSUMES EventOFPErrorMsg
BRICK TestApp
  CONSUMES EventOFPSwitchFeatures
connected socket:<eventlet.greenio.base.GreenSocket object at
0x7f1a38512278> address:('127.0.0.1', 56730)
hello ev <ryu.controller.ofp_event.EventOFPHello object at 0x7f1a3851fd68>
move onto config mode
EVENT ofp_event->TestApp EventOFPSwitchFeatures
switch features ev
version=0x6,msg_type=0x6,msg_len=0x20,xid=0xb8fb0c3c,OFPSwitchFeatures(auxiliary_id=0,capabilities=79,datapath_id=121704233743943,n_buffers=256,n_tables=254)
EventOFPErrorMsg received.
version=0x6, msg_type=0x1, msg_len=0x24, xid=0xb8fb0c3e
 `-- msg_type: OFPT_ERROR(1)
OFPErrorMsg(type=0x1, code=0x6,
data=b'\x06\x12\x00\x18\xb8\xfb\x0c\x3e\x00\x0d\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00')
 |-- type: OFPET_BAD_REQUEST(1)
 |-- code: OFPBRC_BAD_LEN(6)
 `-- data: version=0x6, msg_type=0x12, msg_len=0x18, xid=0xb8fb0c3e
     `-- msg_type: OFPT_MULTIPART_REQUEST(18)
EventOFPErrorMsg received.
version=0x6, msg_type=0x1, msg_len=0x4c, xid=0xb8fb0c3f
 `-- msg_type: OFPT_ERROR(1)
OFPErrorMsg(type=0x2, code=0x1,
data=b'\x06\x0e\x00\x88\xb8\xfb\x0c\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x18\x80\x00\x4d\x10\x00\x00\x00\x00\x00\x00\x10\x00')
 |-- type: OFPET_BAD_ACTION(2)
 |-- code: OFPBAC_BAD_LEN(1)
 `-- data: version=0x6, msg_type=0xe, msg_len=0x88, xid=0xb8fb0c3f
     `-- msg_type: OFPT_FLOW_MOD(14)

------------------------------------------------------------------------------
_______________________________________________
Ryu-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ryu-devel

Reply via email to