X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=secnet.git;a=blobdiff_plain;f=udp.c;h=d1ada01f6f1d83eb56dce10336a1b33a552bc927;hp=dde73efb53eb4fe8d0af4555ff30f492bfbab82d;hb=HEAD;hpb=b3877445fa32f46d70057212cb38347ae1bf4955 diff --git a/udp.c b/udp.c index dde73ef..d1ada01 100644 --- a/udp.c +++ b/udp.c @@ -1,5 +1,24 @@ /* UDP send/receive module for secnet */ +/* + * This file is part of secnet. + * See README for full list of copyright holders. + * + * secnet 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. + * + * secnet 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 + * version 3 along with secnet; if not, see + * https://www.gnu.org/licenses/gpl.html. + */ + /* This module enables sites to communicate by sending UDP * packets. When an instance of the module is created we can * optionally bind to a particular local IP address (not implemented @@ -31,6 +50,7 @@ struct udp { struct udpcommon uc; struct udpsocks socks; bool_t addr_configured; + unsigned counter; }; /* @@ -53,7 +73,8 @@ static const char *udp_addr_to_string(void *commst, const struct comm_addr *ca) int ix=ca->ix>=0 ? ca->ix : 0; assert(ix>=0 && ixn_socks); - snprintf(sbuf, sizeof(sbuf), "udp:%s%s-%s", + snprintf(sbuf, sizeof(sbuf), "udp#%u@l%d:%s%s-%s", + st->counter, st->uc.cc.loc.line, iaddr_to_string(&socks->socks[ix].addr), ca->ix<0 && socks->n_socks>1 ? "&" : "", iaddr_to_string(&ca->ia)); @@ -152,7 +173,7 @@ static void udp_socks_afterpoll(void *state, struct pollfd *fds, int nfds) ca.comm=&cc->ops; ca.ia=from; ca.ix=i; - done=comm_notify(&cc->notify, cc->rbuf, &ca); + done=comm_notify(cc, cc->rbuf, &ca); if (done) { udp_sock_experienced(0,uc,socks,us,0, from.sa.sa_family,0,0); @@ -165,7 +186,9 @@ static void udp_socks_afterpoll(void *state, struct pollfd *fds, int nfds) /* Manufacture and send NAK packet */ source=get_uint32(cc->rbuf->start); /* Us */ dest=get_uint32(cc->rbuf->start+4); /* Them */ - send_nak(&ca,source,dest,msgtype,cc->rbuf,"unwanted"); + send_nak(&ca,source,dest,msgtype,cc->rbuf, + priomsg_getmessage(&cc->why_unwanted, + "unwanted")); } BUF_FREE(cc->rbuf); } @@ -180,7 +203,8 @@ static void udp_socks_afterpoll(void *state, struct pollfd *fds, int nfds) } static bool_t udp_sendmsg(void *commst, struct buffer_if *buf, - const struct comm_addr *dest) + const struct comm_addr *dest, + struct comm_clientinfo *clientinfo) { struct udp *st=commst; struct udpcommon *uc=&st->uc; @@ -247,7 +271,8 @@ static bool_t record_socket_gotaddr(struct udpcommon *uc, struct udpsock *us, socklen_t salen=sizeof(us->addr); int r=getsockname(us->fd,&us->addr.sa,&salen); if (r) FAIL("getsockname()"); - if (salen>sizeof(us->addr)) { errno=0; FAIL("getsockname() length"); } + if ((size_t)salen>sizeof(us->addr)) /* cast squashes clang warning */ + { errno=0; FAIL("getsockname() length"); } return True; failed: @@ -414,6 +439,8 @@ static void udp_phase_hook(void *sst, uint32_t new_phase) static list_t *udp_apply(closure_t *self, struct cloc loc, dict_t *context, list_t *args) { + static unsigned counter; + struct udp *st; list_t *caddrl; list_t *l; @@ -428,6 +455,8 @@ static list_t *udp_apply(closure_t *self, struct cloc loc, dict_t *context, struct udpsocks *socks=&st->socks; struct commcommon *cc=&uc->cc; + st->counter=counter++; + union iaddr defaultaddrs[] = { #ifdef CONFIG_IPV6 { .sin6 = { .sin6_family=AF_INET6,