summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClaudio Jeker <claudio@cvs.openbsd.org>2007-10-10 14:09:26 +0000
committerClaudio Jeker <claudio@cvs.openbsd.org>2007-10-10 14:09:26 +0000
commit34c540de32da6090afdcdd6fee481f9a2df345fd (patch)
treecd80eb9d2e40cb44f8f68b64fe72f80016049023
parent00614674fd7c30c31cd6d99eee5ef9d519d5da32 (diff)
send_packet() now takes a struct in6_addr as destination instead of a
struct sockaddr_in6 and builds the struct sockaddr_in6 internaly adding scope if necessary. While there switch to sendto() we don't need any of the sendmsg() features here. OK norby@
-rw-r--r--usr.sbin/ospf6d/database.c14
-rw-r--r--usr.sbin/ospf6d/hello.c11
-rw-r--r--usr.sbin/ospf6d/lsack.c13
-rw-r--r--usr.sbin/ospf6d/lsreq.c14
-rw-r--r--usr.sbin/ospf6d/lsupdate.c10
-rw-r--r--usr.sbin/ospf6d/ospfe.h4
-rw-r--r--usr.sbin/ospf6d/packet.c31
7 files changed, 38 insertions, 59 deletions
diff --git a/usr.sbin/ospf6d/database.c b/usr.sbin/ospf6d/database.c
index 955bc469b40..6eeb4d467ca 100644
--- a/usr.sbin/ospf6d/database.c
+++ b/usr.sbin/ospf6d/database.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: database.c,v 1.1 2007/10/08 10:44:50 norby Exp $ */
+/* $OpenBSD: database.c,v 1.2 2007/10/10 14:09:25 claudio Exp $ */
/*
* Copyright (c) 2005 Claudio Jeker <claudio@openbsd.org>
@@ -40,7 +40,7 @@ void db_sum_list_next(struct nbr *);
int
send_db_description(struct nbr *nbr)
{
- struct sockaddr_in6 dst;
+ struct in6_addr dst;
struct db_dscrp_hdr dd_hdr;
struct lsa_entry *le, *nle;
struct buf *buf;
@@ -113,17 +113,13 @@ send_db_description(struct nbr *nbr)
fatalx("send_db_description: unknown neighbor state");
}
- /* set destination */
- dst.sin6_family = AF_INET6;
- dst.sin6_len = sizeof(struct sockaddr_in6);
-
switch (nbr->iface->type) {
case IF_TYPE_POINTOPOINT:
- inet_pton(AF_INET6, AllSPFRouters, &dst.sin6_addr);
+ inet_pton(AF_INET6, AllSPFRouters, &dst);
dd_hdr.iface_mtu = htons(nbr->iface->mtu);
break;
case IF_TYPE_BROADCAST:
- dst.sin6_addr = nbr->addr;
+ dst = nbr->addr;
dd_hdr.iface_mtu = htons(nbr->iface->mtu);
break;
case IF_TYPE_NBMA:
@@ -131,7 +127,7 @@ send_db_description(struct nbr *nbr)
/* XXX not supported */
break;
case IF_TYPE_VIRTUALLINK:
- dst.sin6_addr = nbr->iface->dst;
+ dst = nbr->iface->dst;
dd_hdr.iface_mtu = 0;
break;
default:
diff --git a/usr.sbin/ospf6d/hello.c b/usr.sbin/ospf6d/hello.c
index 43ba7410c18..26e93bd596a 100644
--- a/usr.sbin/ospf6d/hello.c
+++ b/usr.sbin/ospf6d/hello.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: hello.c,v 1.3 2007/10/10 13:36:01 claudio Exp $ */
+/* $OpenBSD: hello.c,v 1.4 2007/10/10 14:09:25 claudio Exp $ */
/*
* Copyright (c) 2005 Claudio Jeker <claudio@openbsd.org>
@@ -38,19 +38,16 @@ extern struct ospfd_conf *oeconf;
int
send_hello(struct iface *iface)
{
- struct sockaddr_in6 dst;
+ struct in6_addr dst;
struct hello_hdr hello;
struct nbr *nbr;
struct buf *buf;
int ret;
- dst.sin6_family = AF_INET6;
- dst.sin6_len = sizeof(struct sockaddr_in6);
-
switch (iface->type) {
case IF_TYPE_POINTOPOINT:
case IF_TYPE_BROADCAST:
- inet_pton(AF_INET6, AllSPFRouters, &dst.sin6_addr);
+ inet_pton(AF_INET6, AllSPFRouters, &dst);
break;
case IF_TYPE_NBMA:
case IF_TYPE_POINTOMULTIPOINT:
@@ -58,7 +55,7 @@ send_hello(struct iface *iface)
if_type_name(iface->type), iface->name);
return (-1);
case IF_TYPE_VIRTUALLINK:
- dst.sin6_addr = iface->dst;
+ dst = iface->dst;
break;
default:
fatalx("send_hello: unknown interface type");
diff --git a/usr.sbin/ospf6d/lsack.c b/usr.sbin/ospf6d/lsack.c
index 945d34467b5..781dfcfeac6 100644
--- a/usr.sbin/ospf6d/lsack.c
+++ b/usr.sbin/ospf6d/lsack.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: lsack.c,v 1.1 2007/10/08 10:44:50 norby Exp $ */
+/* $OpenBSD: lsack.c,v 1.2 2007/10/10 14:09:25 claudio Exp $ */
/*
* Copyright (c) 2004, 2005, 2007 Esben Norby <norby@openbsd.org>
@@ -37,18 +37,13 @@ void start_ls_ack_tx_timer_now(struct iface *);
int
send_ls_ack(struct iface *iface, struct in6_addr addr, void *data, size_t len)
{
- struct sockaddr_in6 dst;
- struct buf *buf;
- int ret;
+ struct buf *buf;
+ int ret;
/* XXX READ_BUF_SIZE */
if ((buf = buf_dynamic(PKG_DEF_SIZE, READ_BUF_SIZE)) == NULL)
fatal("send_ls_ack");
- dst.sin6_family = AF_INET6;
- dst.sin6_len = sizeof(struct sockaddr_in6);
- dst.sin6_addr = addr; /* XXX */
-
/* OSPF header */
if (gen_ospf_hdr(buf, iface, PACKET_TYPE_LS_ACK))
goto fail;
@@ -61,7 +56,7 @@ send_ls_ack(struct iface *iface, struct in6_addr addr, void *data, size_t len)
if (upd_ospf_hdr(buf, iface))
goto fail;
- ret = send_packet(iface, buf->buf, buf->wpos, &dst);
+ ret = send_packet(iface, buf->buf, buf->wpos, &addr);
buf_free(buf);
return (ret);
diff --git a/usr.sbin/ospf6d/lsreq.c b/usr.sbin/ospf6d/lsreq.c
index 76c92129b65..40ea4d25511 100644
--- a/usr.sbin/ospf6d/lsreq.c
+++ b/usr.sbin/ospf6d/lsreq.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: lsreq.c,v 1.1 2007/10/08 10:44:50 norby Exp $ */
+/* $OpenBSD: lsreq.c,v 1.2 2007/10/10 14:09:25 claudio Exp $ */
/*
* Copyright (c) 2004, 2005, 2007 Esben Norby <norby@openbsd.org>
@@ -33,7 +33,7 @@ extern struct imsgbuf *ibuf_rde;
int
send_ls_req(struct nbr *nbr)
{
- struct sockaddr_in6 dst;
+ struct in6_addr dst;
struct ls_req_hdr ls_req_hdr;
struct lsa_entry *le, *nle;
struct buf *buf;
@@ -42,21 +42,15 @@ send_ls_req(struct nbr *nbr)
if ((buf = buf_open(nbr->iface->mtu - sizeof(struct ip))) == NULL)
fatal("send_ls_req");
- /* set destination */
- dst.sin6_family = AF_INET6;
- dst.sin6_len = sizeof(struct sockaddr_in6);
-
switch (nbr->iface->type) {
case IF_TYPE_POINTOPOINT:
-//XXX inet_aton(AllSPFRouters, &dst.sin_addr);
- inet_pton(AF_INET6, AllSPFRouters, &dst.sin6_addr);
+ inet_pton(AF_INET6, AllSPFRouters, &dst);
break;
case IF_TYPE_BROADCAST:
case IF_TYPE_NBMA:
case IF_TYPE_POINTOMULTIPOINT:
case IF_TYPE_VIRTUALLINK:
-//XXX dst.sin_addr.s_addr = nbr->addr.s_addr;
- dst.sin6_addr = nbr->addr;
+ dst = nbr->addr;
break;
default:
fatalx("send_ls_req: unknown interface type");
diff --git a/usr.sbin/ospf6d/lsupdate.c b/usr.sbin/ospf6d/lsupdate.c
index 9dcca18409a..a0bf916e74c 100644
--- a/usr.sbin/ospf6d/lsupdate.c
+++ b/usr.sbin/ospf6d/lsupdate.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: lsupdate.c,v 1.1 2007/10/08 10:44:50 norby Exp $ */
+/* $OpenBSD: lsupdate.c,v 1.2 2007/10/10 14:09:25 claudio Exp $ */
/*
* Copyright (c) 2005 Claudio Jeker <claudio@openbsd.org>
@@ -200,7 +200,6 @@ int
send_ls_update(struct buf *buf, struct iface *iface, struct in6_addr addr,
u_int32_t nlsa)
{
- struct sockaddr_in6 dst;
int ret;
nlsa = htonl(nlsa);
@@ -210,12 +209,7 @@ send_ls_update(struct buf *buf, struct iface *iface, struct in6_addr addr,
if (upd_ospf_hdr(buf, iface))
goto fail;
- /* set destination */
- dst.sin6_family = AF_INET6;
- dst.sin6_len = sizeof(struct sockaddr_in6);
- dst.sin6_addr = addr;
-
- ret = send_packet(iface, buf->buf, buf->wpos, &dst);
+ ret = send_packet(iface, buf->buf, buf->wpos, &addr);
buf_free(buf);
return (ret);
diff --git a/usr.sbin/ospf6d/ospfe.h b/usr.sbin/ospf6d/ospfe.h
index 903d982f17c..5b8ba269187 100644
--- a/usr.sbin/ospf6d/ospfe.h
+++ b/usr.sbin/ospf6d/ospfe.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: ospfe.h,v 1.3 2007/10/09 06:26:47 claudio Exp $ */
+/* $OpenBSD: ospfe.h,v 1.4 2007/10/10 14:09:25 claudio Exp $ */
/*
* Copyright (c) 2004, 2005 Esben Norby <norby@openbsd.org>
@@ -225,7 +225,7 @@ struct lsa_hdr *lsa_hdr_new(void);
/* packet.c */
int gen_ospf_hdr(struct buf *, struct iface *, u_int8_t);
int upd_ospf_hdr(struct buf *, struct iface *);
-int send_packet(struct iface *, void *, size_t, struct sockaddr_in6 *);
+int send_packet(struct iface *, void *, size_t, struct in6_addr *);
void recv_packet(int, short, void *);
char *pkt_ptr; /* packet buffer */
diff --git a/usr.sbin/ospf6d/packet.c b/usr.sbin/ospf6d/packet.c
index a872050f665..da471d98a70 100644
--- a/usr.sbin/ospf6d/packet.c
+++ b/usr.sbin/ospf6d/packet.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: packet.c,v 1.2 2007/10/09 06:26:47 claudio Exp $ */
+/* $OpenBSD: packet.c,v 1.3 2007/10/10 14:09:25 claudio Exp $ */
/*
* Copyright (c) 2004, 2005 Esben Norby <norby@openbsd.org>
@@ -80,21 +80,23 @@ upd_ospf_hdr(struct buf *buf, struct iface *iface)
/* send and receive packets */
int
send_packet(struct iface *iface, void *pkt, size_t len,
- struct sockaddr_in6 *dst)
+ struct in6_addr *dst)
{
- struct msghdr msg;
- struct iovec iov[1];
+ struct sockaddr_in6 sa6;
+
/* setup buffer */
- bzero(&msg, sizeof(msg));
- iov[0].iov_base = pkt;
- iov[0].iov_len = len;
- msg.msg_name = dst;
- msg.msg_namelen = sizeof(*dst);
- msg.msg_iov = iov;
- msg.msg_iovlen = 1;
+ bzero(&sa6, sizeof(sa6));
+
+ sa6.sin6_family = AF_INET6;
+ sa6.sin6_len = sizeof(sa6);
+ sa6.sin6_addr = *dst;
+
+ /* don't we all love link local scope and all the needed hacks for it */
+ if (IN6_IS_ADDR_LINKLOCAL(dst) || IN6_IS_ADDR_MC_LINKLOCAL(dst))
+ sa6.sin6_scope_id = iface->ifindex;
/* set outgoing interface for multicast traffic */
- if (IN6_IS_ADDR_MULTICAST(&dst->sin6_addr))
+ if (IN6_IS_ADDR_MULTICAST(dst))
if (if_set_mcast(iface) == -1) {
log_warn("send_packet: error setting multicast "
"interface, %s", iface->name);
@@ -102,8 +104,9 @@ send_packet(struct iface *iface, void *pkt, size_t len,
}
log_debug("send_packet: iface %d addr %s dest %s", iface->ifindex,
- log_in6addr(&iface->addr), log_in6addr(&dst->sin6_addr));
- if (sendmsg(iface->fd, &msg, MSG_DONTROUTE) == -1) {
+ log_in6addr(&iface->addr), log_sockaddr((void *)&sa6));
+ if (sendto(iface->fd, pkt, len, MSG_DONTROUTE, (struct sockaddr *)&sa6,
+ sizeof(sa6)) == -1) {
log_warn("send_packet: error sending packet on interface %s",
iface->name);
return (-1);