From: Amaury Denoyelle Date: Fri, 19 Jul 2024 14:04:22 +0000 (+0200) Subject: MINOR: quic: pass quic_dgram as obj_type for quic-initial rules X-Git-Tag: v3.1-dev5~79 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f91be2657ecc09af14788e820eaee7c6ca80f615;p=thirdparty%2Fhaproxy.git MINOR: quic: pass quic_dgram as obj_type for quic-initial rules To extend quic-initial rules, pass quic_dgram instance to argument for the various actions. As such, quic_dgram is now supported as an obj_type and can be used in session origin field. --- diff --git a/include/haproxy/obj_type-t.h b/include/haproxy/obj_type-t.h index 517d2303d3..da2efbf86f 100644 --- a/include/haproxy/obj_type-t.h +++ b/include/haproxy/obj_type-t.h @@ -43,6 +43,9 @@ enum obj_type { OBJ_TYPE_SC, /* object is a struct stconn */ OBJ_TYPE_STREAM, /* object is a struct stream */ OBJ_TYPE_CHECK, /* object is a struct check */ +#ifdef USE_QUIC + OBJ_TYPE_DGRAM, /* object is a struct quic_dgram */ +#endif OBJ_TYPE_ENTRIES /* last one : number of entries */ } __attribute__((packed)) ; diff --git a/include/haproxy/obj_type.h b/include/haproxy/obj_type.h index 1037460888..233f9d7ada 100644 --- a/include/haproxy/obj_type.h +++ b/include/haproxy/obj_type.h @@ -30,6 +30,7 @@ #include #include #include +#include #include #include @@ -54,6 +55,9 @@ static inline const char *obj_type_name(const enum obj_type *t) case OBJ_TYPE_SC: return "SC"; case OBJ_TYPE_STREAM: return "STREAM"; case OBJ_TYPE_CHECK: return "CHECK"; +#ifdef USE_QUIC + case OBJ_TYPE_DGRAM: return "DGRAM"; +#endif default: return "!INVAL!"; } } @@ -185,6 +189,20 @@ static inline struct check *objt_check(enum obj_type *t) return __objt_check(t); } +#ifdef USE_QUIC +static inline struct quic_dgram *__objt_dgram(enum obj_type *t) +{ + return container_of(t, struct quic_dgram, obj_type); +} + +static inline struct quic_dgram *objt_dgram(enum obj_type *t) +{ + if (!t || *t != OBJ_TYPE_DGRAM) + return NULL; + return __objt_dgram(t); +} +#endif + static inline void *obj_base_ptr(enum obj_type *t) { switch (obj_type(t)) { @@ -199,6 +217,9 @@ static inline void *obj_base_ptr(enum obj_type *t) case OBJ_TYPE_SC: return __objt_sc(t); case OBJ_TYPE_STREAM: return __objt_stream(t); case OBJ_TYPE_CHECK: return __objt_check(t); +#ifdef USE_QUIC + case OBJ_TYPE_DGRAM: return __objt_dgram(t); +#endif default: return t; // exact pointer for invalid case } } diff --git a/include/haproxy/quic_rules.h b/include/haproxy/quic_rules.h index 2cfcf99644..484d31a544 100644 --- a/include/haproxy/quic_rules.h +++ b/include/haproxy/quic_rules.h @@ -1,17 +1,15 @@ #ifndef _HAPROXY_QUIC_RULES_H #define _HAPROXY_QUIC_RULES_H -#include - #include +#include struct listener; +struct quic_dgram; extern struct action_kw_list quic_init_actions_list; -int quic_init_exec_rules(struct listener *li, - struct sockaddr_storage *saddr, - struct sockaddr_storage *daddr); +int quic_init_exec_rules(struct listener *li, struct quic_dgram *dgram); struct action_kw *action_quic_init_custom(const char *kw); diff --git a/include/haproxy/quic_sock-t.h b/include/haproxy/quic_sock-t.h index 0b9c18c122..631cd3e106 100644 --- a/include/haproxy/quic_sock-t.h +++ b/include/haproxy/quic_sock-t.h @@ -3,6 +3,7 @@ #ifdef USE_QUIC #include +#include /* QUIC socket allocation strategy. */ enum quic_sock_mode { @@ -27,6 +28,7 @@ struct quic_receiver_buf { /* QUIC datagram */ struct quic_dgram { + enum obj_type obj_type; void *owner; unsigned char *buf; size_t len; diff --git a/src/quic_rules.c b/src/quic_rules.c index cd7202b61e..9798424330 100644 --- a/src/quic_rules.c +++ b/src/quic_rules.c @@ -4,14 +4,16 @@ #include #include #include +#include #include +#include #include #include -/* Execute registered quic-initial rules on proxy owning
  • listener. */ -int quic_init_exec_rules(struct listener *li, - struct sockaddr_storage *saddr, - struct sockaddr_storage *daddr) +/* Execute registered quic-initial rules on proxy owning
  • listener after + * reception. + */ +int quic_init_exec_rules(struct listener *li, struct quic_dgram *dgram) { static THREAD_LOCAL struct session rule_sess; struct act_rule *rule; @@ -26,8 +28,9 @@ int quic_init_exec_rules(struct listener *li, */ rule_sess.fe = px; rule_sess.listener = li; - rule_sess.src = saddr; - rule_sess.dst = daddr; + rule_sess.src = &dgram->saddr; + rule_sess.dst = &dgram->daddr; + rule_sess.origin = &dgram->obj_type; list_for_each_entry(rule, &px->quic_init_rules, list) { ret = ACL_TEST_PASS; diff --git a/src/quic_rx.c b/src/quic_rx.c index d9c4e3290a..fc1a4acd98 100644 --- a/src/quic_rx.c +++ b/src/quic_rx.c @@ -1607,7 +1607,7 @@ static struct quic_conn *quic_rx_pkt_retrieve_conn(struct quic_rx_packet *pkt, goto err; } - if (!quic_init_exec_rules(l, &dgram->saddr, &dgram->daddr)) { + if (!quic_init_exec_rules(l, dgram)) { TRACE_USER("drop datagram on quic-initial rules", QUIC_EV_CONN_LPKT, NULL, NULL, NULL, pkt->version); goto err; } diff --git a/src/quic_sock.c b/src/quic_sock.c index 541bd6cbb4..4049fc9b58 100644 --- a/src/quic_sock.c +++ b/src/quic_sock.c @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -285,6 +286,7 @@ static int quic_lstnr_dgram_dispatch(unsigned char *pos, size_t len, void *owner } /* All the members must be initialized! */ + dgram->obj_type = OBJ_TYPE_DGRAM; dgram->owner = owner; dgram->buf = pos; dgram->len = len; @@ -849,6 +851,7 @@ int qc_rcv_buf(struct quic_conn *qc) b_add(&buf, ret); + new_dgram->obj_type = OBJ_TYPE_DGRAM; new_dgram->buf = dgram_buf; new_dgram->len = ret; new_dgram->dcid_len = 0;