/* polypath
* send/receive module for secnet
* for multi-route setups */
+/*
+ * 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 d 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.
+ */
#include "secnet.h"
#include "util.h"
* and
* out:
*/
-#define BAD(m) do{ bad(st,badctx,m,0); goto out; }while(0)
-#define BADE(m,ev) do{ bad(st,badctx,m,ev); goto out; }while(0)
+#define BAD(m) do{ bad(st,badctx,M_WARNING,m,0); goto out; }while(0)
+#define BADE(m,ev) do{ bad(st,badctx,M_WARNING,m,ev); goto out; }while(0)
typedef void bad_fn_type(struct polypath *st, void *badctx,
- const char* m, int ev);
+ int mclass, const char* m, int ev);
typedef void polypath_ppml_callback_type(struct polypath *st,
bad_fn_type *bad, void *badctx,
char *undospace;
};
-static void ppml_bad(struct polypath *st, void *badctx, const char *m, int ev)
+static void ppml_bad(struct polypath *st, void *badctx,
+ int mclass, const char *m, int ev)
{
struct ppml_bad_ctx *bc=badctx;
if (bc->undospace)
*(bc->undospace)=' ';
- lg_perror(LG,M_WARNING,ev,
+ lg_perror(LG,mclass,ev,
"error processing polypath state change: %s"
" (while processing `%s')",
m,bc->orgl);
DONT("IPv6 address is " m)
DONTMASK( 100, 0, 8, "Discard-Only (RFC6666)");
DONTMASK(2001, 0, 23, "in IETF protocol block (RFC2928)");
+ DONTMASK(fc00, 0, 7, "Uniqe Local unicast (RFC4193)");
#undef DONTMASK
break;
}
interf->socks.n_socks=0;
FILLZERO(interf->experienced_xmit_noaf);
LIST_INSERT_HEAD(&st->interfs,interf,entry);
- udp_socks_register(&st->uc,&interf->socks);
interf->name=strdup(ifname);
+ udp_socks_register(&st->uc,&interf->socks,interf->name);
if (!interf->name) BADE("strdup interface name",errno);
found_interf:
bool_t ok=polypath_make_socket(st,bad,badctx, us,ifname);
if (!ok) goto out;
} else {
- FILLZERO(us->experienced);
- us->fd=fd;
+ bool_t ok=udp_import_socket(uc,us,M_WARNING,fd);
+ if (!ok) goto out;
fd=-1;
}
interf->socks.n_socks++;
+ lg_perror(LG,M_INFO,0,"using %s %s",ifname,
+ iaddr_to_string(&us->addr));
us=0; /* do not destroy this socket during `out' */
- lg_perror(LG,M_INFO,0,"using %s %s",ifname,ifaddr);
} else {
int i;
for (i=0; i<interf->socks.n_socks; i++)
- if (!memcmp(&interf->socks.socks[i].addr,ia,sizeof(*ia)))
+ if (iaddr_equal(&interf->socks.socks[i].addr,ia,True))
goto address_remove_found;
- BAD("address to remove not found");
+ bad(st,badctx,M_DEBUG,"address to remove not found",0);
+ goto out;
address_remove_found:
- lg_perror(LG,M_INFO,0,"removed %s %s",ifname,ifaddr);
+ lg_perror(LG,M_INFO,0,"removed %s %s",ifname,
+ iaddr_to_string(&interf->socks.socks[i].addr));
udp_destroy_socket(&st->uc,&interf->socks.socks[i]);
interf->socks.socks[i]=
interf->socks.socks[--interf->socks.n_socks];
attempted=True;
int r=sendto(us->fd,buf->start,buf->size,
0,&dest->ia.sa,iaddr_socklen(&dest->ia));
- udp_sock_experienced(0,&st->uc, interf->name,us,
- 1,af, r,errno);
+ udp_sock_experienced(0,&st->uc,&interf->socks,us,
+ &dest->ia,af, r,errno);
if (r>=0) {
reasonable=True;
break;
union iaddr ia;
};
-static void papp_bad(struct polypath *st, void *badctx, const char *m, int ev)
+static void papp_bad(struct polypath *st, void *badctx,
+ int mclass, const char *m, int ev)
{
const struct privsep_mdata *mdata=(const void*)st->lbuf.start;
const char *addr_str=badctx;
- lg_perror(LG,M_WARNING,ev,
+ lg_perror(LG,mclass,ev,
"error processing polypath address change %s %s [%s]: %s",
mdata->add ? "+" : "-",
mdata->ifname, addr_str, m);