diff options
author | David S. Miller <davem@davemloft.net> | 2013-02-12 18:58:28 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-02-12 18:58:28 -0500 |
commit | 9f6d98c298d48eec29a32ae8ed6f4d896eb4f634 (patch) | |
tree | 24a21ecbd80cd737ce0a4a21591340e6d7f51964 /net/netfilter | |
parent | db98f081888cbdd995c7c4cfd407781da35e33ba (diff) | |
parent | 9c10f4115cc3722635d6e277385ec96003281784 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts:
drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
The bnx2x gso_type setting bug fix in 'net' conflicted with
changes in 'net-next' that broke the gso_* setting logic
out into a seperate function, which also fixes the bug in
question. Thus, use the 'net-next' version.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/netfilter')
-rw-r--r-- | net/netfilter/ipvs/ip_vs_proto_sctp.c | 35 | ||||
-rw-r--r-- | net/netfilter/ipvs/ip_vs_sync.c | 2 |
2 files changed, 19 insertions, 18 deletions
diff --git a/net/netfilter/ipvs/ip_vs_proto_sctp.c b/net/netfilter/ipvs/ip_vs_proto_sctp.c index 746048b13ef3..ae8ec6f27688 100644 --- a/net/netfilter/ipvs/ip_vs_proto_sctp.c +++ b/net/netfilter/ipvs/ip_vs_proto_sctp.c | |||
@@ -61,14 +61,27 @@ sctp_conn_schedule(int af, struct sk_buff *skb, struct ip_vs_proto_data *pd, | |||
61 | return 1; | 61 | return 1; |
62 | } | 62 | } |
63 | 63 | ||
64 | static void sctp_nat_csum(struct sk_buff *skb, sctp_sctphdr_t *sctph, | ||
65 | unsigned int sctphoff) | ||
66 | { | ||
67 | __u32 crc32; | ||
68 | struct sk_buff *iter; | ||
69 | |||
70 | crc32 = sctp_start_cksum((__u8 *)sctph, skb_headlen(skb) - sctphoff); | ||
71 | skb_walk_frags(skb, iter) | ||
72 | crc32 = sctp_update_cksum((u8 *) iter->data, | ||
73 | skb_headlen(iter), crc32); | ||
74 | sctph->checksum = sctp_end_cksum(crc32); | ||
75 | |||
76 | skb->ip_summed = CHECKSUM_UNNECESSARY; | ||
77 | } | ||
78 | |||
64 | static int | 79 | static int |
65 | sctp_snat_handler(struct sk_buff *skb, struct ip_vs_protocol *pp, | 80 | sctp_snat_handler(struct sk_buff *skb, struct ip_vs_protocol *pp, |
66 | struct ip_vs_conn *cp, struct ip_vs_iphdr *iph) | 81 | struct ip_vs_conn *cp, struct ip_vs_iphdr *iph) |
67 | { | 82 | { |
68 | sctp_sctphdr_t *sctph; | 83 | sctp_sctphdr_t *sctph; |
69 | unsigned int sctphoff = iph->len; | 84 | unsigned int sctphoff = iph->len; |
70 | struct sk_buff *iter; | ||
71 | __be32 crc32; | ||
72 | 85 | ||
73 | #ifdef CONFIG_IP_VS_IPV6 | 86 | #ifdef CONFIG_IP_VS_IPV6 |
74 | if (cp->af == AF_INET6 && iph->fragoffs) | 87 | if (cp->af == AF_INET6 && iph->fragoffs) |
@@ -92,13 +105,7 @@ sctp_snat_handler(struct sk_buff *skb, struct ip_vs_protocol *pp, | |||
92 | sctph = (void *) skb_network_header(skb) + sctphoff; | 105 | sctph = (void *) skb_network_header(skb) + sctphoff; |
93 | sctph->source = cp->vport; | 106 | sctph->source = cp->vport; |
94 | 107 | ||
95 | /* Calculate the checksum */ | 108 | sctp_nat_csum(skb, sctph, sctphoff); |
96 | crc32 = sctp_start_cksum((u8 *) sctph, skb_headlen(skb) - sctphoff); | ||
97 | skb_walk_frags(skb, iter) | ||
98 | crc32 = sctp_update_cksum((u8 *) iter->data, skb_headlen(iter), | ||
99 | crc32); | ||
100 | crc32 = sctp_end_cksum(crc32); | ||
101 | sctph->checksum = crc32; | ||
102 | 109 | ||
103 | return 1; | 110 | return 1; |
104 | } | 111 | } |
@@ -109,8 +116,6 @@ sctp_dnat_handler(struct sk_buff *skb, struct ip_vs_protocol *pp, | |||
109 | { | 116 | { |
110 | sctp_sctphdr_t *sctph; | 117 | sctp_sctphdr_t *sctph; |
111 | unsigned int sctphoff = iph->len; | 118 | unsigned int sctphoff = iph->len; |
112 | struct sk_buff *iter; | ||
113 | __be32 crc32; | ||
114 | 119 | ||
115 | #ifdef CONFIG_IP_VS_IPV6 | 120 | #ifdef CONFIG_IP_VS_IPV6 |
116 | if (cp->af == AF_INET6 && iph->fragoffs) | 121 | if (cp->af == AF_INET6 && iph->fragoffs) |
@@ -134,13 +139,7 @@ sctp_dnat_handler(struct sk_buff *skb, struct ip_vs_protocol *pp, | |||
134 | sctph = (void *) skb_network_header(skb) + sctphoff; | 139 | sctph = (void *) skb_network_header(skb) + sctphoff; |
135 | sctph->dest = cp->dport; | 140 | sctph->dest = cp->dport; |
136 | 141 | ||
137 | /* Calculate the checksum */ | 142 | sctp_nat_csum(skb, sctph, sctphoff); |
138 | crc32 = sctp_start_cksum((u8 *) sctph, skb_headlen(skb) - sctphoff); | ||
139 | skb_walk_frags(skb, iter) | ||
140 | crc32 = sctp_update_cksum((u8 *) iter->data, skb_headlen(iter), | ||
141 | crc32); | ||
142 | crc32 = sctp_end_cksum(crc32); | ||
143 | sctph->checksum = crc32; | ||
144 | 143 | ||
145 | return 1; | 144 | return 1; |
146 | } | 145 | } |
diff --git a/net/netfilter/ipvs/ip_vs_sync.c b/net/netfilter/ipvs/ip_vs_sync.c index effa10c9e4e3..44fd10c539ac 100644 --- a/net/netfilter/ipvs/ip_vs_sync.c +++ b/net/netfilter/ipvs/ip_vs_sync.c | |||
@@ -1795,6 +1795,8 @@ int start_sync_thread(struct net *net, int state, char *mcast_ifn, __u8 syncid) | |||
1795 | GFP_KERNEL); | 1795 | GFP_KERNEL); |
1796 | if (!tinfo->buf) | 1796 | if (!tinfo->buf) |
1797 | goto outtinfo; | 1797 | goto outtinfo; |
1798 | } else { | ||
1799 | tinfo->buf = NULL; | ||
1798 | } | 1800 | } |
1799 | tinfo->id = id; | 1801 | tinfo->id = id; |
1800 | 1802 | ||