#define _AESOPT_H
#include <asterisk/aes.h>
+#include <asterisk/endian.h>
/* CONFIGURATION - USE OF DEFINES
#if clauses.
*/
-/* PLATFORM SPECIFIC INCLUDES */
-
-#if defined( __OpenBSD__ )
-# include <machine/types.h>
-# include <sys/endian.h>
-#elif defined( __FreeBSD__ ) || defined( __NetBSD__ )
-# include <sys/types.h>
-# include <sys/endian.h>
-#elif defined( BSD ) && ( BSD >= 199103 ) || defined(__APPLE__)
-# include <machine/endian.h>
-#elif defined ( SOLARIS )
-# include <solaris-compat/compat.h>
-#elif defined( __GNUC__ ) || defined( __GNU_LIBRARY__ )
-# include <endian.h>
-#if !defined(__APPLE__)
-# include <byteswap.h>
-#endif
-#elif defined( linux )
-# include <endian.h>
-#endif
-
/* BYTE ORDER IN 32-BIT WORDS
To obtain the highest speed on processors with 32-bit words, this code
#include <asterisk/cli.h>
#include <asterisk/utils.h>
#include <asterisk/causes.h>
+#include <asterisk/endian.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
-#include <endian.h>
#define ALSA_PCM_NEW_HW_PARAMS_API
#define ALSA_PCM_NEW_SW_PARAMS_API
#include <asterisk/cli.h>
#include <asterisk/utils.h>
#include <asterisk/causes.h>
+#include <asterisk/endian.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
-#if defined( __OpenBSD__ )
-# include <sys/endian.h>
-#elif defined( __FreeBSD__ ) || defined( __NetBSD__ )
-# include <sys/endian.h>
-#elif defined( BSD ) && ( BSD >= 199103 ) || defined(__APPLE__)
-# include <machine/endian.h>
-#elif defined ( SOLARIS )
-# include <solaris-compat/compat.h>
-#elif defined( __GNUC__ ) || defined( __GNU_LIBRARY__ )
-# include <endian.h>
-#if !defined(__APPLE__)
-# include <byteswap.h>
-#endif
-#elif defined( linux )
-# include <endian.h>
-#endif
-
#ifdef __linux
#include <linux/soundcard.h>
#elif defined(__FreeBSD__)
#include <netinet/in.h>
#include <asterisk/frame.h>
#include <asterisk/utils.h>
+#include <asterisk/unaligned.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
static int iframes = 0;
static int oframes = 0;
-#if defined(SOLARIS) && defined(__sparc__)
-static unsigned int get_uint32(unsigned char *p)
-{
- return (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3];
-}
-
-static unsigned short get_uint16(unsigned char *p)
-{
- return (p[0] << 8) | p[1] ;
-}
-
-#else
-#define get_uint32(p) (*((unsigned int *)(p)))
-#define get_uint16(p) (*((unsigned short *)(p)))
-#endif
-
static void internaloutput(const char *str)
{
fputs(str, stdout);
static void dump_int(char *output, int maxlen, void *value, int len)
{
if (len == (int)sizeof(unsigned int))
- snprintf(output, maxlen, "%lu", (unsigned long)ntohl(get_uint32(value)));
+ snprintf(output, maxlen, "%lu", (unsigned long)ntohl(get_unaligned_uint32(value)));
else
snprintf(output, maxlen, "Invalid INT");
}
static void dump_short(char *output, int maxlen, void *value, int len)
{
if (len == (int)sizeof(unsigned short))
- snprintf(output, maxlen, "%d", ntohs(get_uint16(value)));
+ snprintf(output, maxlen, "%d", ntohs(get_unaligned_uint16(value)));
else
snprintf(output, maxlen, "Invalid SHORT");
}
{
char buf[256] = "";
if (len == (int)sizeof(unsigned int))
- snprintf(output, maxlen, "%lu (%s)", (unsigned long)ntohl(get_uint32(value)),
- iax_provflags2str(buf, sizeof(buf), ntohl(get_uint32(value))));
+ snprintf(output, maxlen, "%lu (%s)", (unsigned long)ntohl(get_unaligned_uint32(value)),
+ iax_provflags2str(buf, sizeof(buf), ntohl(get_unaligned_uint32(value))));
else
snprintf(output, maxlen, "Invalid INT");
}
snprintf(tmp, (int)sizeof(tmp), "Expecting capability to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len);
errorf(tmp);
} else
- ies->capability = ntohl(get_uint32(data + 2));
+ ies->capability = ntohl(get_unaligned_uint32(data + 2));
break;
case IAX_IE_FORMAT:
if (len != (int)sizeof(unsigned int)) {
snprintf(tmp, (int)sizeof(tmp), "Expecting format to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len);
errorf(tmp);
} else
- ies->format = ntohl(get_uint32(data + 2));
+ ies->format = ntohl(get_unaligned_uint32(data + 2));
break;
case IAX_IE_LANGUAGE:
ies->language = data + 2;
snprintf(tmp, (int)sizeof(tmp), "Expecting version to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len);
errorf(tmp);
} else
- ies->version = ntohs(get_uint16(data + 2));
+ ies->version = ntohs(get_unaligned_uint16(data + 2));
break;
case IAX_IE_ADSICPE:
if (len != (int)sizeof(unsigned short)) {
snprintf(tmp, (int)sizeof(tmp), "Expecting adsicpe to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len);
errorf(tmp);
} else
- ies->adsicpe = ntohs(get_uint16(data + 2));
+ ies->adsicpe = ntohs(get_unaligned_uint16(data + 2));
break;
case IAX_IE_SAMPLINGRATE:
if (len != (int)sizeof(unsigned short)) {
snprintf(tmp, (int)sizeof(tmp), "Expecting samplingrate to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len);
errorf(tmp);
} else
- ies->samprate = ntohs(get_uint16(data + 2));
+ ies->samprate = ntohs(get_unaligned_uint16(data + 2));
break;
case IAX_IE_DNID:
ies->dnid = data + 2;
snprintf(tmp, (int)sizeof(tmp), "Expecting authmethods to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len);
errorf(tmp);
} else
- ies->authmethods = ntohs(get_uint16(data + 2));
+ ies->authmethods = ntohs(get_unaligned_uint16(data + 2));
break;
case IAX_IE_ENCRYPTION:
if (len != (int)sizeof(unsigned short)) {
snprintf(tmp, (int)sizeof(tmp), "Expecting encryption to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len);
errorf(tmp);
} else
- ies->encmethods = ntohs(get_uint16(data + 2));
+ ies->encmethods = ntohs(get_unaligned_uint16(data + 2));
break;
case IAX_IE_CHALLENGE:
ies->challenge = data + 2;
snprintf(tmp, (int)sizeof(tmp), "Expecting refresh to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len);
errorf(tmp);
} else
- ies->refresh = ntohs(get_uint16(data + 2));
+ ies->refresh = ntohs(get_unaligned_uint16(data + 2));
break;
case IAX_IE_DPSTATUS:
if (len != (int)sizeof(unsigned short)) {
snprintf(tmp, (int)sizeof(tmp), "Expecting dpstatus to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len);
errorf(tmp);
} else
- ies->dpstatus = ntohs(get_uint16(data + 2));
+ ies->dpstatus = ntohs(get_unaligned_uint16(data + 2));
break;
case IAX_IE_CALLNO:
if (len != (int)sizeof(unsigned short)) {
snprintf(tmp, (int)sizeof(tmp), "Expecting callno to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len);
errorf(tmp);
} else
- ies->callno = ntohs(get_uint16(data + 2));
+ ies->callno = ntohs(get_unaligned_uint16(data + 2));
break;
case IAX_IE_CAUSE:
ies->cause = data + 2;
snprintf(tmp, (int)sizeof(tmp), "Expecting msgcount to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len);
errorf(tmp);
} else
- ies->msgcount = ntohs(get_uint16(data + 2));
+ ies->msgcount = ntohs(get_unaligned_uint16(data + 2));
break;
case IAX_IE_AUTOANSWER:
ies->autoanswer = 1;
snprintf(tmp, (int)sizeof(tmp), "Expecting transferid to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len);
errorf(tmp);
} else
- ies->transferid = ntohl(get_uint32(data + 2));
+ ies->transferid = ntohl(get_unaligned_uint32(data + 2));
break;
case IAX_IE_DATETIME:
if (len != (int)sizeof(unsigned int)) {
snprintf(tmp, (int)sizeof(tmp), "Expecting date/time to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len);
errorf(tmp);
} else
- ies->datetime = ntohl(get_uint32(data + 2));
+ ies->datetime = ntohl(get_unaligned_uint32(data + 2));
break;
case IAX_IE_FIRMWAREVER:
if (len != (int)sizeof(unsigned short)) {
snprintf(tmp, (int)sizeof(tmp), "Expecting firmwarever to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len);
errorf(tmp);
} else
- ies->firmwarever = ntohs(get_uint16(data + 2));
+ ies->firmwarever = ntohs(get_unaligned_uint16(data + 2));
break;
case IAX_IE_DEVICETYPE:
ies->devicetype = data + 2;
snprintf(tmp, (int)sizeof(tmp), "Expected block desc to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len);
errorf(tmp);
} else
- ies->fwdesc = ntohl(get_uint32(data + 2));
+ ies->fwdesc = ntohl(get_unaligned_uint32(data + 2));
break;
case IAX_IE_FWBLOCKDATA:
ies->fwdata = data + 2;
errorf(tmp);
} else {
ies->provverpres = 1;
- ies->provver = ntohl(get_uint32(data + 2));
+ ies->provver = ntohl(get_unaligned_uint32(data + 2));
}
break;
case IAX_IE_CALLINGPRES:
snprintf(tmp, (int)sizeof(tmp), "Expecting callingtns to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len);
errorf(tmp);
} else
- ies->calling_tns = ntohs(get_uint16(data + 2));
+ ies->calling_tns = ntohs(get_unaligned_uint16(data + 2));
break;
case IAX_IE_RR_JITTER:
if (len != (int)sizeof(unsigned int)) {
snprintf(tmp, (int)sizeof(tmp), "Expected jitter rr to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len);
errorf(tmp);
} else {
- ies->rr_jitter = ntohl(get_uint32(data + 2));
+ ies->rr_jitter = ntohl(get_unaligned_uint32(data + 2));
}
break;
case IAX_IE_RR_LOSS:
snprintf(tmp, (int)sizeof(tmp), "Expected loss rr to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len);
errorf(tmp);
} else {
- ies->rr_loss = ntohl(get_uint32(data + 2));
+ ies->rr_loss = ntohl(get_unaligned_uint32(data + 2));
}
break;
case IAX_IE_RR_PKTS:
snprintf(tmp, (int)sizeof(tmp), "Expected packets rr to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len);
errorf(tmp);
} else {
- ies->rr_pkts = ntohl(get_uint32(data + 2));
+ ies->rr_pkts = ntohl(get_unaligned_uint32(data + 2));
}
break;
case IAX_IE_RR_DELAY:
snprintf(tmp, (int)sizeof(tmp), "Expected loss rr to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len);
errorf(tmp);
} else {
- ies->rr_delay = ntohs(get_uint16(data + 2));
+ ies->rr_delay = ntohs(get_unaligned_uint16(data + 2));
}
break;
case IAX_IE_RR_DROPPED:
snprintf(tmp, (int)sizeof(tmp), "Expected packets rr to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len);
errorf(tmp);
} else {
- ies->rr_dropped = ntohl(get_uint32(data + 2));
+ ies->rr_dropped = ntohl(get_unaligned_uint32(data + 2));
}
break;
case IAX_IE_RR_OOO:
snprintf(tmp, (int)sizeof(tmp), "Expected packets rr to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len);
errorf(tmp);
} else {
- ies->rr_ooo = ntohl(get_uint32(data + 2));
+ ies->rr_ooo = ntohl(get_unaligned_uint32(data + 2));
}
break;
default:
#include <asterisk/logger.h>
#include <asterisk/channel.h>
#include <asterisk/dns.h>
+#include <asterisk/endian.h>
#define MAX_SIZE 4096
typedef struct {
unsigned id :16; /* query identification number */
-#if BYTE_ORDER == BIG_ENDIAN
+#if __BYTE_ORDER == __BIG_ENDIAN
/* fields in third byte */
unsigned qr: 1; /* response flag */
unsigned opcode: 4; /* purpose of message */
unsigned cd: 1; /* checking disabled by resolver */
unsigned rcode :4; /* response code */
#endif
-#if BYTE_ORDER == LITTLE_ENDIAN || BYTE_ORDER == PDP_ENDIAN
+#if __BYTE_ORDER == __LITTLE_ENDIAN || __BYTE_ORDER == __PDP_ENDIAN
/* fields in third byte */
unsigned rd :1; /* recursion desired */
unsigned tc :1; /* truncated message */
#include <asterisk/logger.h>
#include <asterisk/sched.h>
#include <asterisk/module.h>
+#include <asterisk/endian.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
-#ifdef __linux__
-#include <endian.h>
-#else
-#ifdef SOLARIS
-#include "solaris-compat/compat.h"
-#else
-#include <machine/endian.h>
-#endif
-#endif
#define RATE_40 0
#define RATE_32 1
#include <asterisk/logger.h>
#include <asterisk/sched.h>
#include <asterisk/module.h>
+#include <asterisk/endian.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
-#ifdef __linux__
-#include <endian.h>
-#else
-#ifdef SOLARIS
-#include "solaris-compat/compat.h"
-#else
-#include <machine/endian.h>
-#endif
-#endif
/* Some Ideas for this code came from makeg729e.c by Jeffrey Chilton */
#include <asterisk/logger.h>
#include <asterisk/sched.h>
#include <asterisk/module.h>
+#include <asterisk/endian.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
-#ifdef __linux__
-#include <endian.h>
-#else
-#ifdef SOLARIS
-#include "solaris-compat/compat.h"
-#else
-#include <machine/endian.h>
-#endif
-#endif
#include "msgsm.h"
/* Some Ideas for this code came from makegsme.c by Jeffrey Chilton */
#include <asterisk/logger.h>
#include <asterisk/sched.h>
#include <asterisk/module.h>
+#include <asterisk/endian.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
-#ifdef __linux__
-#include <endian.h>
-#else
-#ifdef SOLARIS
-#include "solaris-compat/compat.h"
-#else
-#include <machine/endian.h>
-#endif
-#endif
/* Some Ideas for this code came from makeh263e.c by Jeffrey Chilton */
#include <asterisk/logger.h>
#include <asterisk/sched.h>
#include <asterisk/module.h>
+#include <asterisk/endian.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
-#ifdef __linux__
-#include <endian.h>
-#else
-#ifdef SOLARIS
-#include "solaris-compat/compat.h"
-#else
-#include <machine/endian.h>
-#endif
-#endif
/* Some Ideas for this code came from makeg729e.c by Jeffrey Chilton */
#include <asterisk/module.h>
#include <asterisk/image.h>
#include <asterisk/lock.h>
+#include <asterisk/endian.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
-#ifdef __linux__
-#include <endian.h>
-#else
-#ifdef SOLARIS
-#include "solaris-compat/compat.h"
-#else
-#include <machine/endian.h>
-#endif
-#endif
static char *desc = "JPEG (Joint Picture Experts Group) Image Format";
#include <asterisk/logger.h>
#include <asterisk/sched.h>
#include <asterisk/module.h>
+#include <asterisk/endian.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
-#ifdef __linux__
-#include <endian.h>
-#else
-#ifdef SOLARIS
-#include "solaris-compat/compat.h"
-#else
-#include <machine/endian.h>
-#endif
-#endif
#define BUF_SIZE 160 /* 160 samples */
#include <asterisk/logger.h>
#include <asterisk/sched.h>
#include <asterisk/module.h>
+#include <asterisk/endian.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
-#ifdef __linux__
-#include <endian.h>
-#else
-#ifdef SOLARIS
-#include "solaris-compat/compat.h"
-#else
-#include <machine/endian.h>
-#endif
-#endif
#define BUF_SIZE 160 /* 160 samples */
#include <asterisk/logger.h>
#include <asterisk/sched.h>
#include <asterisk/module.h>
+#include <asterisk/endian.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
-#ifdef __linux__
-#include <endian.h>
-#else
-#ifdef SOLARIS
-#include "solaris-compat/compat.h"
-#else
-#include <machine/endian.h>
-#endif
-#endif
#define BUF_SIZE 320 /* 320 samples */
#include <asterisk/logger.h>
#include <asterisk/sched.h>
#include <asterisk/module.h>
+#include <asterisk/endian.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
-#ifdef __linux__
-#include <endian.h>
-#else
-#ifdef SOLARIS
-#include "solaris-compat/compat.h"
-#else
-#include <machine/endian.h>
-#endif
-#endif
#define BUF_SIZE 80 /* 160 samples */
#include <asterisk/logger.h>
#include <asterisk/sched.h>
#include <asterisk/module.h>
+#include <asterisk/endian.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
-#ifdef __linux__
-#include <endian.h>
-#else
-#ifdef SOLARIS
-#include "solaris-compat/compat.h"
-#else
-#include <machine/endian.h>
-#endif
-#endif
/* Some Ideas for this code came from makewave.c by Jeffrey Chilton */
#include <asterisk/logger.h>
#include <asterisk/sched.h>
#include <asterisk/module.h>
+#include <asterisk/endian.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
-#ifdef __linux__
-#include <endian.h>
-#else
-#ifdef SOLARIS
-#include "solaris-compat/compat.h"
-#else
-#include <machine/endian.h>
-#endif
-#endif
#include "msgsm.h"
/* Some Ideas for this code came from makewave.c by Jeffrey Chilton */
--- /dev/null
+/*
+ * Asterisk -- A telephony toolkit for Linux.
+ *
+ * Asterisk internal frame definitions.
+ *
+ * Copyright (C) 1999 - 2005, Digium, Inc.
+ *
+ * Mark Spencer <markster@digium.com>
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU Lesser General Public License. Other components of
+ * Asterisk are distributed under The GNU General Public License
+ * only.
+ */
+
+#ifndef _ASTERISK_ENDIAN_H
+#define _ASTERISK_ENDIAN_H
+
+/*
+ * Autodetect system endianess
+ */
+
+#if defined( __OpenBSD__ )
+# include <machine/types.h>
+# include <sys/endian.h>
+#elif defined( __FreeBSD__ ) || defined( __NetBSD__ )
+# include <sys/types.h>
+# include <sys/endian.h>
+#elif defined( BSD ) && ( BSD >= 199103 ) || defined(__APPLE__)
+# include <machine/endian.h>
+#elif defined ( SOLARIS )
+# include <solaris-compat/compat.h>
+#elif defined( __GNUC__ ) || defined( __GNU_LIBRARY__ )
+# include <endian.h>
+#if !defined(__APPLE__)
+# include <byteswap.h>
+#endif
+#elif defined( linux )
+# include <endian.h>
+#endif
+
+#ifndef BYTE_ORDER
+#define BYTE_ORDER __BYTE_ORDER
+#endif
+
+#ifndef __BYTE_ORDER
+#error Endianess needs to be defined
+#endif
+#endif /* _ASTERISK_ENDIAN_H */
+
#include <sys/types.h>
#include <sys/time.h>
-
-#ifdef SOLARIS
-#include "solaris-compat/compat.h"
-#endif
-
-/*
- * Autodetect system endianess
- */
-#ifndef __BYTE_ORDER
-#ifdef __linux__
-#include <endian.h>
-#elif defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__APPLE__)
-#if defined(__OpenBSD__)
-#include <machine/types.h>
-#endif /* __OpenBSD__ */
-#include <machine/endian.h>
-#define __BYTE_ORDER BYTE_ORDER
-#define __LITTLE_ENDIAN LITTLE_ENDIAN
-#define __BIG_ENDIAN BIG_ENDIAN
-#else
-#ifdef __LITTLE_ENDIAN__
-#define __BYTE_ORDER __LITTLE_ENDIAN
-#endif /* __LITTLE_ENDIAN */
-
-#if defined(i386) || defined(__i386__)
-#define __BYTE_ORDER __LITTLE_ENDIAN
-#endif /* defined i386 */
-
-#if defined(sun) && defined(unix) && defined(sparc)
-#define __BYTE_ORDER __BIG_ENDIAN
-#endif /* sun unix sparc */
-
-#endif /* linux */
-
-#endif /* __BYTE_ORDER */
-
-#ifndef __BYTE_ORDER
-#error Need to know endianess
-#endif /* __BYTE_ORDER */
+#include <asterisk/endian.h>
struct ast_codec_pref {
char order[32];
--- /dev/null
+/*
+ * Asterisk -- A telephony toolkit for Linux.
+ *
+ * Asterisk internal frame definitions.
+ *
+ * Copyright (C) 1999 - 2005, Digium, Inc.
+ *
+ * Mark Spencer <markster@digium.com>
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU Lesser General Public License. Other components of
+ * Asterisk are distributed under The GNU General Public License
+ * only.
+ */
+
+#ifndef _ASTERISK_UNALIGNED_H
+#define _ASTERISK_UNALIGNED_H
+
+#if defined(__cplusplus) || defined(c_plusplus)
+extern "C" {
+#endif
+
+#ifdef __GNUC__
+/* If we just tell GCC what's going on, we can trust it to behave optimally */
+static inline unsigned int get_unaligned_uint32(void *p)
+{
+ struct { unsigned int d; } __attribute__((packed)) *pp = (void *)p;
+
+ return pp->d;
+}
+static inline unsigned short get_unaligned_uint16(void *p)
+{
+ struct { unsigned short d; } __attribute__((packed)) *pp = (void *)p;
+
+ return pp->d;
+}
+
+static inline void put_unaligned_uint32(void *p, unsigned int datum)
+{
+ struct { unsigned int d; } __attribute__((packed)) *pp = (void *)p;
+
+ pp->d = datum;
+}
+
+static inline void put_unaligned_uint16(void *p, unsigned short datum)
+{
+ struct { unsigned short d; } __attribute__((packed)) *pp = (void *)p;
+
+ pp->d = datum;
+}
+#elif defined(SOLARIS) && defined(__sparc__)
+static inline unsigned int get_unaligned_uint32(void *p)
+{
+ unsigned char *cp = p;
+
+ return (cp[0] << 24) | (cp[1] << 16) | (cp[2] << 8) | cp[3];
+}
+
+static inline unsigned short get_unaligned_uint16(void *p)
+{
+ unsigned char *cp = p;
+
+ return (cp[0] << 8) | cp[1] ;
+}
+
+static inline void put_unaligned_uint32(void *p, unsigned int datum)
+{
+ unsigned char *cp = p;
+
+ cp[0] = datum >> 24;
+ cp[1] = datum >> 16;
+ cp[2] = datum >> 8;
+ cp[3] = datum;
+}
+
+static inline void put_unaligned_uint16(void *p, unsigned int datum)
+{
+ unsigned char *cp = p;
+
+ cp[0] = datum >> 8;
+ cp[1] = datum;
+}
+#else /* Not GCC, not Solaris/SPARC. Assume we can handle direct load/store. */
+#define get_unaligned_uint32(p) (*((unsigned int *)(p)))
+#define get_unaligned_uint16(p) (*((unsigned short *)(p)))
+#define put_unaligned_uint32(p,d) do { unsigned int *__P = (p); *__P = d; } while(0)
+#define put_unaligned_uint16(p,d) do { unsigned short *__P = (p); *__P = d; } while(0)
+#endif
+
+#if defined(__cplusplus) || defined(c_plusplus)
+}
+#endif
+
+
+#endif /* _ASTERISK_UNALIGNED_H */
/* MD5 checksum routines used for authentication. Not covered by GPL, but
in the public domain as per the copyright below */
-#if defined( __OpenBSD__ )
-# include <machine/types.h>
-# include <sys/endian.h>
-#elif defined( __FreeBSD__ ) || defined( __NetBSD__ )
-# include <sys/types.h>
-# include <sys/endian.h>
-#elif defined( BSD ) && ( BSD >= 199103 ) || defined(__APPLE__)
-# include <machine/endian.h>
-#elif defined( __sparc__ ) && defined( SOLARIS )
-# define BIG_ENDIAN 4321
-# define BYTE_ORDER BIG_ENDIAN
-#else
-# include <endian.h>
-#endif
-# if __BYTE_ORDER == __BIG_ENDIAN || BYTE_ORDER == BIG_ENDIAN
-# define HIGHFIRST 1
-# endif
/*
* This code implements the MD5 message-digest algorithm.
* will fill a supplied 16-byte array with the digest.
*/
#include <string.h> /* for memcpy() */
+#include <asterisk/endian.h>
#include <asterisk/md5.h>
+# if __BYTE_ORDER == __BIG_ENDIAN
+# define HIGHFIRST 1
+# endif
#ifndef HIGHFIRST
#define byteReverse(buf, len) /* Nothing */
#else
#include <asterisk/lock.h>
#include <asterisk/utils.h>
#include <asterisk/cli.h>
+#include <asterisk/unaligned.h>
#define MAX_TIMESTAMP_SKEW 640
return 0;
}
-#if defined(SOLARIS) && defined(__sparc__)
-static void put_uint32(unsigned char *buf, int i)
-{
- buf[0] = (i>>24) & 0xff;
- buf[1] = (i>>16) & 0xff;
- buf[2] = (i>>8) & 0xff;
- buf[3] = i & 0xff;
-}
-#else
-#define put_uint32(p,v) ((*((unsigned int *)(p))) = (v))
-#endif
-
static int ast_rtp_raw_write(struct ast_rtp *rtp, struct ast_frame *f, int codec)
{
unsigned char *rtpheader;
/* Get a pointer to the header */
rtpheader = (unsigned char *)(f->data - hdrlen);
- put_uint32(rtpheader, htonl((2 << 30) | (codec << 16) | (rtp->seqno) | (mark << 23)));
- put_uint32(rtpheader + 4, htonl(rtp->lastts));
- put_uint32(rtpheader + 8, htonl(rtp->ssrc));
+ put_unaligned_uint32(rtpheader, htonl((2 << 30) | (codec << 16) | (rtp->seqno) | (mark << 23)));
+ put_unaligned_uint32(rtpheader + 4, htonl(rtp->lastts));
+ put_unaligned_uint32(rtpheader + 8, htonl(rtp->ssrc));
if (rtp->them.sin_port && rtp->them.sin_addr.s_addr) {
res = sendto(rtp->s, (void *)rtpheader, f->datalen + hdrlen, 0, (struct sockaddr *)&rtp->them, sizeof(rtp->them));