- accept
- dgram-drop
- reject
+ - send-retry
rate-limit sessions <rate>
sc-inc-gpc1 - X X X X X X X
sc-set-gpt - X X X X X X X
sc-set-gpt0 - X X X X X X X
+send-retry X - - - - - - -
send-spoe-group - - - X X X X -
set-bandwidth-limit - - - X X X X -
set-bc-mark - - - X - X - -
See also the "sc-set-gpt" action.
+send-retry
+ Usable in: QUIC Ini| TCP RqCon| RqSes| RqCnt| RsCnt| HTTP Req| Res| Aft
+ X | - | - | - | - | - | - | -
+
+ This action forces the emission of a Retry packet in response to a client
+ Initial packet without token. This is useful to ensure client address is
+ validated prior to instantiating any connection elements and starting the
+ handshake.
+
+
send-spoe-group <engine-name> <group-name>
Usable in: QUIC Ini| TCP RqCon| RqSes| RqCnt| RsCnt| HTTP Req| Res| Aft
- | - | - | X | X | X | X | -
};
#define QUIC_DGRAM_FL_REJECT 0x00000001
+#define QUIC_DGRAM_FL_SEND_RETRY 0x00000002
/* QUIC datagram */
struct quic_dgram {
return ACT_RET_DONE;
}
+static enum act_return quic_init_action_send_retry(struct act_rule *rule, struct proxy *px,
+ struct session *sess, struct stream *s, int flags)
+{
+ struct quic_dgram *dgram = __objt_dgram(sess->origin);
+ dgram->flags |= QUIC_DGRAM_FL_SEND_RETRY;
+ return ACT_RET_DONE;
+}
+
static enum act_parse_ret parse_reject(const char **args, int *orig_arg,
struct proxy *px,
struct act_rule *rule, char **err)
return ACT_RET_PRS_OK;
}
+static enum act_parse_ret parse_send_retry(const char **args, int *orig_arg,
+ struct proxy *px,
+ struct act_rule *rule, char **err)
+{
+ rule->action = ACT_CUSTOM;
+ rule->action_ptr = quic_init_action_send_retry;
+ return ACT_RET_PRS_OK;
+}
+
/* List head of all known action keywords for "quic-initial" */
struct action_kw_list quic_init_actions_list = {
.list = LIST_HEAD_INIT(quic_init_actions_list.list)
{ "accept", parse_accept, 0 },
{ "dgram-drop", parse_dgram_drop, 0 },
{ "reject", parse_reject, 0 },
+ { "send-retry", parse_send_retry, 0 },
{ /* END */ },
}
};
/* No need to emit Retry if connection is refused. */
if (!pkt->token_len && !(dgram->flags & QUIC_DGRAM_FL_REJECT)) {
if ((l->bind_conf->options & BC_O_QUIC_FORCE_RETRY) ||
- HA_ATOMIC_LOAD(&prx_counters->half_open_conn) >= global.tune.quic_retry_threshold) {
+ HA_ATOMIC_LOAD(&prx_counters->half_open_conn) >= global.tune.quic_retry_threshold ||
+ (dgram->flags & QUIC_DGRAM_FL_SEND_RETRY)) {
TRACE_PROTO("Initial without token, sending retry",
QUIC_EV_CONN_LPKT, NULL, NULL, NULL, pkt->version);