From: Nick Mathewson Date: Thu, 17 Apr 2025 13:52:40 +0000 (-0400) Subject: Function to test whether a relay command is recognized. X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=059a39cdc42a1babf9d66c9008d11fb8d45621d3;p=thirdparty%2Ftor.git Function to test whether a relay command is recognized. Cherry-picked from dgoulet's 8fe1c503 Author: David Goulet --- diff --git a/src/core/or/or.h b/src/core/or/or.h index 90abaec62c..1b3accfa38 100644 --- a/src/core/or/or.h +++ b/src/core/or/or.h @@ -222,6 +222,52 @@ struct curve25519_public_key_t; #define RELAY_COMMAND_XOFF 43 #define RELAY_COMMAND_XON 44 +/* NOTE: Any new command from above MUST be added to this function. */ +/** Helper to learn if we know the relay command. Unfortuantely, they are not + * contigous and so we need this kind of big switch. We could do better but for + * now, we'll run with this. */ +static inline bool +is_known_relay_command(const uint8_t cmd) +{ + switch (cmd) { + case RELAY_COMMAND_BEGIN: + case RELAY_COMMAND_BEGIN_DIR: + case RELAY_COMMAND_CONFLUX_LINK: + case RELAY_COMMAND_CONFLUX_LINKED: + case RELAY_COMMAND_CONFLUX_LINKED_ACK: + case RELAY_COMMAND_CONFLUX_SWITCH: + case RELAY_COMMAND_CONNECTED: + case RELAY_COMMAND_DATA: + case RELAY_COMMAND_DROP: + case RELAY_COMMAND_END: + case RELAY_COMMAND_ESTABLISH_INTRO: + case RELAY_COMMAND_ESTABLISH_RENDEZVOUS: + case RELAY_COMMAND_EXTEND2: + case RELAY_COMMAND_EXTEND: + case RELAY_COMMAND_EXTENDED2: + case RELAY_COMMAND_EXTENDED: + case RELAY_COMMAND_INTRODUCE1: + case RELAY_COMMAND_INTRODUCE2: + case RELAY_COMMAND_INTRODUCE_ACK: + case RELAY_COMMAND_INTRO_ESTABLISHED: + case RELAY_COMMAND_PADDING_NEGOTIATE: + case RELAY_COMMAND_PADDING_NEGOTIATED: + case RELAY_COMMAND_RENDEZVOUS1: + case RELAY_COMMAND_RENDEZVOUS2: + case RELAY_COMMAND_RENDEZVOUS_ESTABLISHED: + case RELAY_COMMAND_RESOLVE: + case RELAY_COMMAND_RESOLVED: + case RELAY_COMMAND_SENDME: + case RELAY_COMMAND_TRUNCATE: + case RELAY_COMMAND_TRUNCATED: + case RELAY_COMMAND_XOFF: + case RELAY_COMMAND_XON: + return true; + default: + return false; + } +} + /* Reasons why an OR connection is closed. */ #define END_OR_CONN_REASON_DONE 1 #define END_OR_CONN_REASON_REFUSED 2 /* connection refused */