* Modified June 1993 by Paul Mackerras, paulus@cs.anu.edu.au,
* so that the entire packet being decompressed doesn't have
* to be in contiguous memory (just the compressed header).
+ */
+
+/*
+ * This version is used under SunOS 4.x, DEC Alpha OSF/1, AIX 4.x,
+ * and SVR4 systems including Solaris 2.
*
- * $Id: vjcompress.c,v 1.4 1994/12/08 00:35:33 paulus Exp $
+ * $Id: vjcompress.c,v 1.7 1995/12/11 02:57:49 paulus Exp $
*/
#include <sys/types.h>
#include <sys/param.h>
-#ifdef __osf__
+#ifdef SVR4
+#ifndef __GNUC__
+#include <sys/byteorder.h> /* for ntohl, etc. */
+#else
+/* make sure we don't get the gnu "fixed" one! */
+#include "/usr/include/sys/byteorder.h"
+#endif
+#endif
+
+#ifdef OSF1
#include <net/net_globals.h>
#endif
#include <netinet/in.h>
-#ifdef __aix4__
+#ifdef AIX4
#define _NETINET_IN_SYSTM_H_
typedef u_long n_long;
#else
#define ovbcopy bcopy
#endif
-#ifdef __osf__
+#ifdef OSF1
#define getip_hl(base) (((base).ip_vhl)&0xf)
#define getth_off(base) ((((base).th_xoff)&0xf0)>>4)
#define DECODEL(f) { \
if (*cp == 0) {\
- (f) = htonl(ntohl(f) + ((cp[1] << 8) | cp[2])); \
+ u_int32_t tmp = ntohl(f) + ((cp[1] << 8) | cp[2]); \
+ (f) = htonl(tmp); \
cp += 3; \
} else { \
- (f) = htonl(ntohl(f) + (u_int32_t)*cp++); \
+ u_int32_t tmp = ntohl(f) + (u_int32_t)*cp++; \
+ (f) = htonl(tmp); \
} \
}
#define DECODES(f) { \
if (*cp == 0) {\
- (f) = htons(ntohs(f) + ((cp[1] << 8) | cp[2])); \
+ u_short tmp = ntohs(f) + ((cp[1] << 8) | cp[2]); \
+ (f) = htons(tmp); \
cp += 3; \
} else { \
- (f) = htons(ntohs(f) + (u_int32_t)*cp++); \
+ u_short tmp = ntohs(f) + (u_int32_t)*cp++; \
+ (f) = htons(tmp); \
} \
}
register struct cstate *cs;
register u_short *bp;
register u_int vjlen;
+ register u_int32_t tmp;
INCR(vjs_compressedin);
cp = buf;
switch (changes & SPECIALS_MASK) {
case SPECIAL_I:
{
- register u_int i = ntohs(cs->cs_ip.ip_len) - cs->cs_hlen;
- th->th_ack = htonl(ntohl(th->th_ack) + i);
- th->th_seq = htonl(ntohl(th->th_seq) + i);
+ register u_int32_t i = ntohs(cs->cs_ip.ip_len) - cs->cs_hlen;
+ /* some compilers can't nest inline assembler.. */
+ tmp = ntohl(th->th_ack) + i;
+ th->th_ack = htonl(tmp);
+ tmp = ntohl(th->th_seq) + i;
+ th->th_seq = htonl(tmp);
}
break;
case SPECIAL_D:
- th->th_seq = htonl(ntohl(th->th_seq) + ntohs(cs->cs_ip.ip_len)
- - cs->cs_hlen);
+ /* some compilers can't nest inline assembler.. */
+ tmp = ntohl(th->th_seq) + ntohs(cs->cs_ip.ip_len) - cs->cs_hlen;
+ th->th_seq = htonl(tmp);
break;
default:
}
if (changes & NEW_I) {
DECODES(cs->cs_ip.ip_id);
- } else
- cs->cs_ip.ip_id = htons(ntohs(cs->cs_ip.ip_id) + 1);
+ } else {
+ cs->cs_ip.ip_id = ntohs(cs->cs_ip.ip_id) + 1;
+ cs->cs_ip.ip_id = htons(cs->cs_ip.ip_id);
+ }
/*
* At this point, cp points to the first byte of data in the