On Wed, Dec 11, 2019 at 04:52:53PM +0100, Denis Fondras wrote:
> 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);
>
While it makes sense to pass the ibuf like in ospfd I see no reason to
switch to sendmsg(). In ospfd this is done to prepend the IP header but
that seems not needed here. Is there another reason to switch to
sendmsg()?
--
:wq Claudio