diff --git a/constants.h b/constants.h index 64108b80..b4e5f690 100644 --- a/constants.h +++ b/constants.h @@ -32,37 +32,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # define UNUSED(x) x #endif -/* Packet format: - - 16 bit - Magic value 0x4110 - 16 bit - Version number (0001 initially) - 16 bit - Payload length - 16 bit - Cipher method (0000 = clear text) - - Ciphered payload follows: - (needs to have no predictable data to protect against known plain-text attacks) - - 64bit transaction id (random) - 8bit - payload rotation (random, to help protect encryption from cribs) - - Remainder of payload, after correcting for rotation: - - 33byte did|subscriber id - 16byte salt - 16byte hash of PIN+salt - - Remainder of packet is interpretted as a series of operations - - 8 bit operation: - 00 = get, 01 = set, 02 = delete, 03 = update, - 80 = decline, 81 = okay (+optional result), - f0 = xfer HLR record - fe = random padding follows (to help protect cryptography from cribs) - ff = end of transaction - - get - 8 bit variable value - -*/ #define SID_SIZE 32 // == crypto_sign_edwards25519sha512batch_PUBLICKEYBYTES #define SAS_SIZE 32 // == crypto_sign_edwards25519sha512batch_PUBLICKEYBYTES #define DID_MINSIZE 5 @@ -97,9 +66,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Upto MTU bytes of payload. 32 bit channel/port indicator for each end. */ -#define OF_TYPE_DATA_VOICE 0x40 /* Voice data frame. - Limited to 255 bytes of payload. - 1 byte channel/port indicator for each end */ #define OF_TYPE_RHIZOME_ADVERT 0x50 /* Advertisment of file availability via Rhizome */ #define OF_TYPE_PLEASEEXPLAIN 0x60 /* Request for resolution of an abbreviated address */ diff --git a/mdp_client.c b/mdp_client.c index 9bfbb4b5..cdfc6ca8 100644 --- a/mdp_client.c +++ b/mdp_client.c @@ -198,7 +198,7 @@ int overlay_mdp_client_socket(void) return -1; if ((mdp_sockfd = esocket(AF_UNIX, SOCK_DGRAM, 0)) == -1) return -1; - if (socket_bind(mdp_sockfd, &addr.addr, addr.addrlen) == -1) { + if (socket_bind(mdp_sockfd, &addr) == -1) { close(mdp_sockfd); return -1; } diff --git a/monitor-client.c b/monitor-client.c index 472e6439..6aa27a93 100644 --- a/monitor-client.c +++ b/monitor-client.c @@ -78,7 +78,7 @@ int monitor_client_open(struct monitor_state **res) return -1; if (config.debug.monitor) DEBUGF("Attempting to connect to %s", alloca_socket_address(&addr)); - if (socket_connect(fd, &addr.addr, addr.addrlen) == -1) { + if (socket_connect(fd, &addr) == -1) { close(fd); return -1; } diff --git a/monitor.c b/monitor.c index 279c037c..d5414e35 100644 --- a/monitor.c +++ b/monitor.c @@ -115,7 +115,7 @@ int monitor_setup_sockets() struct socket_address addr; if (make_local_sockaddr(&addr, "monitor.socket") == -1) goto error; - if (socket_bind(sock, &addr.addr, addr.addrlen) == -1) + if (socket_bind(sock, &addr) == -1) goto error; if (socket_listen(sock, MAX_MONITOR_SOCKETS) == -1) goto error; diff --git a/msp_proxy.c b/msp_proxy.c index 5d53370a..8a39e14d 100644 --- a/msp_proxy.c +++ b/msp_proxy.c @@ -234,7 +234,7 @@ static int msp_listener(struct msp_sock *sock, msp_state_t state, const uint8_t msp_close(sock); return -1; } - if (socket_connect(fd, &ip_addr.addr, ip_addr.addrlen)==-1){ + if (socket_connect(fd, &ip_addr)==-1){ msp_close(sock); close(fd); return -1; @@ -444,7 +444,7 @@ int app_msp_connection(const struct cli_parsed *parsed, struct cli_context *UNUS listen_alarm.poll.fd = esocket(PF_INET, SOCK_STREAM, 0); if (listen_alarm.poll.fd==-1) goto end; - if (socket_bind(listen_alarm.poll.fd, &ip_addr.addr, ip_addr.addrlen)==-1) + if (socket_bind(listen_alarm.poll.fd, &ip_addr)==-1) goto end; if (socket_listen(listen_alarm.poll.fd, 0)==-1) goto end; diff --git a/overlay_interface.c b/overlay_interface.c index 6fee00af..0d0c4d82 100644 --- a/overlay_interface.c +++ b/overlay_interface.c @@ -142,9 +142,9 @@ overlay_bind_socket(const struct socket_address *addr){ return WHYF("Unsupported address %s", alloca_socket_address(addr)); } - fd = socket(protocol, SOCK_DGRAM, 0); + fd = esocket(protocol, SOCK_DGRAM, 0); if (fd < 0) - return WHY_perror("Error creating socket"); + return -1; if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &reuseP, sizeof(reuseP)) < 0) { WHY_perror("setsockopt(SO_REUSEADR)"); @@ -174,10 +174,8 @@ overlay_bind_socket(const struct socket_address *addr){ #endif ); - if (bind(fd, &addr->addr, addr->addrlen)) { - WHY_perror("Bind failed"); + if (socket_bind(fd, addr)) goto error; - } return fd; diff --git a/overlay_mdp.c b/overlay_mdp.c index de9addf3..c26d99b3 100644 --- a/overlay_mdp.c +++ b/overlay_mdp.c @@ -86,7 +86,7 @@ static int overlay_saw_mdp_frame( struct internal_mdp_header *header, struct overlay_buffer *payload); -static int mdp_send2(struct socket_address *client, struct mdp_header *header, +static int mdp_send2(const struct socket_address *client, const struct mdp_header *header, const uint8_t *payload, size_t payload_len); /* Delete all UNIX socket files in instance directory. */ @@ -145,7 +145,7 @@ static int mdp_bind_socket(const char *name) return -1; if (socket_set_reuseaddr(sock, 1) == -1) WARN("Could not set socket to reuse addresses"); - if (socket_bind(sock, &addr.addr, addr.addrlen) == -1) { + if (socket_bind(sock, &addr) == -1) { close(sock); return -1; } @@ -542,7 +542,7 @@ static int overlay_saw_mdp_frame( header->source_port, header->destination_port); if (allow_incoming_packet(header) == RULE_DROP) - return 0; + RETURN(0); for(i=0;iaddr, - .msg_namelen=client->addrlen, - .msg_iov=iov, - .msg_iovlen=2, - }; - - if (config.debug.mdprequests) - DEBUGF("Replying to %s with flags %d", alloca_socket_address(client), flags); - return sendmsg(mdp_sock2.poll.fd, &hdr, 0); + return mdp_send2(client, &response_header, payload, payload_len); } #define mdp_reply_error(A,B) mdp_reply2(A,B,MDP_FLAG_ERROR,NULL,0) @@ -1301,8 +1281,7 @@ static void mdp_process_packet(struct socket_address *client, struct mdp_header mdp_bindings[i].port=0; } } - // should we expect clients to wait for this? - // mdp_reply_ok(client, header); + // should we expect clients to wait? return; } @@ -1460,7 +1439,7 @@ static void mdp_process_packet(struct socket_address *client, struct mdp_header } } -static int mdp_send2(struct socket_address *client, struct mdp_header *header, +static int mdp_send2(const struct socket_address *client, const struct mdp_header *header, const uint8_t *payload, size_t payload_len) { struct iovec iov[]={ @@ -1475,7 +1454,7 @@ static int mdp_send2(struct socket_address *client, struct mdp_header *header, }; struct msghdr hdr={ - .msg_name=&client->addr, + .msg_name=(struct sockaddr*)&client->addr, .msg_namelen=client->addrlen, .msg_iov=iov, .msg_iovlen=2, diff --git a/overlay_packetformats.c b/overlay_packetformats.c index e51754d3..dae6e36d 100644 --- a/overlay_packetformats.c +++ b/overlay_packetformats.c @@ -94,7 +94,6 @@ int process_incoming_frame(time_ms_t now, struct overlay_interface *UNUSED(inter overlay_rhizome_saw_advertisements(context,f); break; case OF_TYPE_DATA: - case OF_TYPE_DATA_VOICE: overlay_saw_mdp_containing_frame(f); break; case OF_TYPE_PLEASEEXPLAIN: diff --git a/socket.c b/socket.c index 740db9b9..6c7770bb 100644 --- a/socket.c +++ b/socket.c @@ -189,29 +189,29 @@ int _esocket(struct __sourceloc __whence, int domain, int type, int protocol) return fd; } -int _socket_connect(struct __sourceloc __whence, int sock, const struct sockaddr *addr, socklen_t addrlen) +int _socket_connect(struct __sourceloc __whence, int sock, const struct socket_address *addr) { - if (connect(sock, (struct sockaddr *)addr, addrlen) == -1) - return WHYF_perror("connect(%d,%s,%lu)", sock, alloca_sockaddr(addr, addrlen), (unsigned long)addrlen); + if (connect(sock, &addr->addr, addr->addrlen) == -1) + return WHYF_perror("connect(%d,%s,%lu)", sock, alloca_socket_address(addr), (unsigned long)addr->addrlen); if (config.debug.io || config.debug.verbose_io) - DEBUGF("connect(%d, %s, %lu)", sock, alloca_sockaddr(addr, addrlen), (unsigned long)addrlen); + DEBUGF("connect(%d, %s, %lu)", sock, alloca_socket_address(addr), (unsigned long)addr->addrlen); return 0; } -int _socket_bind(struct __sourceloc __whence, int sock, const struct sockaddr *addr, socklen_t addrlen) +int _socket_bind(struct __sourceloc __whence, int sock, const struct socket_address *addr) { - assert(addrlen > sizeof addr->sa_family); - if (addr->sa_family == AF_UNIX && ((struct sockaddr_un *)addr)->sun_path[0] != '\0') { - assert(((struct sockaddr_un *)addr)->sun_path[addrlen - sizeof ((struct sockaddr_un *)addr)->sun_family - 1] == '\0'); - if (unlink(((struct sockaddr_un *)addr)->sun_path) == -1 && errno != ENOENT) - WARNF_perror("unlink(%s)", alloca_str_toprint(((struct sockaddr_un *)addr)->sun_path)); + assert(addr->addrlen > sizeof addr->addr.sa_family); + if (addr->addr.sa_family == AF_UNIX && addr->local.sun_path[0] != '\0') { + assert(addr->local.sun_path[addr->addrlen - sizeof addr->local.sun_family - 1] == '\0'); + if (unlink(addr->local.sun_path) == -1 && errno != ENOENT) + WARNF_perror("unlink(%s)", alloca_str_toprint(addr->local.sun_path)); if (config.debug.io || config.debug.verbose_io) - DEBUGF("unlink(%s)", alloca_str_toprint(((struct sockaddr_un *)addr)->sun_path)); + DEBUGF("unlink(%s)", alloca_str_toprint(addr->local.sun_path)); } - if (bind(sock, (struct sockaddr *)addr, addrlen) == -1) - return WHYF_perror("bind(%d,%s,%lu)", sock, alloca_sockaddr(addr, addrlen), (unsigned long)addrlen); + if (bind(sock, &addr->addr, addr->addrlen) == -1) + return WHYF_perror("bind(%d,%s,%lu)", sock, alloca_socket_address(addr), (unsigned long)addr->addrlen); if (config.debug.io || config.debug.verbose_io) - DEBUGF("bind(%d, %s, %lu)", sock, alloca_sockaddr(addr, addrlen), (unsigned long)addrlen); + DEBUGF("bind(%d, %s, %lu)", sock, alloca_socket_address(addr), (unsigned long)addr->addrlen); return 0; } diff --git a/socket.h b/socket.h index 551d02c8..a6108367 100644 --- a/socket.h +++ b/socket.h @@ -49,8 +49,8 @@ struct socket_address{ int _make_local_sockaddr(struct __sourceloc, struct socket_address *addr, const char *fmt, ...) __attribute__((format(printf, 3, 4))); int _esocket(struct __sourceloc, int domain, int type, int protocol); -int _socket_bind(struct __sourceloc, int sock, const struct sockaddr *addr, socklen_t addrlen); -int _socket_connect(struct __sourceloc, int sock, const struct sockaddr *addr, socklen_t addrlen); +int _socket_bind(struct __sourceloc, int sock, const struct socket_address *addr); +int _socket_connect(struct __sourceloc, int sock, const struct socket_address *addr); int _socket_listen(struct __sourceloc, int sock, int backlog); int _socket_set_reuseaddr(struct __sourceloc, int sock, int reuseP); int _socket_set_rcvbufsize(struct __sourceloc, int sock, unsigned buffer_size); @@ -58,8 +58,8 @@ int socket_unlink_close(int sock); #define make_local_sockaddr(sockname, fmt,...) _make_local_sockaddr(__WHENCE__, (sockname), (fmt), ##__VA_ARGS__) #define esocket(domain, type, protocol) _esocket(__WHENCE__, (domain), (type), (protocol)) -#define socket_bind(sock, addr, addrlen) _socket_bind(__WHENCE__, (sock), (addr), (addrlen)) -#define socket_connect(sock, addr, addrlen) _socket_connect(__WHENCE__, (sock), (addr), (addrlen)) +#define socket_bind(sock, addr) _socket_bind(__WHENCE__, (sock), (addr)) +#define socket_connect(sock, addr) _socket_connect(__WHENCE__, (sock), (addr)) #define socket_listen(sock, backlog) _socket_listen(__WHENCE__, (sock), (backlog)) #define socket_set_reuseaddr(sock, reuseP) _socket_set_reuseaddr(__WHENCE__, (sock), (reuseP)) #define socket_set_rcvbufsize(sock, buffer_size) _socket_set_rcvbufsize(__WHENCE__, (sock), (buffer_size))