Subject: rarpd patch for review (Re: port-alpha/11089)
To: None <tech-net@netbsd.org>
From: Andrey Petrov <petrov@netbsd.org>
List: tech-net
Date: 04/06/2003 15:45:01
Hi,

This is quite old patch which fixes rarpd 64 bit problem -
routing socket expects sock_addrs aligned on long boundary.
As a result of misalignment rarpd can not update arp table,
and reports something like 'cannot write routing socket' but
it usually runs as daemon so nobody notices. I've been using it on
alpha since I found it.

If there are no objections I'd like to commit it and close
PR.

	Andrey


Index: mkarp.c
===================================================================
RCS file: /cvsroot/src/usr.sbin/rarpd/mkarp.c,v
retrieving revision 1.4
diff -c -p -r1.4 mkarp.c
*** mkarp.c     2002/07/14 00:58:30     1.4
--- mkarp.c     2003/04/06 22:14:34
*************** __RCSID("$NetBSD: mkarp.c,v 1.4 2002/07/
*** 80,85 ****
--- 80,89 ----
  
  #include "mkarp.h"
  
+ /* Roundup the same way rt_xaddrs does */
+ #define ROUNDUP(a) \
+        ((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long))
+ 
  int   rtmsg(int, int, struct rt_msghdr *, struct sockaddr_inarp *, 
              struct sockaddr_dl *);
  struct        {
*************** rtmsg(int cmd, int s, struct rt_msghdr *
*** 213,219 ****
  #define NEXTADDR(w, s) \
        if (rtm->rtm_addrs & (w)) { \
                (void)memcpy(cp, s, ((struct sockaddr *)s)->sa_len); \
!               cp += ((struct sockaddr *)s)->sa_len;}
  
        NEXTADDR(RTA_DST, sin_m);
        NEXTADDR(RTA_GATEWAY, sdl_m);
--- 217,223 ----
  #define NEXTADDR(w, s) \
        if (rtm->rtm_addrs & (w)) { \
                (void)memcpy(cp, s, ((struct sockaddr *)s)->sa_len); \
!                 cp += ROUNDUP(((struct sockaddr *)s)->sa_len);}
  
        NEXTADDR(RTA_DST, sin_m);
        NEXTADDR(RTA_GATEWAY, sdl_m);