new: add mptp packet verify functions

This commit is contained in:
ngn
2024-06-22 07:03:17 +03:00
parent 19c98b763d
commit c8e45097fe
12 changed files with 275 additions and 110 deletions

@ -8,24 +8,30 @@ typedef enum lm_error {
LM_ERR_URLHostLarge = 4,
LM_ERR_URLPathLarge = 5,
LM_ERR_URLBadHost = 6,
LM_ERR_URLBadPath = 7,
LM_ERR_URLPortUnknown = 8,
LM_ERR_URLBadPort = 9,
LM_ERR_PoolNoSupport = 10,
LM_ERR_URLEnd = 11,
LM_ERR_MPTPBadVersion = 12,
LM_ERR_MPTPBadCode = 13,
LM_ERR_MPTPBadUrl = 14,
LM_ERR_MPTPHostFail = 15,
LM_ERR_MPTPSocketFail = 16,
LM_ERR_MPTPConnectFail = 17,
LM_ERR_MPTPRecvFail = 18,
LM_ERR_MPTPSendFail = 19,
LM_ERR_MPTPBadChunk = 29,
LM_ERR_MPTPSetsockopt = 30,
LM_ERR_MPTPTimeout = 31,
LM_ERR_MPTPBindFail = 32,
LM_ERR_ArgNULL = 33,
LM_ERR_URLBadPort = 7,
LM_ERR_URLBadPath = 8,
LM_ERR_URLPortUnknown = 9,
LM_ERR_BadPort = 10,
LM_ERR_BadHost = 11,
LM_ERR_PoolNoSupport = 12,
LM_ERR_URLEnd = 13,
LM_ERR_MPTPBadVersion = 14,
LM_ERR_MPTPBadCode = 15,
LM_ERR_MPTPBadUrl = 16,
LM_ERR_MPTPHostFail = 17,
LM_ERR_MPTPSocketFail = 18,
LM_ERR_MPTPConnectFail = 19,
LM_ERR_MPTPRecvFail = 20,
LM_ERR_MPTPSendFail = 21,
LM_ERR_MPTPBadChunk = 22,
LM_ERR_MPTPSetsockopt = 23,
LM_ERR_MPTPTimeout = 24,
LM_ERR_MPTPBindFail = 25,
LM_ERR_ArgNULL = 26,
LM_ERR_MPTPNotResponse = 27,
LM_ERR_MPTPNotRequest = 28,
LM_ERR_MPTPNotLast = 29,
LM_ERR_NoPort = 30,
} lm_error_t;
typedef struct lm_error_desc {

@ -69,8 +69,7 @@
// clang-format on
#define MPTP_VERSION_SUPPORTED 0
#define MPTP_VERSION_MAX 15 // 4 bits
#define MPTP_CODE_MAX 4 // 2 bits
#define MPTP_CODE_MAX 3 // 2 bits
#define MPTP_CHUNK_MAX 256
#define MPTP_TIMEOUT 10
@ -101,24 +100,25 @@ typedef struct lm_mptp {
char data[MPTP_CHUNK_MAX];
} lm_mptp_t;
#define MPTP_FLAGS_VERSION(m) ((m)->header.flags & 0xFF00) >> 8
#define MPTP_FLAGS_REQUEST(m) ((m)->header.flags & 0x0080) >> 1
#define MPTP_FLAGS_TYPE(m) ((m)->header.flags & 0x0070) >> 4
#define MPTP_FLAGS_LAST(m) ((m)->header.flags & 0x0008) >> 3
#define MPTP_FLAGS_VERSION(m) (((m)->header.flags & 0xFF00) >> 8)
#define MPTP_FLAGS_TYPE(m) (((m)->header.flags & 0x0080) >> 1)
#define MPTP_FLAGS_CODE(m) (((m)->header.flags & 0x0070) >> 4)
#define MPTP_FLAGS_LAST(m) (((m)->header.flags & 0x0008) >> 3)
#define MPTP_IS_REQUEST(m) MPTP_FLAGS_REQUEST(m) == 0
#define MPTP_IS_LAST(m) MPTP_FLAGS_LAST(m) == 1
#define MPTP_IS_REQUEST(m) (MPTP_FLAGS_TYPE(m) == 0)
#define MPTP_IS_LAST(m) (MPTP_FLAGS_LAST(m) == 1)
bool lm_mptp_packet_init(lm_mptp_t *packet, bool is_request, uint8_t code, bool is_last);
int lm_mptp_socket(char *addr, uint16_t port, struct sockaddr *saddr);
bool lm_mptp_verify(lm_mptp_t *packet);
void lm_mptp_close(int sock);
int lm_mptp_client_connect(char *addr, uint16_t port);
bool lm_mptp_client_verify(int sock, lm_mptp_t *packet); // not implemented
bool lm_mptp_client_verify(lm_mptp_t *packet);
bool lm_mptp_client_send(int sock, lm_mptp_t *packet);
bool lm_mptp_client_recv(int sock, lm_mptp_t *packet);
int lm_mptp_server_listen(char *addr, uint16_t port);
bool lm_mptp_server_verify(int sock, lm_mptp_t *packet, struct sockaddr *addr); // not implemented
bool lm_mptp_server_verify(lm_mptp_t *packet);
bool lm_mptp_server_recv(int sock, lm_mptp_t *packet, struct sockaddr *addr);
bool lm_mptp_server_send(int sock, lm_mptp_t *packet, struct sockaddr *adrr);

@ -6,3 +6,4 @@ bool lm_ctx_pool_add(lm_ctx_t *ctx, char *name, char *url);
bool lm_ctx_pool_del(lm_ctx_t *ctx, char *name);
void lm_ctx_pool_clear(lm_ctx_t *ctx);
void lm_ctx_pool_test(lm_ctx_t *ctx);
bool lm_ctx_pool_serve(lm_ctx_t *ctx, char *addr);

@ -11,7 +11,8 @@ typedef struct lm_url {
char protocol[URL_PROTOCOL_MAX + 1];
char *host;
char *path;
bool empty;
} lm_url_t;
bool lm_url_parse(lm_url_t *url, char *str);
bool lm_url_init(lm_url_t *url, char *str);
void lm_url_free(lm_url_t *url);

@ -6,6 +6,7 @@
#define _(x) gettext(x)
void pdebug(lm_ctx_t *ctx, const char *func, const char *fmt, ...);
bool parse_host(char *addr, char *host, uint16_t *port);
bool contains(char *str, char s);
bool eq(char *s1, char *s2);
bool is_letter(char c);