Use sendmsg() instead of sendto() like ospfd(8) does.

Index: database.c
===================================================================
RCS file: /cvs/src/usr.sbin/ospf6d/database.c,v
retrieving revision 1.16
diff -u -p -r1.16 database.c
--- database.c  10 May 2019 13:50:34 -0000      1.16
+++ database.c  8 Dec 2019 14:55:57 -0000
@@ -147,7 +147,7 @@ send_db_description(struct nbr *nbr)
                goto fail;
 
        /* transmit packet */
-       ret = send_packet(nbr->iface, buf->buf, buf->wpos, &dst);
+       ret = send_packet(nbr->iface, buf, &dst);
 done:
        ibuf_free(buf);
        return (ret);
Index: hello.c
===================================================================
RCS file: /cvs/src/usr.sbin/ospf6d/hello.c,v
retrieving revision 1.18
diff -u -p -r1.18 hello.c
--- hello.c     22 Feb 2018 07:43:29 -0000      1.18
+++ hello.c     8 Dec 2019 14:55:57 -0000
@@ -104,7 +104,7 @@ send_hello(struct iface *iface)
        if (upd_ospf_hdr(buf, iface))
                goto fail;
 
-       ret = send_packet(iface, buf->buf, buf->wpos, &dst);
+       ret = send_packet(iface, buf, &dst);
 
        ibuf_free(buf);
        return (ret);
Index: lsack.c
===================================================================
RCS file: /cvs/src/usr.sbin/ospf6d/lsack.c,v
retrieving revision 1.6
diff -u -p -r1.6 lsack.c
--- lsack.c     25 Oct 2014 03:23:49 -0000      1.6
+++ lsack.c     8 Dec 2019 14:55:57 -0000
@@ -55,7 +55,7 @@ send_ls_ack(struct iface *iface, struct 
        if (upd_ospf_hdr(buf, iface))
                goto fail;
 
-       ret = send_packet(iface, buf->buf, buf->wpos, &addr);
+       ret = send_packet(iface, buf, &addr);
 
        ibuf_free(buf);
        return (ret);
Index: lsreq.c
===================================================================
RCS file: /cvs/src/usr.sbin/ospf6d/lsreq.c,v
retrieving revision 1.9
diff -u -p -r1.9 lsreq.c
--- lsreq.c     10 May 2019 13:50:34 -0000      1.9
+++ lsreq.c     8 Dec 2019 14:55:58 -0000
@@ -77,7 +77,7 @@ send_ls_req(struct nbr *nbr)
        if (upd_ospf_hdr(buf, nbr->iface))
                goto fail;
 
-       ret = send_packet(nbr->iface, buf->buf, buf->wpos, &dst);
+       ret = send_packet(nbr->iface, buf, &dst);
 
        ibuf_free(buf);
        return (ret);
Index: lsupdate.c
===================================================================
RCS file: /cvs/src/usr.sbin/ospf6d/lsupdate.c,v
retrieving revision 1.13
diff -u -p -r1.13 lsupdate.c
--- lsupdate.c  28 Jan 2015 22:03:17 -0000      1.13
+++ lsupdate.c  8 Dec 2019 14:55:58 -0000
@@ -227,7 +227,7 @@ send_ls_update(struct ibuf *buf, struct 
        if (upd_ospf_hdr(buf, iface))
                goto fail;
 
-       ret = send_packet(iface, buf->buf, buf->wpos, &addr);
+       ret = send_packet(iface, buf, &addr);
 
        ibuf_free(buf);
        return (ret);
Index: ospfe.h
===================================================================
RCS file: /cvs/src/usr.sbin/ospf6d/ospfe.h,v
retrieving revision 1.19
diff -u -p -r1.19 ospfe.h
--- ospfe.h     25 Oct 2014 03:23:49 -0000      1.19
+++ ospfe.h     8 Dec 2019 14:55:58 -0000
@@ -228,7 +228,7 @@ struct lsa_hdr      *lsa_hdr_new(void);
 /* packet.c */
 int     gen_ospf_hdr(struct ibuf *, struct iface *, u_int8_t);
 int     upd_ospf_hdr(struct ibuf *, struct iface *);
-int     send_packet(struct iface *, void *, size_t, struct in6_addr *);
+int     send_packet(struct iface *, struct ibuf *, struct in6_addr *);
 void    recv_packet(int, short, void *);
 
 char   *pkt_ptr;       /* packet buffer */
Index: packet.c
===================================================================
RCS file: /cvs/src/usr.sbin/ospf6d/packet.c,v
retrieving revision 1.15
diff -u -p -r1.15 packet.c
--- packet.c    10 May 2019 01:29:31 -0000      1.15
+++ packet.c    8 Dec 2019 14:55:58 -0000
@@ -78,10 +78,12 @@ upd_ospf_hdr(struct ibuf *buf, struct if
 
 /* send and receive packets */
 int
-send_packet(struct iface *iface, void *pkt, size_t len,
+send_packet(struct iface *iface, struct ibuf *buf,
     struct in6_addr *dst)
 {
-       struct sockaddr_in6      sa6;
+       struct sockaddr_in6     sa6;
+       struct msghdr           msg;
+       struct iovec            iov[2];
 
        /* setup buffer */
        bzero(&sa6, sizeof(sa6));
@@ -102,8 +104,15 @@ send_packet(struct iface *iface, void *p
                        return (-1);
                }
 
-       if (sendto(iface->fd, pkt, len, 0, (struct sockaddr *)&sa6,
-           sizeof(sa6)) == -1) {
+       bzero(&msg, sizeof(msg));
+       msg.msg_name = &sa6;
+       msg.msg_namelen = sizeof(sa6);
+       iov[0].iov_base = buf->buf;
+       iov[0].iov_len = ibuf_size(buf);
+       msg.msg_iov = iov;
+       msg.msg_iovlen = 1;
+
+       if (sendmsg(iface->fd, &msg, 0) == -1) {
                log_warn("send_packet: error sending packet on interface %s",
                    iface->name);
                return (-1);

Reply via email to