bpf: move flow prio/bulk detection config into a separate data structure
authorFelix Fietkau <nbd@nbd.name>
Tue, 16 Nov 2021 16:23:22 +0000 (17:23 +0100)
committerFelix Fietkau <nbd@nbd.name>
Tue, 16 Nov 2021 16:23:22 +0000 (17:23 +0100)
Signed-off-by: Felix Fietkau <nbd@nbd.name>
map.c
qosify-bpf.c
qosify-bpf.h
ubus.c

diff --git a/map.c b/map.c
index 466ad3f4016135a735049cf2ae2f4a284019f233..9b17165f2bdef0fa8bd6013080d8d80e1b9dc474 100644 (file)
--- a/map.c
+++ b/map.c
@@ -602,10 +602,10 @@ void qosify_map_reset_config(void)
        qosify_active_timeout = 300;
 
        memset(&config, 0, sizeof(config));
-       config.dscp_prio.ingress = 0xff;
-       config.dscp_prio.egress = 0xff;
-       config.dscp_bulk.ingress = 0xff;
-       config.dscp_bulk.egress = 0xff;
+       config.flow.dscp_prio.ingress = 0xff;
+       config.flow.dscp_prio.egress = 0xff;
+       config.flow.dscp_bulk.ingress = 0xff;
+       config.flow.dscp_bulk.egress = 0xff;
        config.dscp_icmp.ingress = 0xff;
        config.dscp_icmp.egress = 0xff;
 }
index 1e036f00d8e82af3a73a037100c75b08a8dc9bbd..2153fcdbb3df47a782515e30eaaf364d743da0fb 100644 (file)
@@ -255,7 +255,7 @@ parse_l4proto(struct qosify_config *config, struct __sk_buff *skb,
 }
 
 static __always_inline void
-check_flow_bulk(struct qosify_config *config, struct __sk_buff *skb,
+check_flow_bulk(struct qosify_flow_config *config, struct __sk_buff *skb,
                struct flow_bucket *flow, struct qosify_dscp_val *out_val)
 {
        bool trigger = false;
@@ -304,7 +304,7 @@ clear:
 }
 
 static __always_inline void
-check_flow_prio(struct qosify_config *config, struct __sk_buff *skb,
+check_flow_prio(struct qosify_flow_config *config, struct __sk_buff *skb,
                struct flow_bucket *flow, struct qosify_dscp_val *out_val)
 {
        if ((flow->val.flags & QOSIFY_VAL_FLAG_BULK_CHECK) ||
@@ -321,7 +321,7 @@ check_flow_prio(struct qosify_config *config, struct __sk_buff *skb,
 }
 
 static __always_inline void
-check_flow(struct qosify_config *config, struct __sk_buff *skb,
+check_flow(struct qosify_flow_config *config, struct __sk_buff *skb,
           struct qosify_dscp_val *out_val)
 {
        struct flow_bucket flow_data;
@@ -438,6 +438,8 @@ int classify(struct __sk_buff *skb)
        int type;
 
        config = get_config();
+       if (!config)
+               return TC_ACT_OK;
 
        if (module_flags & QOSIFY_IP_ONLY)
                type = skb->protocol;
@@ -458,7 +460,7 @@ int classify(struct __sk_buff *skb)
                val = ip_val->dscp;
        }
 
-       check_flow(config, skb, &val);
+       check_flow(&config->flow, skb, &val);
 
        dscp = dscp_val(&val, ingress);
        if (dscp == 0xff)
index d9d4e9f7886403459a71b01cd52c7df4c47b1c85..ce1c4e7e40f36d47f3ab63c8d0f570ddaafbc4fa 100644 (file)
@@ -27,10 +27,10 @@ struct qosify_dscp_val {
 } __attribute__((packed));
 
 /* global config data */
-struct qosify_config {
+
+struct qosify_flow_config {
        struct qosify_dscp_val dscp_prio;
        struct qosify_dscp_val dscp_bulk;
-       struct qosify_dscp_val dscp_icmp;
 
        uint8_t bulk_trigger_timeout;
        uint16_t bulk_trigger_pps;
@@ -38,6 +38,12 @@ struct qosify_config {
        uint16_t prio_max_avg_pkt_len;
 };
 
+struct qosify_config {
+       struct qosify_dscp_val dscp_icmp;
+
+       struct qosify_flow_config flow;
+};
+
 struct qosify_ip_map_val {
        struct qosify_dscp_val dscp; /* must be first */
        uint8_t seen;
diff --git a/ubus.c b/ubus.c
index 39a775ce54ebce57e6247f108423e0517350891d..e99a77f765d1eef6636562a3db14bb66a1cf787d 100644 (file)
--- a/ubus.c
+++ b/ubus.c
@@ -213,19 +213,19 @@ qosify_ubus_config(struct ubus_context *ctx, struct ubus_object *obj,
        if (dscp.ingress != 0xff)
                qosify_map_set_dscp_default(CL_MAP_TCP_PORTS, dscp);
 
-       if (__set_dscp(&config.dscp_prio, tb[CL_CONFIG_DSCP_PRIO], reset) ||
-           __set_dscp(&config.dscp_bulk, tb[CL_CONFIG_DSCP_BULK], reset) ||
+       if (__set_dscp(&config.flow.dscp_prio, tb[CL_CONFIG_DSCP_PRIO], reset) ||
+           __set_dscp(&config.flow.dscp_bulk, tb[CL_CONFIG_DSCP_BULK], reset) ||
            __set_dscp(&config.dscp_icmp, tb[CL_CONFIG_DSCP_ICMP], reset))
                return UBUS_STATUS_INVALID_ARGUMENT;
 
        if ((cur = tb[CL_CONFIG_BULK_TIMEOUT]) != NULL)
-               config.bulk_trigger_timeout = blobmsg_get_u32(cur);
+               config.flow.bulk_trigger_timeout = blobmsg_get_u32(cur);
 
        if ((cur = tb[CL_CONFIG_BULK_PPS]) != NULL)
-               config.bulk_trigger_pps = blobmsg_get_u32(cur);
+               config.flow.bulk_trigger_pps = blobmsg_get_u32(cur);
 
        if ((cur = tb[CL_CONFIG_PRIO_PKT_LEN]) != NULL)
-               config.prio_max_avg_pkt_len = blobmsg_get_u32(cur);
+               config.flow.prio_max_avg_pkt_len = blobmsg_get_u32(cur);
 
        qosify_map_update_config();