On Mon, Feb 09, 2009 at 02:22:08AM -0800, patrick keshishian wrote:
> On Mon, Feb 9, 2009 at 12:53 AM, Claudio Jeker <cje...@diehard.n-r-g.com> 
> wrote:
> >> On a hunch, I tried a 64bit and a 32 bit machine with 1 prefix each.
> >> The 32bit machine adds routes to the kernel without complaint.  The
> >> 64bit machine complained with send_rtmsg....
> >>
> >
> > Arrg. IPv6 is once again broken by design. For some ridiculous reason
> > struct sockaddr_in6's size is 28 bytes. So IPv6 fucks up alignment on 64 bit
> > archs. All hail link local addressing and all the crappy workarounds
> > needed for it.
> 
> Maybe it is too late for me to be thinking about this ... but could
> you explain the diff below? Unless I'm missing something obvious, it
> looks like it changes behavior for non-64bit archs as well.
> 

Hmm. I think your right. I think a different approach would be better.
Will cook up something later today.

> --patrick
> 
> 
> > Please try the attached diff.
> > --
> > :wq Claudio
> >
> > Index: kroute.c
> > ===================================================================
> > RCS file: /cvs/src/usr.sbin/bgpd/kroute.c,v
> > retrieving revision 1.164
> > diff -u -p -r1.164 kroute.c
> > --- kroute.c    9 Feb 2009 08:20:11 -0000       1.164
> > +++ kroute.c    9 Feb 2009 08:49:00 -0000
> > @@ -2057,12 +2057,14 @@ retry:
> >  int
> >  send_rt6msg(int fd, int action, struct kroute6 *kroute)
> >  {
> > -       struct iovec            iov[5];
> > +       struct iovec            iov[8];
> >        struct rt_msghdr        hdr;
> >        struct sockaddr_in6     prefix;
> >        struct sockaddr_in6     nexthop;
> >        struct sockaddr_in6     mask;
> >        struct sockaddr_rtlabel label;
> > +       char                    grmbl[sizeof(long) - (sizeof(prefix) &
> > +                                   (sizeof(long) - 1))];
> >        int                     iovcnt = 0;
> >
> >        if (kr_state.fib_sync == 0)
> > @@ -2070,6 +2072,7 @@ send_rt6msg(int fd, int action, struct k
> >
> >        /* initialize header */
> >        bzero(&hdr, sizeof(hdr));
> > +       bzero(grmbl, sizeof(grmbl));
> >        hdr.rtm_version = RTM_VERSION;
> >        hdr.rtm_type = action;
> >        hdr.rtm_tableid = kr_state.rtableid;
> > @@ -2096,6 +2099,11 @@ send_rt6msg(int fd, int action, struct k
> >        /* adjust iovec */
> >        iov[iovcnt].iov_base = &prefix;
> >        iov[iovcnt++].iov_len = sizeof(prefix);
> > +       /* don't we all love IPv6 */
> > +       hdr.rtm_msglen += sizeof(grmbl);
> > +       iov[iovcnt].iov_base = &grmbl;
> > +       iov[iovcnt++].iov_len = sizeof(grmbl);
> > +
> >
> >        if (memcmp(&kroute->nexthop, &in6addr_any, sizeof(struct in6_addr))) 
> > {
> >                bzero(&nexthop, sizeof(nexthop));
> > @@ -2110,6 +2118,10 @@ send_rt6msg(int fd, int action, struct k
> >                /* adjust iovec */
> >                iov[iovcnt].iov_base = &nexthop;
> >                iov[iovcnt++].iov_len = sizeof(nexthop);
> > +               /* don't we all love IPv6 */
> > +               hdr.rtm_msglen += sizeof(grmbl);
> > +               iov[iovcnt].iov_base = &grmbl;
> > +               iov[iovcnt++].iov_len = sizeof(grmbl);
> >        }
> >
> >        bzero(&mask, sizeof(mask));
> > @@ -2123,6 +2135,10 @@ send_rt6msg(int fd, int action, struct k
> >        /* adjust iovec */
> >        iov[iovcnt].iov_base = &mask;
> >        iov[iovcnt++].iov_len = sizeof(mask);
> > +       /* don't we all love IPv6 */
> > +       hdr.rtm_msglen += sizeof(grmbl);
> > +       iov[iovcnt].iov_base = &grmbl;
> > +       iov[iovcnt++].iov_len = sizeof(grmbl);
> >
> >        if (kroute->labelid) {
> >                bzero(&label, sizeof(label));
> 

-- 
:wq Claudio

Reply via email to