diff options
author | Hannes Frederic Sowa <hannes@stressinduktion.org> | 2013-03-22 04:24:37 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-03-24 17:16:30 -0400 |
commit | be991971d53e0f5b6d13e3940192054216590072 (patch) | |
tree | 8d8b92e82104a51d0954a4f062d758efed6ee2a4 /net/ipv4/ip_fragment.c | |
parent | 63998ac24f8370caf99e433483532bab8368eb7e (diff) |
inet: generalize ipv4-only RFC3168 5.3 ecn fragmentation handling for future use by ipv6
This patch just moves some code arround to make the ip4_frag_ecn_table
and IPFRAG_ECN_* constants accessible from the other reassembly engines. I
also renamed ip4_frag_ecn_table to ip_frag_ecn_table.
Cc: Eric Dumazet <eric.dumazet@gmail.com>
Cc: Jesper Dangaard Brouer <jbrouer@redhat.com>
Cc: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Signed-off-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
Acked-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/ip_fragment.c')
-rw-r--r-- | net/ipv4/ip_fragment.c | 31 |
1 files changed, 1 insertions, 30 deletions
diff --git a/net/ipv4/ip_fragment.c b/net/ipv4/ip_fragment.c index a6445b843ef4..938520668b2f 100644 --- a/net/ipv4/ip_fragment.c +++ b/net/ipv4/ip_fragment.c | |||
@@ -79,40 +79,11 @@ struct ipq { | |||
79 | struct inet_peer *peer; | 79 | struct inet_peer *peer; |
80 | }; | 80 | }; |
81 | 81 | ||
82 | /* RFC 3168 support : | ||
83 | * We want to check ECN values of all fragments, do detect invalid combinations. | ||
84 | * In ipq->ecn, we store the OR value of each ip4_frag_ecn() fragment value. | ||
85 | */ | ||
86 | #define IPFRAG_ECN_NOT_ECT 0x01 /* one frag had ECN_NOT_ECT */ | ||
87 | #define IPFRAG_ECN_ECT_1 0x02 /* one frag had ECN_ECT_1 */ | ||
88 | #define IPFRAG_ECN_ECT_0 0x04 /* one frag had ECN_ECT_0 */ | ||
89 | #define IPFRAG_ECN_CE 0x08 /* one frag had ECN_CE */ | ||
90 | |||
91 | static inline u8 ip4_frag_ecn(u8 tos) | 82 | static inline u8 ip4_frag_ecn(u8 tos) |
92 | { | 83 | { |
93 | return 1 << (tos & INET_ECN_MASK); | 84 | return 1 << (tos & INET_ECN_MASK); |
94 | } | 85 | } |
95 | 86 | ||
96 | /* Given the OR values of all fragments, apply RFC 3168 5.3 requirements | ||
97 | * Value : 0xff if frame should be dropped. | ||
98 | * 0 or INET_ECN_CE value, to be ORed in to final iph->tos field | ||
99 | */ | ||
100 | static const u8 ip4_frag_ecn_table[16] = { | ||
101 | /* at least one fragment had CE, and others ECT_0 or ECT_1 */ | ||
102 | [IPFRAG_ECN_CE | IPFRAG_ECN_ECT_0] = INET_ECN_CE, | ||
103 | [IPFRAG_ECN_CE | IPFRAG_ECN_ECT_1] = INET_ECN_CE, | ||
104 | [IPFRAG_ECN_CE | IPFRAG_ECN_ECT_0 | IPFRAG_ECN_ECT_1] = INET_ECN_CE, | ||
105 | |||
106 | /* invalid combinations : drop frame */ | ||
107 | [IPFRAG_ECN_NOT_ECT | IPFRAG_ECN_CE] = 0xff, | ||
108 | [IPFRAG_ECN_NOT_ECT | IPFRAG_ECN_ECT_0] = 0xff, | ||
109 | [IPFRAG_ECN_NOT_ECT | IPFRAG_ECN_ECT_1] = 0xff, | ||
110 | [IPFRAG_ECN_NOT_ECT | IPFRAG_ECN_ECT_0 | IPFRAG_ECN_ECT_1] = 0xff, | ||
111 | [IPFRAG_ECN_NOT_ECT | IPFRAG_ECN_CE | IPFRAG_ECN_ECT_0] = 0xff, | ||
112 | [IPFRAG_ECN_NOT_ECT | IPFRAG_ECN_CE | IPFRAG_ECN_ECT_1] = 0xff, | ||
113 | [IPFRAG_ECN_NOT_ECT | IPFRAG_ECN_CE | IPFRAG_ECN_ECT_0 | IPFRAG_ECN_ECT_1] = 0xff, | ||
114 | }; | ||
115 | |||
116 | static struct inet_frags ip4_frags; | 87 | static struct inet_frags ip4_frags; |
117 | 88 | ||
118 | int ip_frag_nqueues(struct net *net) | 89 | int ip_frag_nqueues(struct net *net) |
@@ -551,7 +522,7 @@ static int ip_frag_reasm(struct ipq *qp, struct sk_buff *prev, | |||
551 | 522 | ||
552 | ipq_kill(qp); | 523 | ipq_kill(qp); |
553 | 524 | ||
554 | ecn = ip4_frag_ecn_table[qp->ecn]; | 525 | ecn = ip_frag_ecn_table[qp->ecn]; |
555 | if (unlikely(ecn == 0xff)) { | 526 | if (unlikely(ecn == 0xff)) { |
556 | err = -EINVAL; | 527 | err = -EINVAL; |
557 | goto out_fail; | 528 | goto out_fail; |