The action used for multiple split buffer scenario, when the
action wouldn't fit into the netlink buffer, can be used in
different context than just the multicast groups. Change the
naming and add generic helper so it is clearer that is indeed
the case.

Acked-by: Lorenzo Bianconi <lorenzo.bianc...@redhat.com>
Signed-off-by: Ales Musil <amu...@redhat.com>
---
v3: Rebase on top of latest main.
v3: Rebase on top of latest main.
    Add ack from Lorenzo.
---
 controller/physical.c | 36 ++++++++++++++++++++++--------------
 controller/pinctrl.c  | 21 +++++++++++----------
 include/ovn/actions.h |  4 ++--
 lib/actions.c         |  2 +-
 4 files changed, 36 insertions(+), 27 deletions(-)

diff --git a/controller/physical.c b/controller/physical.c
index 592af5303..bbc97ee30 100644
--- a/controller/physical.c
+++ b/controller/physical.c
@@ -193,6 +193,27 @@ put_stack(enum mf_field_id field, struct ofpact_stack 
*stack)
     stack->subfield.n_bits = stack->subfield.field->n_bits;
 }
 
+/* Split the ofpacts buffer to prevent overflow of the
+ * MAX_ACTIONS_BUFSIZE netlink buffer size supported by the kernel.
+ * In order to avoid all the action buffers to be squashed together by
+ * ovs, add a controller action for each configured openflow.
+ */
+static void
+put_split_buf_function(uint32_t index, uint32_t outport, uint8_t stage,
+                       struct ofpbuf *ofpacts)
+{
+    ovs_be32 values[2] = {
+        htonl(index),
+        htonl(outport)
+    };
+    size_t oc_offset =
+           encode_start_controller_op(ACTION_OPCODE_SPLIT_BUF_ACTION, false,
+                                      NX_CTLR_NO_METER, ofpacts);
+    ofpbuf_put(ofpacts, values, sizeof values);
+    ofpbuf_put(ofpacts, &stage, sizeof stage);
+    encode_finish_controller_op(oc_offset, ofpacts);
+}
+
 static const struct sbrec_port_binding *
 get_localnet_port(const struct hmap *local_datapaths, int64_t tunnel_key)
 {
@@ -2106,20 +2127,7 @@ mc_ofctrl_add_flow(const struct sbrec_multicast_group 
*mc,
     if (index == (mc->n_ports - 1)) {
         ofpbuf_put(ofpacts, ofpacts_last->data, ofpacts_last->size);
     } else {
-        /* Split multicast groups with size greater than
-         * MC_OFPACTS_MAX_MSG_SIZE in order to not overcome the
-         * MAX_ACTIONS_BUFSIZE netlink buffer size supported by the kernel.
-         * In order to avoid all the action buffers to be squashed together by
-         * ovs, add a controller action for each configured openflow.
-         */
-        size_t oc_offset = encode_start_controller_op(
-                ACTION_OPCODE_MG_SPLIT_BUF, false, NX_CTLR_NO_METER, ofpacts);
-        ovs_be32 val = htonl(++flow_index);
-        ofpbuf_put(ofpacts, &val, sizeof val);
-        val = htonl(mc->tunnel_key);
-        ofpbuf_put(ofpacts, &val, sizeof val);
-        ofpbuf_put(ofpacts, &stage, sizeof stage);
-        encode_finish_controller_op(oc_offset, ofpacts);
+        put_split_buf_function(++flow_index, mc->tunnel_key, stage, ofpacts);
     }
 
     ofctrl_add_flow(flow_table, stage, prio, mc->header_.uuid.parts[0],
diff --git a/controller/pinctrl.c b/controller/pinctrl.c
index e97952f2e..868cafa2c 100644
--- a/controller/pinctrl.c
+++ b/controller/pinctrl.c
@@ -213,7 +213,7 @@ static void send_mac_binding_buffered_pkts(struct rconn 
*swconn)
 
 static void pinctrl_rarp_activation_strategy_handler(const struct match *md);
 
-static void pinctrl_mg_split_buff_handler(
+static void pinctrl_split_buf_action_handler(
         struct rconn *swconn, struct dp_packet *pkt,
         const struct match *md, struct ofpbuf *userdata);
 
@@ -3808,9 +3808,9 @@ process_packet_in(struct rconn *swconn, const struct 
ofp_header *msg)
         ovs_mutex_unlock(&pinctrl_mutex);
         break;
 
-    case ACTION_OPCODE_MG_SPLIT_BUF:
-        pinctrl_mg_split_buff_handler(swconn, &packet, &pin.flow_metadata,
-                                      &userdata);
+    case ACTION_OPCODE_SPLIT_BUF_ACTION:
+        pinctrl_split_buf_action_handler(swconn, &packet, &pin.flow_metadata,
+                                         &userdata);
         break;
 
     default:
@@ -9033,8 +9033,9 @@ pinctrl_rarp_activation_strategy_handler(const struct 
match *md)
 }
 
 static void
-pinctrl_mg_split_buff_handler(struct rconn *swconn, struct dp_packet *pkt,
-                              const struct match *md, struct ofpbuf *userdata)
+pinctrl_split_buf_action_handler(struct rconn *swconn, struct dp_packet *pkt,
+                                 const struct match *md,
+                                 struct ofpbuf *userdata)
 {
     ovs_be32 *index = ofpbuf_try_pull(userdata, sizeof *index);
     if (!index) {
@@ -9043,10 +9044,10 @@ pinctrl_mg_split_buff_handler(struct rconn *swconn, 
struct dp_packet *pkt,
         return;
     }
 
-    ovs_be32 *mg = ofpbuf_try_pull(userdata, sizeof *mg);
-    if (!mg) {
+    ovs_be32 *outport = ofpbuf_try_pull(userdata, sizeof *outport);
+    if (!outport) {
         static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5);
-        VLOG_WARN_RL(&rl, "%s: missing multicast group field", __func__);
+        VLOG_WARN_RL(&rl, "%s: missing outport tunnel_key field", __func__);
         return;
     }
 
@@ -9068,7 +9069,7 @@ pinctrl_mg_split_buff_handler(struct rconn *swconn, 
struct dp_packet *pkt,
     ofpact_put_set_field(&ofpacts, pkt_mark_field, &pkt_mark_value, NULL);
 
     put_load(ntohl(*index), MFF_REG6, 0, 32, &ofpacts);
-    put_load(ntohl(*mg), MFF_LOG_OUTPORT, 0, 32, &ofpacts);
+    put_load(ntohl(*outport), MFF_LOG_OUTPORT, 0, 32, &ofpacts);
 
     struct ofpact_resubmit *resubmit = ofpact_put_RESUBMIT(&ofpacts);
     resubmit->in_port = OFPP_CONTROLLER;
diff --git a/include/ovn/actions.h b/include/ovn/actions.h
index db7342f1d..7e0670a11 100644
--- a/include/ovn/actions.h
+++ b/include/ovn/actions.h
@@ -783,8 +783,8 @@ enum action_opcode {
     /* activation_strategy_rarp() */
     ACTION_OPCODE_ACTIVATION_STRATEGY_RARP,
 
-    /* multicast group split buffer action. */
-    ACTION_OPCODE_MG_SPLIT_BUF,
+    /* split buffer action. */
+    ACTION_OPCODE_SPLIT_BUF_ACTION,
 
     /* "dhcp_relay_req_chk(relay_ip, server_ip)".
      *
diff --git a/lib/actions.c b/lib/actions.c
index 62e73b2c5..388846eff 100644
--- a/lib/actions.c
+++ b/lib/actions.c
@@ -1968,7 +1968,7 @@ is_paused_nested_action(enum action_opcode opcode)
     case ACTION_OPCODE_HANDLE_SVC_CHECK:
     case ACTION_OPCODE_BFD_MSG:
     case ACTION_OPCODE_ACTIVATION_STRATEGY_RARP:
-    case ACTION_OPCODE_MG_SPLIT_BUF:
+    case ACTION_OPCODE_SPLIT_BUF_ACTION:
     case ACTION_OPCODE_DHCP_RELAY_REQ_CHK:
     case ACTION_OPCODE_DHCP_RELAY_RESP_CHK:
     default:
-- 
2.48.1

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to