Beispiel #1
0
/* Parses 'string' as an OFPT_FLOW_MOD or NXT_FLOW_MOD with command 'command'
 * (one of OFPFC_*) and appends the parsed OpenFlow message to 'packets'.
 * '*cur_format' should initially contain the flow format currently configured
 * on the connection; this function will add a message to change the flow
 * format and update '*cur_format', if this is necessary to add the parsed
 * flow. */
void
parse_ofp_flow_mod_str(struct list *packets, enum nx_flow_format *cur_format,
                       char *string, uint16_t command)
{
    bool is_del = command == OFPFC_DELETE || command == OFPFC_DELETE_STRICT;
    enum nx_flow_format min_format, next_format;
    struct ofpbuf actions;
    struct ofpbuf *ofm;
    struct flow_mod fm;

    ofpbuf_init(&actions, 64);
    parse_ofp_str(&fm, NULL, is_del ? NULL : &actions, string);
    fm.command = command;

    min_format = ofputil_min_flow_format(&fm.cr, true, fm.cookie);
    next_format = MAX(*cur_format, min_format);
    if (next_format != *cur_format) {
        struct ofpbuf *sff = ofputil_make_set_flow_format(next_format);
        list_push_back(packets, &sff->list_node);
        *cur_format = next_format;
    }

    ofm = ofputil_encode_flow_mod(&fm, *cur_format);
    list_push_back(packets, &ofm->list_node);

    ofpbuf_uninit(&actions);
}
Beispiel #2
0
/* Parses 'string' as an OFPT_FLOW_MOD or NXT_FLOW_MOD with command 'command'
 * (one of OFPFC_*) and appends the parsed OpenFlow message to 'packets'.
 * '*cur_format' should initially contain the flow format currently configured
 * on the connection; this function will add a message to change the flow
 * format and update '*cur_format', if this is necessary to add the parsed
 * flow. */
void
parse_ofp_flow_mod_str(struct list *packets, enum nx_flow_format *cur_format,
                       bool *flow_mod_table_id, char *string, uint16_t command,
                       bool verbose)
{
    enum nx_flow_format min_format, next_format;
    struct cls_rule rule_copy;
    struct ofpbuf *ofm;
    struct ofputil_flow_mod fm;

    parse_ofp_str(&fm, command, string, verbose);

    min_format = ofputil_min_flow_format(&fm.cr);
    if (command != OFPFC_ADD && fm.cookie_mask != htonll(0)) {
        min_format = NXFF_NXM;
    }
    next_format = MAX(*cur_format, min_format);
    if (next_format != *cur_format) {
        struct ofpbuf *sff = ofputil_make_set_flow_format(next_format);
        list_push_back(packets, &sff->list_node);
        *cur_format = next_format;
    }

    /* Normalize a copy of the rule.  This ensures that non-normalized flows
     * get logged but doesn't affect what gets sent to the switch, so that the
     * switch can do whatever it likes with the flow. */
    rule_copy = fm.cr;
    ofputil_normalize_rule(&rule_copy, next_format);

    if (fm.table_id != 0xff && !*flow_mod_table_id) {
        struct ofpbuf *sff = ofputil_make_flow_mod_table_id(true);
        list_push_back(packets, &sff->list_node);
        *flow_mod_table_id = true;
    }

    ofm = ofputil_encode_flow_mod(&fm, *cur_format, *flow_mod_table_id);
    list_push_back(packets, &ofm->list_node);
}