From 3fb76805139ef1cc04a8ed234febf335c50f5a02 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Fri, 4 Oct 2002 14:47:11 +0000 Subject: 2002-10-04 Jay Monkman * 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. --- cpukit/libnetworking/ChangeLog | 6 +++++ cpukit/libnetworking/netinet/in_cksum.c | 4 ++++ cpukit/libnetworking/netinet/ip_icmp.h | 38 ++++++++++++++++---------------- cpukit/libnetworking/netinet/ip_input.c | 2 +- cpukit/libnetworking/netinet/tcp_input.c | 21 +++++++++++++++--- cpukit/libnetworking/netinet/tcp_subr.c | 4 ++++ cpukit/libnetworking/netinet/tcp_var.h | 11 ++++++++- cpukit/libnetworking/sys/queue.h | 30 +++++++++++++++++++++++++ 8 files changed, 92 insertions(+), 24 deletions(-) (limited to 'cpukit') diff --git a/cpukit/libnetworking/ChangeLog b/cpukit/libnetworking/ChangeLog index 3943de2cf7..9c60a935cb 100644 --- a/cpukit/libnetworking/ChangeLog +++ b/cpukit/libnetworking/ChangeLog @@ -1,3 +1,9 @@ +2002-10-04 Jay Monkman + + * 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 * rtems/rtems_glue.c: Add IP aliasing ioctls SIOCAIFADDR and 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 /* 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__ */ -- cgit v1.2.3