From: Willy Tarreau Date: Sat, 22 Apr 2023 13:02:35 +0000 (+0200) Subject: MINOR: protocol: add a flags field to store info about protocols X-Git-Tag: v2.8-dev8~9 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=65df7e028da2d86d9769f2ba03bdf1d110c2a44c;p=thirdparty%2Fhaproxy.git MINOR: protocol: add a flags field to store info about protocols We'll use these flags to know if some protocols are supported, and if so, with what options/extensions. Reuseport will move there for example. Two functions were added to globally set/clear a flag. --- diff --git a/include/haproxy/protocol-t.h b/include/haproxy/protocol-t.h index 0419191ada..aa8aa662c4 100644 --- a/include/haproxy/protocol-t.h +++ b/include/haproxy/protocol-t.h @@ -127,7 +127,7 @@ struct protocol { /* default I/O handler */ void (*default_iocb)(int fd); /* generic I/O handler (typically accept callback) */ - /* 4-byte hole here on 64-bit machines */ + uint flags; /* flags describing protocol support (PROTO_F_*) */ uint nb_receivers; /* number of receivers (under proto_lock) */ struct list receivers; /* list of receivers using this protocol (under proto_lock) */ struct list list; /* list of registered protocols (under proto_lock) */ diff --git a/include/haproxy/protocol.h b/include/haproxy/protocol.h index 05bba78d96..5c0871aec7 100644 --- a/include/haproxy/protocol.h +++ b/include/haproxy/protocol.h @@ -38,6 +38,12 @@ void protocol_register(struct protocol *proto); */ void protocol_unregister(struct protocol *proto); +/* clears flag on all protocols. */ +void protocol_clrf_all(uint flag); + +/* sets flag on all protocols. */ +void protocol_setf_all(uint flag); + /* binds all listeners of all registered protocols. Returns a composition * of ERR_NONE, ERR_RETRYABLE, ERR_FATAL, ERR_ABORT. */ diff --git a/src/protocol.c b/src/protocol.c index c627d5c734..7cc9674368 100644 --- a/src/protocol.c +++ b/src/protocol.c @@ -61,6 +61,28 @@ void protocol_unregister(struct protocol *proto) HA_SPIN_UNLOCK(PROTO_LOCK, &proto_lock); } +/* clears flag on all protocols. */ +void protocol_clrf_all(uint flag) +{ + struct protocol *proto; + + HA_SPIN_LOCK(PROTO_LOCK, &proto_lock); + list_for_each_entry(proto, &protocols, list) + proto->flags &= ~flag; + HA_SPIN_UNLOCK(PROTO_LOCK, &proto_lock); +} + +/* sets flag on all protocols. */ +void protocol_setf_all(uint flag) +{ + struct protocol *proto; + + HA_SPIN_LOCK(PROTO_LOCK, &proto_lock); + list_for_each_entry(proto, &protocols, list) + proto->flags |= flag; + HA_SPIN_UNLOCK(PROTO_LOCK, &proto_lock); +} + /* binds all listeners of all registered protocols. Returns a composition * of ERR_NONE, ERR_RETRYABLE, ERR_FATAL. */