Hi list,
I'm trying to figure out on how to place a flow into a specific table using a
pox extension. I can easily place flows into standard tables using the
following (python) code:
def create_flow_install_msg(ip, table, mask, srcMac, dstMac, dstPort):
ofm = ofp_flow_mod()
ofm_match_dl(ofm, OFPFW_DL_TYPE, 0x0800)
if (MATCH_L2):
ofm_match_dl(ofm, OFPFW_DL_DST, srcMac)
ofm.match.set_nw_dst(ip)
ofm.priority = OFP_DEFAULT_PRIORITY + mask
ofm.command = 1 #(OFPFC_ADD)
if (mask == 32):
ofm.idle_timeout = 300
else:
ofm.idle_timeout = OFP_FLOW_PERMANENT
ofm.hard_timeout = OFP_FLOW_PERMANENT
ofm.out_port = OFPP_NONE
ofm.actions.append(ofp_action_dl_addr(type=OFPAT_SET_DL_SRC,
dl_addr=EthAddr(srcMac)))
ofm.actions.append(ofp_action_dl_addr(type=OFPAT_SET_DL_DST,
dl_addr=EthAddr(dstMac)))
#ofm.actions.append(ofp_action_tp_port(type=OFPAT_SET_TP_DST,
tp_port=20005))
ofm.actions.append(ofp_action_output(port=dstPort))
return ofm
Now I'm trying to understand how the Nicira extension of openvswitch can be
enabled. I've read through the following:
/* This command enables or disables an Open vSwitch extension that allows a
* controller to specify the OpenFlow table to which a flow should be added,
* instead of having the switch decide which table is most appropriate as
* required by OpenFlow 1.0. By default, the extension is disabled.
*
* When this feature is enabled, Open vSwitch treats struct ofp_flow_mod's
* 16-bit 'command' member as two separate fields. The upper 8 bits are used
* as the table ID, the lower 8 bits specify the command as usual. A table ID
* of 0xff is treated like a wildcarded table ID.
*
* The specific treatment of the table ID depends on the type of flow mod:
*
* - OFPFC_ADD: Given a specific table ID, the flow is always placed in that
* table. If an identical flow already exists in that table only, then it
* is replaced. If the flow cannot be placed in the specified table,
* either because the table is full or because the table cannot support
* flows of the given type, the switch replies with an
* OFPFMFC_ALL_TABLES_FULL error. (A controller can distinguish these
* cases by comparing the current and maximum number of entries reported
* in ofp_table_stats.)
*
* If the table ID is wildcarded, the switch picks an appropriate table
* itself. If an identical flow already exist in the selected flow table,
* then it is replaced. The choice of table might depend on the flows
* that are already in th switch; for example, if one table fills up then
* the switch might fall back to another one.
*
* - OFPFC_MODIFY, OFPFC_DELETE: Given a specific table ID, only flows
* within that table are matched and modified or deleted. If the table ID
* is wildcarded, flows within any table may be matched and modified or
* deleted.
*
* - OFPFC_MODIFY_STRICT, OFPFC_DELETE_STRICT: Given a specific table ID,
* only a flow within that table may be matched and modified or deleted.
* If the table ID is wildcarded and exactly one flow within any table
* matches, then it is modified or deleted; if flows in more than one
* table match, then none is modified or deleted.
*/
struct nxt_flow_mod_table_id {
struct ofp_header header;
uint32_t vendor; /* NX_VENDOR_ID. */
uint32_t subtype; /* NXT_FLOW_MOD_TABLE_ID. */
uint8_t set; /* Nonzero to enable, zero to disable. */
uint8_t pad[7];
};
commands are represented by 16 bit integers (0 - OFPFC_ADD; 1 - OFPFC_MODIFY
...).
In order to add a flow into table 1 I changed the command 16 bit int from 0 to
256 (0000 0001 0000 0000). So the upper 8 bit specify the table 1, the lower 8
bit the command (0 = ADD).
When snooping the bridge I'm getting the following output:
Jan 06 22:54:16|00049|ofp_util|INFO|normalization changed ofp_match, details:
Jan 06 22:54:16|00050|ofp_util|INFO| pre:
priority=32772,ip,dl_dst=a1:a1:a1:a1:a1:a1,nw_dst=240.0.0.0/4,tp_src=0,tp_dst=0
Jan 06 22:54:16|00051|ofp_util|INFO|post:
priority=32772,ip,dl_dst=a1:a1:a1:a1:a1:a1,nw_dst=240.0.0.0/4
OFPT_FLOW_MOD (xid=0x15): ADD table:1
priority=32772,ip,dl_dst=a1:a1:a1:a1:a1:a1,nw_dst=240.0.0.0/4
actions=mod_dl_src:a1:a1:a1:a1:a1:a1,mod_dl_dst:a2:a2:a2:a2:a2:a2,output:6
OFPT_ERROR (xid=0x15): type OFPET_FLOW_MOD_FAILED, code OFPFMFC_BAD_COMMAND
(***truncated to 64 bytes from 112***)
00000000 01 0e 00 70 00 00 00 15-00 37 20 27 00 00 00 00 |...p.....7 '....|
00000010 00 00 00 00 a1 a1 a1 a1-a1 a1 00 00 00 00 08 00 |................|
00000020 00 00 00 00 00 00 00 00-ff ff ff 00 00 00 00 00 |................|
00000030 00 00 00 00 00 00 00 00-01 00 00 00 00 00 80 04 |................|
The command is correctly identified as well as the table but I am still getting
an OFPFMFC_BAD_COMMAND code.
Any thoughts? I'm running a stock openvswitch 1.4.0 with OF 1.0.
Using the ofctl works without any issues.
Thanks,
Michael
_______________________________________________
discuss mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/discuss