Home | History | Annotate | Download | only in src
      1 /*-
      2  * Copyright (c) 1998 Brian Somers <brian (at) Awfulhak.org>
      3  * All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions
      7  * are met:
      8  * 1. Redistributions of source code must retain the above copyright
      9  *    notice, this list of conditions and the following disclaimer.
     10  * 2. Redistributions in binary form must reproduce the above copyright
     11  *    notice, this list of conditions and the following disclaimer in the
     12  *    documentation and/or other materials provided with the distribution.
     13  *
     14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
     15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
     18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     24  * SUCH DAMAGE.
     25  *
     26  * $FreeBSD: src/usr.sbin/ppp/ua.h,v 1.3.62.1 2010/12/21 17:10:29 kensmith Exp $
     27  */
     28 
     29 #ifdef __i386__		/* Do any other archs not care about alignment ? */
     30 
     31 #  define ua_htonl(src, tgt) (*(u_int32_t *)(tgt) = htonl(*(u_int32_t *)(src)))
     32 #  define ua_ntohl(src, tgt) (*(u_int32_t *)(tgt) = ntohl(*(u_int32_t *)(src)))
     33 #  define ua_htons(src, tgt) (*(u_int16_t *)(tgt) = htons(*(u_int16_t *)(src)))
     34 #  define ua_ntohs(src, tgt) (*(u_int16_t *)(tgt) = ntohs(*(u_int16_t *)(src)))
     35 
     36 #else	/* We care about alignment (or else drop a core !) */
     37 
     38 #  define ua_htonl(src, tgt)				\
     39     do {						\
     40       u_int32_t __oh;					\
     41       memcpy(&__oh, (src), sizeof __oh);		\
     42       *(u_char *)(tgt) = __oh >> 24;			\
     43       *((u_char *)(tgt) + 1) = (__oh >> 16) & 0xff;	\
     44       *((u_char *)(tgt) + 2) = (__oh >> 8) & 0xff;	\
     45       *((u_char *)(tgt) + 3) = __oh & 0xff;		\
     46     } while (0)
     47 
     48 #  define ua_ntohl(src, tgt)				\
     49     do {						\
     50       u_int32_t __nh;					\
     51       __nh = ((u_int32_t)*(u_char *)(src) << 24) |	\
     52           ((u_int32_t)*((u_char *)(src) + 1) << 16) |	\
     53           ((u_int32_t)*((u_char *)(src) + 2) << 8) |	\
     54           (u_int32_t)*((u_char *)(src) + 3);		\
     55       memcpy((tgt), &__nh, sizeof __nh);		\
     56     } while (0)
     57 
     58 #  define ua_htons(src, tgt)				\
     59     do {						\
     60       u_int16_t __oh;					\
     61       memcpy(&__oh, (src), sizeof __oh);		\
     62       *(u_char *)(tgt) = __oh >> 8;			\
     63       *((u_char *)(tgt) + 1) = __oh & 0xff;		\
     64     } while (0)
     65 
     66 #  define ua_ntohs(src, tgt)				\
     67     do {						\
     68       u_int16_t __nh;					\
     69       __nh = ((u_int16_t)*(u_char *)(src) << 8) |	\
     70           (u_int16_t)*((u_char *)(src) + 1);		\
     71       memcpy((tgt), &__nh, sizeof __nh);		\
     72     } while (0)
     73 
     74 #endif
     75