summaryrefslogtreecommitdiffstats
path: root/cpukit
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2002-10-04 14:47:11 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2002-10-04 14:47:11 +0000
commit3fb76805139ef1cc04a8ed234febf335c50f5a02 (patch)
treeb3d82e925ff5c475ec1d53f42478a591399ce559 /cpukit
parent2002-10-02 Chris Johns <cjohns@cybertec.com.au> (diff)
downloadrtems-3fb76805139ef1cc04a8ed234febf335c50f5a02.tar.bz2
2002-10-04 Jay Monkman <jtm@smoothsmoothie.com>
* netinet/in_cksum.c, netinet/ip_icmp.h, netinet/ip_input.c, netinet/tcp_input.c, netinet/tcp_subr.c, netinet/tcp_var.h, sys/queue.h: Address alignment requirements for the ARM.
Diffstat (limited to 'cpukit')
-rw-r--r--cpukit/libnetworking/ChangeLog6
-rw-r--r--cpukit/libnetworking/netinet/in_cksum.c4
-rw-r--r--cpukit/libnetworking/netinet/ip_icmp.h38
-rw-r--r--cpukit/libnetworking/netinet/ip_input.c2
-rw-r--r--cpukit/libnetworking/netinet/tcp_input.c21
-rw-r--r--cpukit/libnetworking/netinet/tcp_subr.c4
-rw-r--r--cpukit/libnetworking/netinet/tcp_var.h11
-rw-r--r--cpukit/libnetworking/sys/queue.h30
8 files changed, 92 insertions, 24 deletions
diff --git a/cpukit/libnetworking/ChangeLog b/cpukit/libnetworking/ChangeLog
index 3943de2cf7..9c60a935cb 100644
--- a/cpukit/libnetworking/ChangeLog
+++ b/cpukit/libnetworking/ChangeLog
@@ -1,5 +1,11 @@
2002-10-04 Jay Monkman <jtm@smoothsmoothie.com>
+ * netinet/in_cksum.c, netinet/ip_icmp.h, netinet/ip_input.c,
+ netinet/tcp_input.c, netinet/tcp_subr.c, netinet/tcp_var.h,
+ sys/queue.h: Address alignment requirements for the ARM.
+
+2002-10-04 Jay Monkman <jtm@smoothsmoothie.com>
+
* rtems/rtems_glue.c: Add IP aliasing ioctls SIOCAIFADDR and
SIOCDIFADDR.
diff --git a/cpukit/libnetworking/netinet/in_cksum.c b/cpukit/libnetworking/netinet/in_cksum.c
index 2ce4dc68b6..7666557dde 100644
--- a/cpukit/libnetworking/netinet/in_cksum.c
+++ b/cpukit/libnetworking/netinet/in_cksum.c
@@ -57,6 +57,10 @@
#include "in_cksum_powerpc.c"
+#elif (defined(__GNUC__) && defined(__arm__))
+
+#include "in_cksum_arm.c"
+
#else
#include <stdio.h> /* for puts */
diff --git a/cpukit/libnetworking/netinet/ip_icmp.h b/cpukit/libnetworking/netinet/ip_icmp.h
index 9d07a682de..8fd20abb2b 100644
--- a/cpukit/libnetworking/netinet/ip_icmp.h
+++ b/cpukit/libnetworking/netinet/ip_icmp.h
@@ -54,28 +54,28 @@ struct icmp_ra_addr {
* Structure of an icmp header.
*/
struct icmp {
- u_char icmp_type; /* type of message, see below */
- u_char icmp_code; /* type sub code */
- u_short icmp_cksum; /* ones complement cksum of struct */
+ u_char icmp_type BYTE_PACK; /* type of message, see below */
+ u_char icmp_code BYTE_PACK; /* type sub code */
+ u_short icmp_cksum BYTE_PACK; /* ones complement cksum of struct */
union {
- u_char ih_pptr; /* ICMP_PARAMPROB */
- struct in_addr ih_gwaddr; /* ICMP_REDIRECT */
+ u_char ih_pptr BYTE_PACK; /* ICMP_PARAMPROB */
+ struct in_addr ih_gwaddr BYTE_PACK; /* ICMP_REDIRECT */
struct ih_idseq {
- n_short icd_id;
- n_short icd_seq;
+ n_short icd_id BYTE_PACK;
+ n_short icd_seq BYTE_PACK;
} ih_idseq;
- int ih_void;
+ int ih_void BYTE_PACK;
/* ICMP_UNREACH_NEEDFRAG -- Path MTU Discovery (RFC1191) */
struct ih_pmtu {
- n_short ipm_void;
- n_short ipm_nextmtu;
+ n_short ipm_void BYTE_PACK;
+ n_short ipm_nextmtu BYTE_PACK;
} ih_pmtu;
struct ih_rtradv {
- u_char irt_num_addrs;
- u_char irt_wpa;
- u_int16_t irt_lifetime;
+ u_char irt_num_addrs BYTE_PACK;
+ u_char irt_wpa BYTE_PACK;
+ u_int16_t irt_lifetime BYTE_PACK;
} ih_rtradv;
} icmp_hun;
#define icmp_pptr icmp_hun.ih_pptr
@@ -90,16 +90,16 @@ struct icmp {
#define icmp_lifetime icmp_hun.ih_rtradv.irt_lifetime
union {
struct id_ts {
- n_time its_otime;
- n_time its_rtime;
- n_time its_ttime;
+ n_time its_otime BYTE_PACK;
+ n_time its_rtime BYTE_PACK;
+ n_time its_ttime BYTE_PACK;
} id_ts;
struct id_ip {
- struct ip idi_ip;
+ struct ip idi_ip BYTE_PACK;
/* options and then 64 bits of data */
} id_ip;
- struct icmp_ra_addr id_radv;
- u_long id_mask;
+ struct icmp_ra_addr id_radv BYTE_PACK;
+ u_long id_mask BYTE_PACK;
char id_data[1];
} icmp_dun;
#define icmp_otime icmp_dun.id_ts.its_otime
diff --git a/cpukit/libnetworking/netinet/ip_input.c b/cpukit/libnetworking/netinet/ip_input.c
index 238e10cf6b..f915fb7106 100644
--- a/cpukit/libnetworking/netinet/ip_input.c
+++ b/cpukit/libnetworking/netinet/ip_input.c
@@ -79,7 +79,7 @@ int rsvp_on = 0;
static int ip_rsvp_on;
struct socket *ip_rsvpd;
-static int ipforwarding = 0;
+int ipforwarding = 0;
SYSCTL_INT(_net_inet_ip, IPCTL_FORWARDING, forwarding, CTLFLAG_RW,
&ipforwarding, 0, "");
diff --git a/cpukit/libnetworking/netinet/tcp_input.c b/cpukit/libnetworking/netinet/tcp_input.c
index 183b976f89..a33f9593c4 100644
--- a/cpukit/libnetworking/netinet/tcp_input.c
+++ b/cpukit/libnetworking/netinet/tcp_input.c
@@ -155,7 +155,6 @@ tcp_reass(tp, ti, m)
register struct tcpiphdr *q;
struct socket *so = tp->t_inpcb->inp_socket;
int flags;
-
/*
* Call with ti==0 after become established to
* force pre-ESTABLISHED data up to user socket.
@@ -202,8 +201,11 @@ tcp_reass(tp, ti, m)
}
tcpstat.tcps_rcvoopack++;
tcpstat.tcps_rcvoobyte += ti->ti_len;
+#if (defined(__GNUC__) && defined(__arm__))
+ STR32_UNALGN(ti,m);
+#else
REASS_MBUF(ti) = m; /* XXX */
-
+#endif
/*
* While we overlap succeeding segments trim them or,
* if they are completely covered, dequeue them.
@@ -215,13 +217,22 @@ tcp_reass(tp, ti, m)
if (i < q->ti_len) {
q->ti_seq += i;
q->ti_len -= i;
+#if (defined(__GNUC__) && defined(__arm__))
+ LD32_UNALGN(q,m);
+ m_adj(m, i);
+#else
m_adj(REASS_MBUF(q), i);
+#endif
break;
}
q = (struct tcpiphdr *)q->ti_next;
+#if (defined(__GNUC__) && defined(__arm__))
+ LD32_UNALGN((struct tcpiphdr *)q->ti_prev,m);
+#else
m = REASS_MBUF((struct tcpiphdr *)q->ti_prev);
+#endif
remque(q->ti_prev);
- m_freem(m);
+ m_freem(m);
}
/*
@@ -243,7 +254,11 @@ present:
tp->rcv_nxt += ti->ti_len;
flags = ti->ti_flags & TH_FIN;
remque(ti);
+#if (defined(__GNUC__) && defined(__arm__))
+ LD32_UNALGN(ti,m);
+#else
m = REASS_MBUF(ti);
+#endif
ti = (struct tcpiphdr *)ti->ti_next;
if (so->so_state & SS_CANTRCVMORE)
m_freem(m);
diff --git a/cpukit/libnetworking/netinet/tcp_subr.c b/cpukit/libnetworking/netinet/tcp_subr.c
index a9cde3fdf0..9e7e57611d 100644
--- a/cpukit/libnetworking/netinet/tcp_subr.c
+++ b/cpukit/libnetworking/netinet/tcp_subr.c
@@ -399,7 +399,11 @@ tcp_close(tp)
t = tp->seg_next;
while (t != (struct tcpiphdr *)tp) {
t = (struct tcpiphdr *)t->ti_next;
+#if (defined(__GNUC__) && defined(__arm__))
+ LD32_UNALGN((struct tcpiphdr *)t->ti_prev,m);
+#else
m = REASS_MBUF((struct tcpiphdr *)t->ti_prev);
+#endif
remque(t->ti_prev);
m_freem(m);
}
diff --git a/cpukit/libnetworking/netinet/tcp_var.h b/cpukit/libnetworking/netinet/tcp_var.h
index 8e63a2cafe..3c4c5f8c89 100644
--- a/cpukit/libnetworking/netinet/tcp_var.h
+++ b/cpukit/libnetworking/netinet/tcp_var.h
@@ -225,7 +225,16 @@ struct rmxp_tao {
* port numbers (which are no longer needed once we've located the
* tcpcb) are overlayed with an mbuf pointer.
*/
-#define REASS_MBUF(ti) (*(struct mbuf **)&((ti)->ti_t))
+#if (defined(__GNUC__) && defined(__arm__))
+#define STR32_UNALGN(ti,m) \
+ (ti)->ti_sport = (unsigned short)(((unsigned int) m & 0xffff0000) >> 16); \
+ (ti)->ti_dport = (unsigned short) ((unsigned int) m & 0x0000ffff);
+#define LD32_UNALGN(ti,m) \
+ m = (struct mbuf *)((((unsigned int) (ti)->ti_sport) << 16) | ( (unsigned int)(ti)->ti_dport));
+
+#else
+#define REASS_MBUF(ti) (*(mbuf_packed **)&((ti)->ti_t))
+#endif
/*
* TCP statistics.
diff --git a/cpukit/libnetworking/sys/queue.h b/cpukit/libnetworking/sys/queue.h
index e8aa08cf5d..6ebc7dce3d 100644
--- a/cpukit/libnetworking/sys/queue.h
+++ b/cpukit/libnetworking/sys/queue.h
@@ -413,6 +413,35 @@ struct quehead {
#ifdef __GNUC__
+#if (defined(__GNUC__) && defined(__arm__))
+static __inline void
+insque(void *a, void *b)
+{
+ struct quehead *element;
+ struct quehead *head;
+ element = (struct quehead *) (((unsigned int) a + 0x3) & ~0x3);
+ head = (struct quehead *) (((unsigned int) b + 0x3) & ~0x3);
+
+ element->qh_link = head->qh_link;
+ element->qh_rlink = head;
+ head->qh_link = element;
+ element->qh_link->qh_rlink = element;
+}
+
+static __inline void
+remque(void *a)
+{
+ struct quehead *element;
+
+ element = (struct quehead *) (((unsigned int) a + 0x3) & ~0x3);
+
+ element->qh_link->qh_rlink = element->qh_rlink;
+ element->qh_rlink->qh_link = element->qh_link;
+ element->qh_rlink = 0;
+}
+
+#else /*if (defined(__GNUC__) && defined(__arm__))*/
+
static __inline void
insque(void *a, void *b)
{
@@ -433,6 +462,7 @@ remque(void *a)
element->qh_rlink->qh_link = element->qh_link;
element->qh_rlink = 0;
}
+#endif /*if-else (defined(__GNUC__) && defined(__arm__))*/
#else /* !__GNUC__ */