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

Reply via email to