Refactor socket helper functions to take socket_address struct

This commit is contained in:
Jeremy Lakeman 2014-02-20 14:44:38 +10:30
parent 5e170d05e8
commit b8971e51f4
10 changed files with 34 additions and 92 deletions

View File

@ -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 */

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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,

View File

@ -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:

View File

@ -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;
}

View File

@ -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))