Changeset 36374


Ignore:
Timestamp:
2013-04-22T14:53:21+02:00 (5 years ago)
Author:
nbd
Message:

ar71xx: merge more unaligned access hacks from cerowrt-next

Signed-off-by: Felix Fietkau <nbd@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/ar71xx/patches-3.8/902-unaligned_access_hacks.patch

    r36215 r36374  
    280280  
    281281 #include <linux/proc_fs.h> 
    282 @@ -763,10 +764,10 @@ static void tcp_v6_send_response(struct 
     282@@ -763,10 +764,10 @@ static void tcp_v6_send_response(struct  
    283283        topt = (__be32 *)(t1 + 1); 
    284284  
     
    305305  * This structure contains configuration options per IPv6 link. 
    306306  */ 
     307@@ -79,7 +80,7 @@ static inline struct ipv6hdr *ipipv6_hdr 
     308  
     309 static inline __u8 ipv6_tclass(const struct ipv6hdr *iph) 
     310 { 
     311-       return (ntohl(*(__be32 *)iph) >> 20) & 0xff; 
     312+       return (ntohl(net_hdr_word(iph)) >> 20) & 0xff; 
     313 } 
     314  
     315 /*  
    307316--- a/net/ipv6/datagram.c 
    308317+++ b/net/ipv6/datagram.c 
     
    407416                fl6.flowi6_mark = skb->mark; 
    408417  
    409 @@ -1240,7 +1240,7 @@ static int ip6gre_header(struct sk_buff 
     418@@ -1240,7 +1240,7 @@ static int ip6gre_header(struct sk_buff  
    410419        struct ipv6hdr *ipv6h = (struct ipv6hdr *)skb_push(skb, t->hlen); 
    411420        __be16 *p = (__be16 *)(ipv6h+1); 
     
    740749--- a/include/net/ndisc.h 
    741750+++ b/include/net/ndisc.h 
     751@@ -76,7 +76,7 @@ struct ra_msg { 
     752         struct icmp6hdr                icmph; 
     753        __be32                  reachable_time; 
     754        __be32                  retrans_timer; 
     755-}; 
     756+} __attribute__((packed, aligned(2))); 
     757  
     758 struct rd_msg { 
     759        struct icmp6hdr icmph; 
    742760@@ -142,10 +142,10 @@ static inline u32 ndisc_hashfn(const voi 
    743761 { 
     
    755773  
    756774 static inline struct neighbour *__ipv6_neigh_lookup(struct neigh_table *tbl, struct net_device *dev, const void *pkey) 
     775@@ -163,8 +163,10 @@ static inline struct neighbour *__ipv6_n 
     776             n = rcu_dereference_bh(n->next)) { 
     777                u32 *n32 = (u32 *) n->primary_key; 
     778                if (n->dev == dev && 
     779-                   ((n32[0] ^ p32[0]) | (n32[1] ^ p32[1]) | 
     780-                    (n32[2] ^ p32[2]) | (n32[3] ^ p32[3])) == 0) { 
     781+                   ((n32[0] ^ net_hdr_word(&p32[0])) | 
     782+                    (n32[1] ^ net_hdr_word(&p32[1])) | 
     783+                    (n32[2] ^ net_hdr_word(&p32[2])) | 
     784+                    (n32[3] ^ net_hdr_word(&p32[3]))) == 0) { 
     785                        if (!atomic_inc_not_zero(&n->refcnt)) 
     786                                n = NULL; 
     787                        break; 
    757788--- a/net/sched/cls_u32.c 
    758789+++ b/net/sched/cls_u32.c 
     
    788819                /* All fields must match except length and Traffic Class. */ 
    789820                if (nlen != skb_network_header_len(p) || 
     821--- a/include/net/addrconf.h 
     822+++ b/include/net/addrconf.h 
     823@@ -39,7 +39,7 @@ struct prefix_info { 
     824        __be32                  reserved2; 
     825  
     826        struct in6_addr         prefix; 
     827-}; 
     828+} __attribute__((packed, aligned(2))); 
     829  
     830  
     831 #include <linux/netdevice.h> 
     832--- a/include/net/inet_ecn.h 
     833+++ b/include/net/inet_ecn.h 
     834@@ -115,13 +115,13 @@ static inline int IP6_ECN_set_ce(struct  
     835 { 
     836        if (INET_ECN_is_not_ect(ipv6_get_dsfield(iph))) 
     837                return 0; 
     838-       *(__be32*)iph |= htonl(INET_ECN_CE << 20); 
     839+       net_hdr_word(iph) |= htonl(INET_ECN_CE << 20); 
     840        return 1; 
     841 } 
     842  
     843 static inline void IP6_ECN_clear(struct ipv6hdr *iph) 
     844 { 
     845-       *(__be32*)iph &= ~htonl(INET_ECN_MASK << 20); 
     846+       net_hdr_word(iph) &= ~htonl(INET_ECN_MASK << 20); 
     847 } 
     848  
     849 static inline void ipv6_copy_dscp(unsigned int dscp, struct ipv6hdr *inner) 
     850--- a/include/net/ipv6.h 
     851+++ b/include/net/ipv6.h 
     852@@ -107,7 +107,7 @@ struct frag_hdr { 
     853        __u8    reserved; 
     854        __be16  frag_off; 
     855        __be32  identification; 
     856-}; 
     857+} __attribute__((packed, aligned(2))); 
     858  
     859 #define        IP6_MF  0x0001 
     860  
     861@@ -386,6 +386,8 @@ static inline bool __ipv6_prefix_equal(c 
     862                                       unsigned int prefixlen) 
     863 { 
     864        unsigned int pdw, pbi; 
     865+       /* Used for last <32-bit fraction of prefix */ 
     866+       u32 pbia1, pbia2; 
     867  
     868        /* check complete u32 in prefix */ 
     869        pdw = prefixlen >> 5; 
     870@@ -394,7 +396,9 @@ static inline bool __ipv6_prefix_equal(c 
     871  
     872        /* check incomplete u32 in prefix */ 
     873        pbi = prefixlen & 0x1f; 
     874-       if (pbi && ((a1[pdw] ^ a2[pdw]) & htonl((0xffffffff) << (32 - pbi)))) 
     875+       pbia1 = net_hdr_word(&a1[pdw]); 
     876+       pbia2 = net_hdr_word(&a2[pdw]); 
     877+       if (pbi && ((pbia1 ^ pbia2) & htonl((0xffffffff) << (32 - pbi)))) 
     878                return false; 
     879  
     880        return true; 
     881@@ -521,13 +525,13 @@ static inline void ipv6_addr_set_v4mappe 
     882  */ 
     883 static inline int __ipv6_addr_diff(const void *token1, const void *token2, int addrlen) 
     884 { 
     885-       const __be32 *a1 = token1, *a2 = token2; 
     886+       const struct in6_addr *a1 = token1, *a2 = token2; 
     887        int i; 
     888  
     889        addrlen >>= 2; 
     890  
     891        for (i = 0; i < addrlen; i++) { 
     892-               __be32 xb = a1[i] ^ a2[i]; 
     893+               __be32 xb = a1->s6_addr32[i] ^ a2->s6_addr32[i]; 
     894                if (xb) 
     895                        return i * 32 + 31 - __fls(ntohl(xb)); 
     896        } 
     897--- a/include/net/secure_seq.h 
     898+++ b/include/net/secure_seq.h 
     899@@ -2,6 +2,7 @@ 
     900 #define _NET_SECURE_SEQ 
     901  
     902 #include <linux/types.h> 
     903+#include <linux/in6.h> 
     904  
     905 extern __u32 secure_ip_id(__be32 daddr); 
     906 extern __u32 secure_ipv6_id(const __be32 daddr[4]); 
     907--- a/include/uapi/linux/in.h 
     908+++ b/include/uapi/linux/in.h 
     909@@ -55,7 +55,7 @@ enum { 
     910 /* Internet address. */ 
     911 struct in_addr { 
     912        __be32  s_addr; 
     913-}; 
     914+} __attribute__((packed, aligned(2))); 
     915  
     916 #define IP_TOS         1 
     917 #define IP_TTL         2 
     918--- a/include/uapi/linux/xfrm.h 
     919+++ b/include/uapi/linux/xfrm.h 
     920@@ -13,7 +13,7 @@ 
     921 typedef union { 
     922        __be32          a4; 
     923        __be32          a6[4]; 
     924-} xfrm_address_t; 
     925+} __attribute__((packed, aligned(2))) xfrm_address_t; 
     926  
     927 /* Ident of a specific xfrm_state. It is used on input to lookup 
     928  * the state by (spi,daddr,ah/esp) or to store information about 
     929--- a/net/core/secure_seq.c 
     930+++ b/net/core/secure_seq.c 
     931@@ -43,10 +43,11 @@ __u32 secure_tcpv6_sequence_number(const 
     932        u32 secret[MD5_MESSAGE_BYTES / 4]; 
     933        u32 hash[MD5_DIGEST_WORDS]; 
     934        u32 i; 
     935+       const struct in6_addr *daddr6 = (struct in6_addr *) daddr; 
     936  
     937        memcpy(hash, saddr, 16); 
     938        for (i = 0; i < 4; i++) 
     939-               secret[i] = net_secret[i] + (__force u32)daddr[i]; 
     940+               secret[i] = net_secret[i] + (__force u32)daddr6->s6_addr32[i]; 
     941        secret[4] = net_secret[4] + 
     942                (((__force u16)sport << 16) + (__force u16)dport); 
     943        for (i = 5; i < MD5_MESSAGE_BYTES / 4; i++) 
     944@@ -64,10 +65,11 @@ u32 secure_ipv6_port_ephemeral(const __b 
     945        u32 secret[MD5_MESSAGE_BYTES / 4]; 
     946        u32 hash[MD5_DIGEST_WORDS]; 
     947        u32 i; 
     948+       const struct in6_addr *daddr6 = (struct in6_addr *) daddr; 
     949  
     950        memcpy(hash, saddr, 16); 
     951        for (i = 0; i < 4; i++) 
     952-               secret[i] = net_secret[i] + (__force u32) daddr[i]; 
     953+               secret[i] = net_secret[i] + (__force u32) daddr6->s6_addr32[i]; 
     954        secret[4] = net_secret[4] + (__force u32)dport; 
     955        for (i = 5; i < MD5_MESSAGE_BYTES / 4; i++) 
     956                secret[i] = net_secret[i]; 
     957@@ -165,10 +167,11 @@ u64 secure_dccpv6_sequence_number(__be32 
     958        u32 hash[MD5_DIGEST_WORDS]; 
     959        u64 seq; 
     960        u32 i; 
     961+       const struct in6_addr *daddr6 = (struct in6_addr *) daddr; 
     962  
     963        memcpy(hash, saddr, 16); 
     964        for (i = 0; i < 4; i++) 
     965-               secret[i] = net_secret[i] + daddr[i]; 
     966+               secret[i] = net_secret[i] +  daddr6->s6_addr32[i]; 
     967        secret[4] = net_secret[4] + 
     968                (((__force u16)sport << 16) + (__force u16)dport); 
     969        for (i = 5; i < MD5_MESSAGE_BYTES / 4; i++) 
     970--- a/net/ipv6/ip6_fib.c 
     971+++ b/net/ipv6/ip6_fib.c 
     972@@ -144,7 +144,7 @@ static __inline__ __be32 addr_bit_set(co 
     973         * See include/asm-generic/bitops/le.h. 
     974         */ 
     975        return (__force __be32)(1 << ((~fn_bit ^ BITOP_BE32_SWIZZLE) & 0x1f)) & 
     976-              addr[fn_bit >> 5]; 
     977+              net_hdr_word(&addr[fn_bit >> 5]); 
     978 } 
     979  
     980 static __inline__ struct fib6_node * node_alloc(void) 
     981--- a/net/netfilter/nf_conntrack_proto_tcp.c 
     982+++ b/net/netfilter/nf_conntrack_proto_tcp.c 
     983@@ -452,7 +452,7 @@ static void tcp_sack(const struct sk_buf 
     984  
     985        /* Fast path for timestamp-only option */ 
     986        if (length == TCPOLEN_TSTAMP_ALIGNED 
     987-           && *(__be32 *)ptr == htonl((TCPOPT_NOP << 24) 
     988+           && net_hdr_word(ptr) == htonl((TCPOPT_NOP << 24) 
     989                                       | (TCPOPT_NOP << 16) 
     990                                       | (TCPOPT_TIMESTAMP << 8) 
     991                                       | TCPOLEN_TIMESTAMP)) 
     992--- a/net/netfilter/xt_LOG.c 
     993+++ b/net/netfilter/xt_LOG.c 
     994@@ -521,9 +521,9 @@ static void dump_ipv6_packet(struct sbuf 
     995        /* Max length: 44 "LEN=65535 TC=255 HOPLIMIT=255 FLOWLBL=FFFFF " */ 
     996        sb_add(m, "LEN=%Zu TC=%u HOPLIMIT=%u FLOWLBL=%u ", 
     997               ntohs(ih->payload_len) + sizeof(struct ipv6hdr), 
     998-              (ntohl(*(__be32 *)ih) & 0x0ff00000) >> 20, 
     999+              (ntohl(net_hdr_word(ih)) & 0x0ff00000) >> 20, 
     1000               ih->hop_limit, 
     1001-              (ntohl(*(__be32 *)ih) & 0x000fffff)); 
     1002+              (ntohl(net_hdr_word(ih)) & 0x000fffff)); 
     1003  
     1004        fragment = 0; 
     1005        ptr = ip6hoff + sizeof(struct ipv6hdr); 
     1006--- a/net/xfrm/xfrm_input.c 
     1007+++ b/net/xfrm/xfrm_input.c 
     1008@@ -77,8 +77,8 @@ int xfrm_parse_spi(struct sk_buff *skb,  
     1009        if (!pskb_may_pull(skb, hlen)) 
     1010                return -EINVAL; 
     1011  
     1012-       *spi = *(__be32*)(skb_transport_header(skb) + offset); 
     1013-       *seq = *(__be32*)(skb_transport_header(skb) + offset_seq); 
     1014+       *spi = net_hdr_word(skb_transport_header(skb) + offset); 
     1015+       *seq = net_hdr_word(skb_transport_header(skb) + offset_seq); 
     1016        return 0; 
     1017 } 
     1018  
Note: See TracChangeset for help on using the changeset viewer.