/* COMM interface */
+struct comm_addr {
+ /* This struct is pure data; in particular comm's clients may
+ freely copy it. */
+ /* Everyone is also guaranteed that all padding is set to zero, ie
+ that comm_addrs referring to semantically identical peers will
+ compare equal with memcmp. Anyone who constructs a comm_addr
+ must start by memsetting it with FILLZERO, or some
+ equivalent. */
+ struct comm_if *comm;
+ struct sockaddr_in sin;
+};
+
/* Return True if the packet was processed, and shouldn't be passed to
any other potential receivers. */
typedef bool_t comm_notify_fn(void *state, struct buffer_if *buf,
- struct sockaddr_in *source);
+ const struct comm_addr *source);
typedef void comm_request_notify_fn(void *commst, void *nst,
comm_notify_fn *fn);
typedef void comm_release_notify_fn(void *commst, void *nst,
comm_notify_fn *fn);
typedef bool_t comm_sendmsg_fn(void *commst, struct buffer_if *buf,
- struct sockaddr_in *dest);
+ const struct comm_addr *dest);
struct comm_if {
void *st;
int32_t min_start_pad;
bool_t current_valid;
uint64_t current_key_timeout; /* End of life of current key */
uint64_t renegotiate_key_time; /* When we can negotiate a new key */
- struct sockaddr_in peer; /* Current address of peer */
+ struct comm_addr peer; /* Current address of peer */
bool_t peer_valid; /* Peer address becomes invalid when key times out,
but only if we have a DNS name for our peer */
timeout before we can listen for another setup packet); perhaps
we should keep a list of 'bad' sources for setup packets. */
uint32_t setup_session_id;
- struct sockaddr_in setup_peer;
+ struct comm_addr setup_peer;
uint8_t localN[NONCELEN]; /* Nonces for key exchange */
uint8_t remoteN[NONCELEN];
struct buffer_if buffer; /* Current outgoing key exchange packet */
}
static bool_t process_msg1(struct site *st, struct buffer_if *msg1,
- struct sockaddr_in *src)
+ const struct comm_addr *src)
{
struct msg m;
}
static bool_t process_msg2(struct site *st, struct buffer_if *msg2,
- struct sockaddr_in *src)
+ const struct comm_addr *src)
{
struct msg m;
cstring_t err;
}
static bool_t process_msg3(struct site *st, struct buffer_if *msg3,
- struct sockaddr_in *src)
+ const struct comm_addr *src)
{
struct msg m;
uint8_t *hash;
}
static bool_t process_msg4(struct site *st, struct buffer_if *msg4,
- struct sockaddr_in *src)
+ const struct comm_addr *src)
{
struct msg m;
uint8_t *hash;
}
static bool_t process_msg5(struct site *st, struct buffer_if *msg5,
- struct sockaddr_in *src)
+ const struct comm_addr *src)
{
struct msg0 m;
cstring_t transform_err;
}
static bool_t process_msg6(struct site *st, struct buffer_if *msg6,
- struct sockaddr_in *src)
+ const struct comm_addr *src)
{
struct msg0 m;
cstring_t transform_err;
}
static bool_t process_msg0(struct site *st, struct buffer_if *msg0,
- struct sockaddr_in *src)
+ const struct comm_addr *src)
{
struct msg0 m;
cstring_t transform_err;
}
static void dump_packet(struct site *st, struct buffer_if *buf,
- struct sockaddr_in *addr, bool_t incoming)
+ const struct comm_addr *addr, bool_t incoming)
{
uint32_t dest=ntohl(*(uint32_t *)buf->start);
uint32_t source=ntohl(*(uint32_t *)(buf->start+4));
}
if (address) {
memset(&st->setup_peer,0,sizeof(st->setup_peer));
- st->setup_peer.sin_family=AF_INET;
- st->setup_peer.sin_port=htons(st->remoteport);
- st->setup_peer.sin_addr=*address;
+ st->setup_peer.comm=st->comm;
+ st->setup_peer.sin.sin_family=AF_INET;
+ st->setup_peer.sin.sin_port=htons(st->remoteport);
+ st->setup_peer.sin.sin_addr=*address;
enter_new_state(st,SITE_SENTMSG1);
} else {
/* Resolution failed */
/* This function is called by the communication device to deliver
packets from our peers. */
static bool_t site_incoming(void *sst, struct buffer_if *buf,
- struct sockaddr_in *source)
+ const struct comm_addr *source)
{
struct site *st=sst;
uint32_t dest=ntohl(*(uint32_t *)buf->start);
if (nfds && (fds->revents & POLLIN)) {
do {
+ FILLZERO(from);
fromlen=sizeof(from);
BUF_ASSERT_FREE(st->rbuf);
BUF_ALLOC(st->rbuf,"udp_afterpoll");
}
done=False;
for (n=st->notify; n; n=n->next) {
- if (n->fn(n->state, st->rbuf, &from)) {
+ struct comm_addr ca;
+ FILLZERO(ca);
+ ca.comm=&st->ops;
+ ca.sin=from;
+ if (n->fn(n->state, st->rbuf, &ca)) {
done=True;
break;
}
}
static bool_t udp_sendmsg(void *commst, struct buffer_if *buf,
- struct sockaddr_in *dest)
+ const struct comm_addr *dest)
{
struct udp *st=commst;
uint8_t *sa;
if (st->use_proxy) {
sa=buf->start-8;
- memcpy(sa,&dest->sin_addr,4);
+ memcpy(sa,&dest->sin.sin_addr,4);
memset(sa+4,0,4);
- memcpy(sa+6,&dest->sin_port,2);
+ memcpy(sa+6,&dest->sin.sin_port,2);
sendto(st->fd,sa,buf->size+8,0,(struct sockaddr *)&st->proxy,
sizeof(st->proxy));
} else {
sendto(st->fd, buf->start, buf->size, 0,
- (struct sockaddr *)dest, sizeof(*dest));
+ (struct sockaddr *)&dest->sin, sizeof(dest->sin));
}
return True;