On Wed, Jan 9, 2013 at 7:00 AM, Henkel, Michael <michael.hen...@hp.com> wrote:
> 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).

I think you haven't enabled the extension.  You must first send the
NXT_FLOW_MOD_TABLE_ID command to turn it on and then encode the table
ID in the flow mod.
_______________________________________________
discuss mailing list
discuss@openvswitch.org
http://openvswitch.org/mailman/listinfo/discuss

Reply via email to