On 20/05/2021 21:26, Mark Michelson wrote: > I think this patch could use some ovn-controller tests to ensure that > meters configured in the SB end up being applied to the resulting > controller() actions. > > On 4/29/21 1:04 PM, Lorenzo Bianconi wrote: >> From: Dumitru Ceara <[email protected]> >> >> Add a new 'controller_meter' column to OVN Southbound Logical_Flow >> table. This stores an optional string which should correspond to >> the Meter that must be used for rate limiting controller actions >> generated by packets hitting the flow. >> >> Add a new 'ofctrl_add_flow_metred' function to create a new 'ovn_flow' > > This spelling is odd to me. I think it should be > "ofctrl_add_flow_metered". I was worried when making this suggestion I > was being US-centric with my spelling suggestion, but I think other > variants of English also use the "meter" spelling instead of "metre" > when referring to a regulating tool. Therefore, I think "metered" is > preferred over "metred". > > (Someone from Canada or from east of the Atlantic can correct me if I'm > mistaken here).
Coming from Ireland, I do believe you are wrong .. .. however, we do generally use the U.S.Americanised (notice I did not use a 'z' there) version of 'meter' so I think you are right. > >> with an attached controller meter. >> >> Change ofctrl_check_and_add_flow to allow specifying a meter ID for >> packets that are punted to controller. >> >> Change consider_logical_flow to parse controller_meter from the logical >> flow and use it when building openflow entries. >> >> Add a new 'ctrl_meter_id' field to 'struct ovnact_encode_params' to be >> used when encoding controller actions from logical flow actions. >> >> Co-authored-by: Lorenzo Bianconi <[email protected]> >> Signed-off-by: Lorenzo Bianconi <[email protected]> >> Signed-off-by: Dumitru Ceara <[email protected]> >> --- >> controller/lflow.c | 40 +++++++++++++++++++++++--- >> controller/ofctrl.c | 54 ++++++++++++++++++++++++----------- >> controller/ofctrl.h | 21 ++++++++++---- >> controller/physical.c | 7 +++-- >> include/ovn/actions.h | 2 ++ >> lib/actions.c | 66 +++++++++++++++++++++++-------------------- >> ovn-sb.ovsschema | 6 ++-- >> ovn-sb.xml | 6 ++++ >> 8 files changed, 139 insertions(+), 63 deletions(-) >> >> diff --git a/controller/lflow.c b/controller/lflow.c >> index b8424e1fb..f3f901c32 100644 >> --- a/controller/lflow.c >> +++ b/controller/lflow.c >> @@ -557,6 +557,27 @@ update_conj_id_ofs(uint32_t *conj_id_ofs, uint32_t >> n_conjs) >> return false; >> } >> >> +static void >> +lflow_parse_ctrl_meter(const struct sbrec_logical_flow *lflow, >> + struct ovn_extend_table *meter_table, >> + uint32_t *meter_id) >> +{ >> + ovs_assert(meter_id); >> + *meter_id = NX_CTLR_NO_METER; >> + >> + if (lflow->controller_meter) { >> + *meter_id = ovn_extend_table_assign_id(meter_table, >> + lflow->controller_meter, >> + lflow->header_.uuid); >> + if (*meter_id == EXT_TABLE_ID_INVALID) { >> + static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 1); >> + VLOG_WARN_RL(&rl, "Unable to assign id for meter: %s", >> + lflow->controller_meter); >> + return; >> + } >> + } >> +} >> + >> static void >> add_matches_to_flow_table(const struct sbrec_logical_flow *lflow, >> const struct sbrec_datapath_binding *dp, >> @@ -572,6 +593,13 @@ add_matches_to_flow_table(const struct >> sbrec_logical_flow *lflow, >> .dp = dp, >> }; >> >> + /* Parse any meter to be used if this flow should punt packets to >> + * controller. >> + */ >> + uint32_t ctrl_meter_id = NX_CTLR_NO_METER; >> + lflow_parse_ctrl_meter(lflow, l_ctx_out->meter_table, >> + &ctrl_meter_id); >> + >> /* Encode OVN logical actions into OpenFlow. */ >> uint64_t ofpacts_stub[1024 / 8]; >> struct ofpbuf ofpacts = OFPBUF_STUB_INITIALIZER(ofpacts_stub); >> @@ -595,6 +623,7 @@ add_matches_to_flow_table(const struct >> sbrec_logical_flow *lflow, >> .ct_snat_vip_ptable = OFTABLE_CT_SNAT_FOR_VIP, >> .fdb_ptable = OFTABLE_GET_FDB, >> .fdb_lookup_ptable = OFTABLE_LOOKUP_FDB, >> + .ctrl_meter_id = ctrl_meter_id, >> }; >> ovnacts_encode(ovnacts->data, ovnacts->size, &ep, &ofpacts); >> >> @@ -621,9 +650,11 @@ add_matches_to_flow_table(const struct >> sbrec_logical_flow *lflow, >> } >> } >> if (!m->n) { >> - ofctrl_add_flow(l_ctx_out->flow_table, ptable, lflow->priority, >> - lflow->header_.uuid.parts[0], &m->match, >> &ofpacts, >> - &lflow->header_.uuid); >> + ofctrl_add_flow_metred(l_ctx_out->flow_table, ptable, >> + lflow->priority, >> + lflow->header_.uuid.parts[0], &m->match, >> + &ofpacts, &lflow->header_.uuid, >> + ctrl_meter_id); >> } else { >> uint64_t conj_stubs[64 / 8]; >> struct ofpbuf conj; >> @@ -641,7 +672,8 @@ add_matches_to_flow_table(const struct >> sbrec_logical_flow *lflow, >> >> ofctrl_add_or_append_flow(l_ctx_out->flow_table, ptable, >> lflow->priority, 0, >> - &m->match, &conj, >> &lflow->header_.uuid); >> + &m->match, &conj, >> &lflow->header_.uuid, >> + ctrl_meter_id); >> ofpbuf_uninit(&conj); >> } >> } >> diff --git a/controller/ofctrl.c b/controller/ofctrl.c >> index c29c3d180..575dcd625 100644 >> --- a/controller/ofctrl.c >> +++ b/controller/ofctrl.c >> @@ -66,6 +66,7 @@ struct ovn_flow { >> struct ofpact *ofpacts; >> size_t ofpacts_len; >> uint64_t cookie; >> + uint32_t ctrl_meter_id; /* Meter to be used for controller actions. */ >> }; >> >> /* A desired flow, in struct ovn_desired_flow_table, calculated by the >> @@ -220,7 +221,8 @@ static struct desired_flow *desired_flow_alloc( >> uint16_t priority, >> uint64_t cookie, >> const struct match *match, >> - const struct ofpbuf *actions); >> + const struct ofpbuf *actions, >> + uint32_t meter_id); >> static struct desired_flow *desired_flow_lookup( >> struct ovn_desired_flow_table *, >> const struct ovn_flow *target); >> @@ -1010,8 +1012,9 @@ link_flow_to_sb(struct ovn_desired_flow_table >> *flow_table, >> /* Flow table interfaces to the rest of ovn-controller. */ >> >> /* Adds a flow to 'desired_flows' with the specified 'match' and 'actions' >> to >> - * the OpenFlow table numbered 'table_id' with the given 'priority' and >> - * OpenFlow 'cookie'. The caller retains ownership of 'match' and >> 'actions'. >> + * the OpenFlow table numbered 'table_id' with the given 'priority', >> OpenFlow >> + * 'cookie' and 'meter_id'. The caller retains ownership of 'match' and >> + * 'actions'. >> * >> * The flow is also linked to the sb_uuid that generates it. >> * >> @@ -1020,15 +1023,15 @@ link_flow_to_sb(struct ovn_desired_flow_table >> *flow_table, >> * >> * The caller should initialize its own hmap to hold the flows. */ >> void >> -ofctrl_check_and_add_flow(struct ovn_desired_flow_table *flow_table, >> - uint8_t table_id, uint16_t priority, >> - uint64_t cookie, const struct match *match, >> - const struct ofpbuf *actions, >> - const struct uuid *sb_uuid, >> - bool log_duplicate_flow) >> +ofctrl_check_and_add_flow_metred(struct ovn_desired_flow_table *flow_table, >> + uint8_t table_id, uint16_t priority, >> + uint64_t cookie, const struct match *match, >> + const struct ofpbuf *actions, >> + const struct uuid *sb_uuid, >> + uint32_t meter_id, bool log_duplicate_flow) >> { >> struct desired_flow *f = desired_flow_alloc(table_id, priority, cookie, >> - match, actions); >> + match, actions, meter_id); >> >> if (desired_flow_lookup_check_uuid(flow_table, &f->flow, sb_uuid)) { >> if (log_duplicate_flow) { >> @@ -1056,8 +1059,18 @@ ofctrl_add_flow(struct ovn_desired_flow_table >> *desired_flows, >> const struct match *match, const struct ofpbuf *actions, >> const struct uuid *sb_uuid) >> { >> - ofctrl_check_and_add_flow(desired_flows, table_id, priority, cookie, >> - match, actions, sb_uuid, true); >> + ofctrl_add_flow_metred(desired_flows, table_id, priority, cookie, >> + match, actions, sb_uuid, NX_CTLR_NO_METER); >> +} >> + >> +void >> +ofctrl_add_flow_metred(struct ovn_desired_flow_table *desired_flows, >> + uint8_t table_id, uint16_t priority, uint64_t cookie, >> + const struct match *match, const struct ofpbuf >> *actions, >> + const struct uuid *sb_uuid, uint32_t meter_id) >> +{ >> + ofctrl_check_and_add_flow_metred(desired_flows, table_id, priority, >> cookie, >> + match, actions, sb_uuid, meter_id, >> true); >> } >> >> /* Either add a new flow, or append actions on an existing flow. If the >> @@ -1068,12 +1081,14 @@ ofctrl_add_or_append_flow(struct >> ovn_desired_flow_table *desired_flows, >> uint8_t table_id, uint16_t priority, uint64_t >> cookie, >> const struct match *match, >> const struct ofpbuf *actions, >> - const struct uuid *sb_uuid) >> + const struct uuid *sb_uuid, >> + uint32_t meter_id) >> { >> struct desired_flow *existing; >> struct desired_flow *f; >> >> - f = desired_flow_alloc(table_id, priority, cookie, match, actions); >> + f = desired_flow_alloc(table_id, priority, cookie, match, actions, >> + meter_id); >> existing = desired_flow_lookup_conjunctive(desired_flows, &f->flow); >> if (existing) { >> /* There's already a flow with this particular match and action >> @@ -1278,7 +1293,7 @@ ofctrl_flood_remove_flows(struct >> ovn_desired_flow_table *flow_table, >> static void >> ovn_flow_init(struct ovn_flow *f, uint8_t table_id, uint16_t priority, >> uint64_t cookie, const struct match *match, >> - const struct ofpbuf *actions) >> + const struct ofpbuf *actions, uint32_t meter_id) >> { >> f->table_id = table_id; >> f->priority = priority; >> @@ -1287,11 +1302,13 @@ ovn_flow_init(struct ovn_flow *f, uint8_t table_id, >> uint16_t priority, >> f->ofpacts_len = actions->size; >> f->hash = ovn_flow_match_hash(f); >> f->cookie = cookie; >> + f->ctrl_meter_id = meter_id; >> } >> >> static struct desired_flow * >> desired_flow_alloc(uint8_t table_id, uint16_t priority, uint64_t cookie, >> - const struct match *match, const struct ofpbuf *actions) >> + const struct match *match, const struct ofpbuf *actions, >> + uint32_t meter_id) >> { >> struct desired_flow *f = xmalloc(sizeof *f); >> ovs_list_init(&f->references); >> @@ -1300,7 +1317,8 @@ desired_flow_alloc(uint8_t table_id, uint16_t >> priority, uint64_t cookie, >> ovs_list_init(&f->track_list_node); >> f->installed_flow = NULL; >> f->is_deleted = false; >> - ovn_flow_init(&f->flow, table_id, priority, cookie, match, actions); >> + ovn_flow_init(&f->flow, table_id, priority, cookie, match, actions, >> + meter_id); >> >> return f; >> } >> @@ -1326,6 +1344,7 @@ installed_flow_dup(struct desired_flow *src) >> dst->flow.ofpacts_len = src->flow.ofpacts_len; >> dst->flow.hash = src->flow.hash; >> dst->flow.cookie = src->flow.cookie; >> + dst->flow.ctrl_meter_id = src->flow.ctrl_meter_id; >> return dst; >> } >> >> @@ -1352,6 +1371,7 @@ desired_flow_lookup__(struct ovn_desired_flow_table >> *flow_table, >> struct ovn_flow *f = &d->flow; >> if (f->table_id == target->table_id >> && f->priority == target->priority >> + && f->ctrl_meter_id == target->ctrl_meter_id >> && minimatch_equal(&f->match, &target->match)) { >> >> if (!match_cb || match_cb(d, arg)) { >> diff --git a/controller/ofctrl.h b/controller/ofctrl.h >> index 88769566a..018d781a2 100644 >> --- a/controller/ofctrl.h >> +++ b/controller/ofctrl.h >> @@ -78,7 +78,15 @@ void ofctrl_add_or_append_flow(struct >> ovn_desired_flow_table *desired_flows, >> uint8_t table_id, uint16_t priority, >> uint64_t cookie, const struct match *match, >> const struct ofpbuf *actions, >> - const struct uuid *sb_uuid); >> + const struct uuid *sb_uuid, >> + uint32_t meter_id); >> + >> +void ofctrl_add_flow_metred(struct ovn_desired_flow_table *desired_flows, >> + uint8_t table_id, uint16_t priority, >> + uint64_t cookie, const struct match *match, >> + const struct ofpbuf *actions, >> + const struct uuid *sb_uuid, >> + uint32_t meter_id); >> >> /* Removes a bundles of flows from the flow table for a specific sb_uuid. >> The >> * flows are removed only if they are not referenced by any other >> sb_uuid(s). >> @@ -108,11 +116,12 @@ void ovn_desired_flow_table_init(struct >> ovn_desired_flow_table *); >> void ovn_desired_flow_table_clear(struct ovn_desired_flow_table *); >> void ovn_desired_flow_table_destroy(struct ovn_desired_flow_table *); >> >> -void ofctrl_check_and_add_flow(struct ovn_desired_flow_table *, >> - uint8_t table_id, uint16_t priority, >> - uint64_t cookie, const struct match *, >> - const struct ofpbuf *ofpacts, >> - const struct uuid *, bool >> log_duplicate_flow); >> +void ofctrl_check_and_add_flow_metred(struct ovn_desired_flow_table *, >> + uint8_t table_id, uint16_t priority, >> + uint64_t cookie, const struct match *, >> + const struct ofpbuf *ofpacts, >> + const struct uuid *, uint32_t >> meter_id, >> + bool log_duplicate_flow); >> >> >> bool ofctrl_is_connected(void); >> diff --git a/controller/physical.c b/controller/physical.c >> index 96c959d18..82bf9358a 100644 >> --- a/controller/physical.c >> +++ b/controller/physical.c >> @@ -838,7 +838,7 @@ put_local_common_flows(uint32_t dp_key, uint32_t >> port_key, >> * If a parent port has multiple child ports, then this if >> condition >> * will be hit multiple times, but we want to add only one flow. >> * ofctrl_add_flow() logs a warning message for duplicate flows. >> - * So use the function 'ofctrl_check_and_add_flow' which doesn't >> + * So use the function 'ofctrl_check_and_add_flow_metred' which >> doesn't >> * log a warning. >> * >> * Other option is to add this flow for all the ports which are not >> @@ -857,8 +857,9 @@ put_local_common_flows(uint32_t dp_key, uint32_t >> port_key, >> put_load(ofp_to_u16(OFPP_NONE), MFF_IN_PORT, 0, 16, ofpacts_p); >> put_resubmit(OFTABLE_LOG_TO_PHY, ofpacts_p); >> put_stack(MFF_IN_PORT, ofpact_put_STACK_POP(ofpacts_p)); >> - ofctrl_check_and_add_flow(flow_table, OFTABLE_SAVE_INPORT, 100, 0, >> - &match, ofpacts_p, hc_uuid, false); >> + ofctrl_check_and_add_flow_metred(flow_table, OFTABLE_SAVE_INPORT, >> 100, >> + 0, &match, ofpacts_p, hc_uuid, >> + NX_CTLR_NO_METER, false); >> } >> } >> >> diff --git a/include/ovn/actions.h b/include/ovn/actions.h >> index 040213177..ab03df12c 100644 >> --- a/include/ovn/actions.h >> +++ b/include/ovn/actions.h >> @@ -795,6 +795,8 @@ struct ovnact_encode_params { >> * 'get_fdb' to resubmit. */ >> uint8_t fdb_lookup_ptable; /* OpenFlow table for >> * 'lookup_fdb' to resubmit. */ >> + uint32_t ctrl_meter_id; /* Meter to be used if the resulting flow >> + sends packets to controller. */ >> }; >> >> void ovnacts_encode(const struct ovnact[], size_t ovnacts_len, >> diff --git a/lib/actions.c b/lib/actions.c >> index b3433f49e..155b4a45a 100644 >> --- a/lib/actions.c >> +++ b/lib/actions.c >> @@ -105,10 +105,10 @@ encode_finish_controller_op(size_t ofs, struct ofpbuf >> *ofpacts) >> } >> >> static void >> -encode_controller_op(enum action_opcode opcode, struct ofpbuf *ofpacts) >> +encode_controller_op(enum action_opcode opcode, uint32_t meter_id, >> + struct ofpbuf *ofpacts) >> { >> - size_t ofs = encode_start_controller_op(opcode, false, NX_CTLR_NO_METER, >> - ofpacts); >> + size_t ofs = encode_start_controller_op(opcode, false, meter_id, >> ofpacts); >> encode_finish_controller_op(ofs, ofpacts); >> } >> >> @@ -1647,7 +1647,7 @@ encode_nested_actions(const struct ovnact_nest *on, >> * packet to ARP or NA and then send the packet and actions back to the >> * switch inside an OFPT_PACKET_OUT message. */ >> size_t oc_offset = encode_start_controller_op(opcode, false, >> - NX_CTLR_NO_METER, >> ofpacts); >> + ep->ctrl_meter_id, >> ofpacts); >> ofpacts_put_openflow_actions(inner_ofpacts.data, inner_ofpacts.size, >> ofpacts, OFP15_VERSION); >> encode_finish_controller_op(oc_offset, ofpacts); >> @@ -1698,10 +1698,10 @@ encode_ICMP6_ERROR(const struct ovnact_nest *on, >> >> static void >> encode_IGMP(const struct ovnact_null *a OVS_UNUSED, >> - const struct ovnact_encode_params *ep OVS_UNUSED, >> + const struct ovnact_encode_params *ep, >> struct ofpbuf *ofpacts) >> { >> - encode_controller_op(ACTION_OPCODE_IGMP, ofpacts); >> + encode_controller_op(ACTION_OPCODE_IGMP, ep->ctrl_meter_id, ofpacts); >> } >> >> static void >> @@ -1943,6 +1943,7 @@ format_PUT_ND(const struct ovnact_put_mac_bind >> *put_mac, struct ds *s) >> >> static void >> encode_put_mac(const struct ovnact_put_mac_bind *put_mac, >> + const struct ovnact_encode_params *ep, >> enum mf_field_id ip_field, enum action_opcode opcode, >> struct ofpbuf *ofpacts) >> { >> @@ -1952,24 +1953,24 @@ encode_put_mac(const struct ovnact_put_mac_bind >> *put_mac, >> { expr_resolve_field(&put_mac->mac), MFF_ETH_SRC } >> }; >> encode_setup_args(args, ARRAY_SIZE(args), ofpacts); >> - encode_controller_op(opcode, ofpacts); >> + encode_controller_op(opcode, ep->ctrl_meter_id, ofpacts); >> encode_restore_args(args, ARRAY_SIZE(args), ofpacts); >> } >> >> static void >> encode_PUT_ARP(const struct ovnact_put_mac_bind *put_mac, >> - const struct ovnact_encode_params *ep OVS_UNUSED, >> + const struct ovnact_encode_params *ep, >> struct ofpbuf *ofpacts) >> { >> - encode_put_mac(put_mac, MFF_REG0, ACTION_OPCODE_PUT_ARP, ofpacts); >> + encode_put_mac(put_mac, ep, MFF_REG0, ACTION_OPCODE_PUT_ARP, ofpacts); >> } >> >> static void >> encode_PUT_ND(const struct ovnact_put_mac_bind *put_mac, >> - const struct ovnact_encode_params *ep OVS_UNUSED, >> + const struct ovnact_encode_params *ep, >> struct ofpbuf *ofpacts) >> { >> - encode_put_mac(put_mac, MFF_XXREG0, ACTION_OPCODE_PUT_ND, ofpacts); >> + encode_put_mac(put_mac, ep, MFF_XXREG0, ACTION_OPCODE_PUT_ND, ofpacts); >> } >> >> static void >> @@ -2670,13 +2671,13 @@ encode_put_dhcpv6_option(const struct >> ovnact_gen_option *o, >> >> static void >> encode_PUT_DHCPV4_OPTS(const struct ovnact_put_opts *pdo, >> - const struct ovnact_encode_params *ep OVS_UNUSED, >> + const struct ovnact_encode_params *ep, >> struct ofpbuf *ofpacts) >> { >> struct mf_subfield dst = expr_resolve_field(&pdo->dst); >> >> size_t oc_offset = >> encode_start_controller_op(ACTION_OPCODE_PUT_DHCP_OPTS, >> - true, NX_CTLR_NO_METER, >> + true, ep->ctrl_meter_id, >> ofpacts); >> nx_put_header(ofpacts, dst.field->id, OFP15_VERSION, false); >> ovs_be32 ofs = htonl(dst.ofs); >> @@ -2723,13 +2724,13 @@ encode_PUT_DHCPV4_OPTS(const struct ovnact_put_opts >> *pdo, >> >> static void >> encode_PUT_DHCPV6_OPTS(const struct ovnact_put_opts *pdo, >> - const struct ovnact_encode_params *ep OVS_UNUSED, >> + const struct ovnact_encode_params *ep, >> struct ofpbuf *ofpacts) >> { >> struct mf_subfield dst = expr_resolve_field(&pdo->dst); >> >> size_t oc_offset = encode_start_controller_op( >> - ACTION_OPCODE_PUT_DHCPV6_OPTS, true, NX_CTLR_NO_METER, ofpacts); >> + ACTION_OPCODE_PUT_DHCPV6_OPTS, true, ep->ctrl_meter_id, ofpacts); >> nx_put_header(ofpacts, dst.field->id, OFP15_VERSION, false); >> ovs_be32 ofs = htonl(dst.ofs); >> ofpbuf_put(ofpacts, &ofs, sizeof ofs); >> @@ -2756,10 +2757,11 @@ format_DHCP6_REPLY(const struct ovnact_null *a >> OVS_UNUSED, struct ds *s) >> >> static void >> encode_DHCP6_REPLY(const struct ovnact_null *a OVS_UNUSED, >> - const struct ovnact_encode_params *ep OVS_UNUSED, >> + const struct ovnact_encode_params *ep, >> struct ofpbuf *ofpacts) >> { >> - encode_controller_op(ACTION_OPCODE_DHCP6_SERVER, ofpacts); >> + encode_controller_op(ACTION_OPCODE_DHCP6_SERVER, ep->ctrl_meter_id, >> + ofpacts); >> } >> >> static void >> @@ -2770,10 +2772,11 @@ format_BFD_MSG(const struct ovnact_null *a >> OVS_UNUSED, struct ds *s) >> >> static void >> encode_BFD_MSG(const struct ovnact_null *a OVS_UNUSED, >> - const struct ovnact_encode_params *ep OVS_UNUSED, >> + const struct ovnact_encode_params *ep, >> struct ofpbuf *ofpacts) >> { >> - encode_controller_op(ACTION_OPCODE_BFD_MSG, ofpacts); >> + encode_controller_op(ACTION_OPCODE_BFD_MSG, ep->ctrl_meter_id, >> + ofpacts); >> } >> >> static void >> @@ -2868,13 +2871,13 @@ format_DNS_LOOKUP(const struct ovnact_result *dl, >> struct ds *s) >> >> static void >> encode_DNS_LOOKUP(const struct ovnact_result *dl, >> - const struct ovnact_encode_params *ep OVS_UNUSED, >> + const struct ovnact_encode_params *ep, >> struct ofpbuf *ofpacts) >> { >> struct mf_subfield dst = expr_resolve_field(&dl->dst); >> >> size_t oc_offset = encode_start_controller_op(ACTION_OPCODE_DNS_LOOKUP, >> - true, NX_CTLR_NO_METER, >> + true, ep->ctrl_meter_id, >> ofpacts); >> nx_put_header(ofpacts, dst.field->id, OFP15_VERSION, false); >> ovs_be32 ofs = htonl(dst.ofs); >> @@ -3052,13 +3055,13 @@ encode_put_nd_ra_option(const struct >> ovnact_gen_option *o, >> >> static void >> encode_PUT_ND_RA_OPTS(const struct ovnact_put_opts *po, >> - const struct ovnact_encode_params *ep OVS_UNUSED, >> + const struct ovnact_encode_params *ep, >> struct ofpbuf *ofpacts) >> { >> struct mf_subfield dst = expr_resolve_field(&po->dst); >> >> size_t oc_offset = encode_start_controller_op( >> - ACTION_OPCODE_PUT_ND_RA_OPTS, true, NX_CTLR_NO_METER, ofpacts); >> + ACTION_OPCODE_PUT_ND_RA_OPTS, true, ep->ctrl_meter_id, ofpacts); >> nx_put_header(ofpacts, dst.field->id, OFP15_VERSION, false); >> ovs_be32 ofs = htonl(dst.ofs); >> ofpbuf_put(ofpacts, &ofs, sizeof ofs); >> @@ -3341,7 +3344,7 @@ format_OVNFIELD_LOAD(const struct ovnact_load *load , >> struct ds *s) >> >> static void >> encode_OVNFIELD_LOAD(const struct ovnact_load *load, >> - const struct ovnact_encode_params *ep OVS_UNUSED, >> + const struct ovnact_encode_params *ep, >> struct ofpbuf *ofpacts) >> { >> const struct ovn_field *f = >> ovn_field_from_name(load->dst.symbol->name); >> @@ -3349,7 +3352,7 @@ encode_OVNFIELD_LOAD(const struct ovnact_load *load, >> case OVN_ICMP4_FRAG_MTU: { >> size_t oc_offset = encode_start_controller_op( >> ACTION_OPCODE_PUT_ICMP4_FRAG_MTU, true, >> - NX_CTLR_NO_METER, ofpacts); >> + ep->ctrl_meter_id, ofpacts); >> ofpbuf_put(ofpacts, &load->imm.value.be16_int, sizeof(ovs_be16)); >> encode_finish_controller_op(oc_offset, ofpacts); >> break; >> @@ -3357,7 +3360,7 @@ encode_OVNFIELD_LOAD(const struct ovnact_load *load, >> case OVN_ICMP6_FRAG_MTU: { >> size_t oc_offset = encode_start_controller_op( >> ACTION_OPCODE_PUT_ICMP6_FRAG_MTU, true, >> - NX_CTLR_NO_METER, ofpacts); >> + ep->ctrl_meter_id, ofpacts); >> ofpbuf_put(ofpacts, &load->imm.value.be32_int, sizeof(ovs_be32)); >> encode_finish_controller_op(oc_offset, ofpacts); >> break; >> @@ -3461,7 +3464,7 @@ encode_BIND_VPORT(const struct ovnact_bind_vport *vp, >> }; >> encode_setup_args(args, ARRAY_SIZE(args), ofpacts); >> size_t oc_offset = encode_start_controller_op(ACTION_OPCODE_BIND_VPORT, >> - false, NX_CTLR_NO_METER, >> + false, ep->ctrl_meter_id, >> ofpacts); >> ovs_be32 vp_key = htonl(vport_key); >> ofpbuf_put(ofpacts, &vp_key, sizeof(ovs_be32)); >> @@ -3499,14 +3502,15 @@ format_HANDLE_SVC_CHECK(const struct >> ovnact_handle_svc_check *svc_chk, >> >> static void >> encode_HANDLE_SVC_CHECK(const struct ovnact_handle_svc_check *svc_chk, >> - const struct ovnact_encode_params *ep OVS_UNUSED, >> + const struct ovnact_encode_params *ep, >> struct ofpbuf *ofpacts) >> { >> const struct arg args[] = { >> { expr_resolve_field(&svc_chk->port), MFF_LOG_INPORT }, >> }; >> encode_setup_args(args, ARRAY_SIZE(args), ofpacts); >> - encode_controller_op(ACTION_OPCODE_HANDLE_SVC_CHECK, ofpacts); >> + encode_controller_op(ACTION_OPCODE_HANDLE_SVC_CHECK, ep->ctrl_meter_id, >> + ofpacts); >> encode_restore_args(args, ARRAY_SIZE(args), ofpacts); >> } >> >> @@ -3755,7 +3759,7 @@ format_PUT_FDB(const struct ovnact_put_fdb *put_fdb, >> struct ds *s) >> >> static void >> encode_PUT_FDB(const struct ovnact_put_fdb *put_fdb, >> - const struct ovnact_encode_params *ep OVS_UNUSED, >> + const struct ovnact_encode_params *ep, >> struct ofpbuf *ofpacts) >> { >> const struct arg args[] = { >> @@ -3763,7 +3767,7 @@ encode_PUT_FDB(const struct ovnact_put_fdb *put_fdb, >> { expr_resolve_field(&put_fdb->mac), MFF_ETH_SRC } >> }; >> encode_setup_args(args, ARRAY_SIZE(args), ofpacts); >> - encode_controller_op(ACTION_OPCODE_PUT_FDB, ofpacts); >> + encode_controller_op(ACTION_OPCODE_PUT_FDB, ep->ctrl_meter_id, ofpacts); >> encode_restore_args(args, ARRAY_SIZE(args), ofpacts); >> } >> >> diff --git a/ovn-sb.ovsschema b/ovn-sb.ovsschema >> index 205a30a37..609699475 100644 >> --- a/ovn-sb.ovsschema >> +++ b/ovn-sb.ovsschema >> @@ -1,7 +1,7 @@ >> { >> "name": "OVN_Southbound", >> - "version": "20.17.0", >> - "cksum": "669123379 26536", >> + "version": "20.18.0", >> + "cksum": "3870294693 26668", >> "tables": { >> "SB_Global": { >> "columns": { >> @@ -109,6 +109,8 @@ >> "maxInteger": 65535}}}, >> "match": {"type": "string"}, >> "actions": {"type": "string"}, >> + "controller_meter": {"type": {"key": {"type": "string"}, >> + "min": 0, "max": 1}}, >> "external_ids": { >> "type": {"key": "string", "value": "string", >> "min": 0, "max": "unlimited"}}}, >> diff --git a/ovn-sb.xml b/ovn-sb.xml >> index 258a12b4e..57c522db3 100644 >> --- a/ovn-sb.xml >> +++ b/ovn-sb.xml >> @@ -2441,6 +2441,12 @@ tcp.flags = RST; >> </dl> >> </column> >> >> + <column name="controller_meter"> >> + The name of the meter in table <ref table="Meter"/> to be used for >> + all packets that the logical flow might send to >> + <code>ovn-controller</code>. >> + </column> >> + >> <column name="external_ids" key="stage-name"> >> Human-readable name for this flow's stage in the pipeline. >> </column> >> > > _______________________________________________ > dev mailing list > [email protected] > https://mail.openvswitch.org/mailman/listinfo/ovs-dev > _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
