ok yasuoka

thanks,

On Mon, 10 Oct 2016 13:48:18 +1000
David Gwynne <[email protected]> wrote:
> if the arch can cope with prepending on an unaligned address in
> vxlan, then let it do it.
> 
> this means less work if we can get away with it.
> 
> ok?
> 
> Index: if_vxlan.c
> ===================================================================
> RCS file: /cvs/src/sys/net/if_vxlan.c,v
> retrieving revision 1.49
> diff -u -p -r1.49 if_vxlan.c
> --- if_vxlan.c        7 Oct 2016 06:16:03 -0000       1.49
> +++ if_vxlan.c        10 Oct 2016 03:42:36 -0000
> @@ -766,20 +765,29 @@ vxlan_output(struct ifnet *ifp, struct m
>  #endif
>       int                      error, af;
>       uint32_t                 tag;
> -     struct mbuf             *m0;
>  
>       /* VXLAN header */
> -     MGETHDR(m0, M_DONTWAIT, m->m_type);
> -     if (m0 == NULL) {
> -             ifp->if_oerrors++;
> -             return (ENOBUFS);
> +     if (!ALIGNED_POINTER(mtod(m, caddr_t), uint32_t)) {
> +             struct mbuf *m0;
> +
> +             MGETHDR(m0, M_DONTWAIT, m->m_type);
> +             if (m0 == NULL) {
> +                     ifp->if_oerrors++;
> +                     return (ENOBUFS);
> +             }
> +             M_MOVE_PKTHDR(m0, m);
> +             m0->m_next = m;
> +             m = m0;
> +             MH_ALIGN(m, sizeof(*vu));
> +             m->m_len = sizeof(*vu);
> +             m->m_pkthdr.len += sizeof(*vu);
> +     } else {
> +             M_PREPEND(m, sizeof(*vu), M_DONTWAIT);
> +             if (m == NULL) {
> +                     ifp->if_oerrors++;
> +                     return (ENOBUFS);
> +             }
>       }
> -     M_MOVE_PKTHDR(m0, m);
> -     m0->m_next = m;
> -     m = m0;
> -     MH_ALIGN(m, sizeof(*vu));
> -     m->m_len = sizeof(*vu);
> -     m->m_pkthdr.len += sizeof(*vu);
>  
>       src = (struct sockaddr *)&sc->sc_src;
>       dst = (struct sockaddr *)&sc->sc_dst;
> 

Reply via email to