dect
/
asterisk
Archived
13
0
Fork 0

Simplify endianness and fix for unaligned reads (bug #3867)

git-svn-id: http://svn.digium.com/svn/asterisk/trunk@5295 f38db490-d61c-443f-a65b-d21fe96a405b
This commit is contained in:
markster 2005-03-29 04:49:24 +00:00
parent f2529d4563
commit de060dd25b
22 changed files with 200 additions and 263 deletions

View File

@ -136,6 +136,7 @@
#define _AESOPT_H
#include <asterisk/aes.h>
#include <asterisk/endian.h>
/* CONFIGURATION - USE OF DEFINES
@ -146,27 +147,6 @@
#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

View File

@ -19,6 +19,7 @@
#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>
@ -27,7 +28,6 @@
#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

View File

@ -26,6 +26,7 @@
#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>
@ -35,23 +36,6 @@
#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__)

View File

@ -17,6 +17,7 @@
#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>
@ -30,22 +31,6 @@ static int frames = 0;
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);
@ -102,7 +87,7 @@ static void dump_prefs(char *output, int maxlen, void *value, int len)
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");
}
@ -110,7 +95,7 @@ static void dump_int(char *output, int maxlen, void *value, int len)
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");
}
@ -140,8 +125,8 @@ static void dump_prov_flags(char *output, int maxlen, void *value, int len)
{
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");
}
@ -600,14 +585,14 @@ int iax_parse_ies(struct iax_ies *ies, unsigned char *data, int datalen)
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;
@ -617,21 +602,21 @@ int iax_parse_ies(struct iax_ies *ies, unsigned char *data, int datalen)
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;
@ -644,14 +629,14 @@ int iax_parse_ies(struct iax_ies *ies, unsigned char *data, int datalen)
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;
@ -670,21 +655,21 @@ int iax_parse_ies(struct iax_ies *ies, unsigned char *data, int datalen)
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;
@ -710,7 +695,7 @@ int iax_parse_ies(struct iax_ies *ies, unsigned char *data, int datalen)
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;
@ -723,21 +708,21 @@ int iax_parse_ies(struct iax_ies *ies, unsigned char *data, int datalen)
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;
@ -750,7 +735,7 @@ int iax_parse_ies(struct iax_ies *ies, unsigned char *data, int datalen)
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;
@ -766,7 +751,7 @@ int iax_parse_ies(struct iax_ies *ies, unsigned char *data, int datalen)
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:
@ -790,14 +775,14 @@ int iax_parse_ies(struct iax_ies *ies, unsigned char *data, int datalen)
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:
@ -805,7 +790,7 @@ int iax_parse_ies(struct iax_ies *ies, unsigned char *data, int datalen)
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:
@ -813,7 +798,7 @@ int iax_parse_ies(struct iax_ies *ies, unsigned char *data, int datalen)
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:
@ -821,7 +806,7 @@ int iax_parse_ies(struct iax_ies *ies, unsigned char *data, int datalen)
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:
@ -829,7 +814,7 @@ int iax_parse_ies(struct iax_ies *ies, unsigned char *data, int datalen)
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:
@ -837,7 +822,7 @@ int iax_parse_ies(struct iax_ies *ies, unsigned char *data, int datalen)
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:

5
dns.c
View File

@ -19,12 +19,13 @@
#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 */
@ -38,7 +39,7 @@ typedef struct {
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 */

View File

@ -16,6 +16,7 @@
#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>
@ -24,15 +25,6 @@
#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

View File

@ -17,6 +17,7 @@
#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>
@ -25,15 +26,6 @@
#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 */

View File

@ -17,6 +17,7 @@
#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>
@ -25,15 +26,6 @@
#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 */

View File

@ -17,6 +17,7 @@
#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>
@ -25,15 +26,6 @@
#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 */

View File

@ -19,6 +19,7 @@
#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>
@ -27,15 +28,6 @@
#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 */

View File

@ -19,6 +19,7 @@
#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>
@ -27,15 +28,6 @@
#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";

View File

@ -17,6 +17,7 @@
#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>
@ -25,15 +26,6 @@
#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 */

View File

@ -17,6 +17,7 @@
#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>
@ -27,15 +28,6 @@
#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 */

View File

@ -15,6 +15,7 @@
#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>
@ -23,15 +24,6 @@
#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 */

View File

@ -17,6 +17,7 @@
#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>
@ -25,15 +26,6 @@
#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 */

View File

@ -17,6 +17,7 @@
#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>
@ -25,15 +26,6 @@
#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 */

View File

@ -17,6 +17,7 @@
#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>
@ -25,15 +26,6 @@
#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 */

50
include/asterisk/endian.h Executable file
View File

@ -0,0 +1,50 @@
/*
* 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 */

View File

@ -22,45 +22,7 @@ extern "C" {
#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];

95
include/asterisk/unaligned.h Executable file
View File

@ -0,0 +1,95 @@
/*
* 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 */

21
md5.c
View File

@ -1,22 +1,5 @@
/* 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.
@ -35,8 +18,12 @@
* 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

19
rtp.c
View File

@ -37,6 +37,7 @@
#include <asterisk/lock.h>
#include <asterisk/utils.h>
#include <asterisk/cli.h>
#include <asterisk/unaligned.h>
#define MAX_TIMESTAMP_SKEW 640
@ -1173,18 +1174,6 @@ int ast_rtp_sendcng(struct ast_rtp *rtp, int level)
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;
@ -1270,9 +1259,9 @@ static int ast_rtp_raw_write(struct ast_rtp *rtp, struct ast_frame *f, int codec
/* 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));