mirror of
https://github.com/servalproject/serval-dna.git
synced 2025-02-20 09:26:37 +00:00
Refactor socket helper functions to take socket_address struct
This commit is contained in:
parent
5e170d05e8
commit
b8971e51f4
34
constants.h
34
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 */
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;i<MDP_MAX_BINDINGS;i++)
|
||||
{
|
||||
@ -1132,33 +1132,13 @@ static void overlay_mdp_scan(struct sched_ent *alarm)
|
||||
}
|
||||
|
||||
static int mdp_reply2(const struct socket_address *client, const struct mdp_header *header,
|
||||
int flags, const unsigned char *payload, int payload_len)
|
||||
int flags, const unsigned char *payload, size_t payload_len)
|
||||
{
|
||||
struct mdp_header response_header;
|
||||
bcopy(header, &response_header, sizeof(response_header));
|
||||
response_header.flags = flags;
|
||||
|
||||
struct iovec iov[]={
|
||||
{
|
||||
.iov_base = (void *)&response_header,
|
||||
.iov_len = sizeof(struct mdp_header)
|
||||
},
|
||||
{
|
||||
.iov_base = (void *)payload,
|
||||
.iov_len = payload_len
|
||||
}
|
||||
};
|
||||
|
||||
struct msghdr hdr={
|
||||
.msg_name=(void *)&client->addr,
|
||||
.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,
|
||||
|
@ -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:
|
||||
|
28
socket.c
28
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;
|
||||
}
|
||||
|
||||
|
8
socket.h
8
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))
|
||||
|
Loading…
x
Reference in New Issue
Block a user