From 6d88c555019f32509f303e23dcfbba824fecd2ee Mon Sep 17 00:00:00 2001 From: Chris Hiszpanski Date: Thu, 18 Apr 2019 00:55:30 -0700 Subject: Initial public commit. mDNS and SDP are functional. Otherwise, library is still very much a work in progress. All tests pass. --- include/stun.h | 134 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 include/stun.h (limited to 'include/stun.h') diff --git a/include/stun.h b/include/stun.h new file mode 100644 index 0000000..126e7f5 --- /dev/null +++ b/include/stun.h @@ -0,0 +1,134 @@ +/* + * liburtc + * Copyright (C) 2019 Chris Hiszpanski + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef URTC_STUN_H +#define URTC_STUN_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define SIZEOF_STUN_HDR 20 + +// STUN Classes +#define STUN_CLASS_REQUEST 0 +#define STUN_CLASS_INDICTATION 1 +#define STUN_CLASS_SUCCESS 2 +#define STUN_CLASS_ERROR 3 + +// STUN Methods +#define STUN_METHOD_RESERVED 0 +#define STUN_METHOD_BINDING 1 + + +///////////////////////////// TYPE DEFINITIONS ///////////////////////////// + +typedef struct { + int rc; // Retransmission count + int rto; // Retransmission timeout (in ms) + int sockfd; // Socket file descriptor +} stun_client_t; + +typedef struct { + char *server; +} stun_client_config_t; + +// STUN Message Header +typedef struct __attribute__((__packed__)) { + uint16_t reserved:2; // Upper two bits are 0 + uint16_t type:14; // 14-bit type + uint16_t msglen; // Message length + uint32_t cookie; // Magic cookie + uint8_t txid[12]; // Transaction ID +} stun_msg_hdr_t; + +// STUN Attribute +typedef struct { + uint16_t type; // Attribute type + uint16_t len; // Value length, prior to padding + uint8_t *val; // Pointer to attribute value +} stun_attr_t; + +// STUN Attribute: MAPPED-ADDRESS +typedef struct __attribute__((__packed__)) { + uint8_t reserved; + uint8_t family; + uint16_t port; + union { + uint8_t ipv4[4]; // IPv4 address is 32-bits + uint8_t ipv6[16]; // IPv6 address is 128-bits + }; +} stun_attr_mapped_address_t; + +// STUN Attribute: XOR-MAPPED-ADDRESS +typedef stun_attr_mapped_address_t stun_attr_xor_mapped_address_t; + +// STUN Attribute: USERNAME + + +////////////////////////////////// MACROS ////////////////////////////////// + +// Get class from message header type +#define CLASS(typ) (((typ >> 7) & 0x2) | ((typ >> 4) & 0x1)) + +// Get method from message header type +#define METHOD(typ) (((typ >> 2) & 0xF80) | ((typ >> 1) & 0x70) | (typ & 0xF)) + +#define TYPE(cls, mthd) ( \ + ((mthd & 0xF80) << 2) | \ + ((cls & 0x2) << 7) | \ + ((mthd & 0x70) << 1) | \ + ((cls & 0x1) << 4) | \ + (mthd & 0xF) \ +) + + +/////////////////////////// FORWARD DECLARATIONS /////////////////////////// + +/** + * (callback) Binding request response handler + * + * @param[in] name + * @param[in] arg User argument + */ +typedef void (*stun_client_binding_response_callback)( + const char *name, + void *arg +); + +/** + * Sends a STUN binding request to the specified server + * + * @param[in] srv Server (hostname or IP address) + * @param[in] cb Handler to call when a response is received + * @param[in] arg Optional user argument to pass to callback + */ +err_t stun_client_binding_request( + runloop_t *rl, + const char *srv, + stun_client_binding_response_callback cb, + void *arg +); + +#ifdef __cplusplus +} +#endif + +#endif /* URTC_STUN_H */ -- cgit v1.2.3