diff options
-rw-r--r-- | include/net/netfilter/nf_conntrack.h | 6 | ||||
-rw-r--r-- | net/netfilter/nf_conntrack_core.c | 3 | ||||
-rw-r--r-- | net/netfilter/nf_conntrack_netlink.c | 1 | ||||
-rw-r--r-- | net/netfilter/nf_conntrack_proto_dccp.c | 3 | ||||
-rw-r--r-- | net/netfilter/nf_conntrack_proto_sctp.c | 1 | ||||
-rw-r--r-- | net/netfilter/nf_conntrack_proto_tcp.c | 14 |
6 files changed, 13 insertions, 15 deletions
diff --git a/include/net/netfilter/nf_conntrack.h b/include/net/netfilter/nf_conntrack.h index caf17db87dbc..abfff1e8e0d0 100644 --- a/include/net/netfilter/nf_conntrack.h +++ b/include/net/netfilter/nf_conntrack.h | |||
@@ -116,14 +116,14 @@ struct nf_conn { | |||
116 | u_int32_t secmark; | 116 | u_int32_t secmark; |
117 | #endif | 117 | #endif |
118 | 118 | ||
119 | /* Storage reserved for other modules: */ | ||
120 | union nf_conntrack_proto proto; | ||
121 | |||
122 | /* Extensions */ | 119 | /* Extensions */ |
123 | struct nf_ct_ext *ext; | 120 | struct nf_ct_ext *ext; |
124 | #ifdef CONFIG_NET_NS | 121 | #ifdef CONFIG_NET_NS |
125 | struct net *ct_net; | 122 | struct net *ct_net; |
126 | #endif | 123 | #endif |
124 | |||
125 | /* Storage reserved for other modules, must be the last member */ | ||
126 | union nf_conntrack_proto proto; | ||
127 | }; | 127 | }; |
128 | 128 | ||
129 | static inline struct nf_conn * | 129 | static inline struct nf_conn * |
diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c index 27a5ea6b6a0f..0ba7d4801daf 100644 --- a/net/netfilter/nf_conntrack_core.c +++ b/net/netfilter/nf_conntrack_core.c | |||
@@ -651,7 +651,8 @@ __nf_conntrack_alloc(struct net *net, u16 zone, | |||
651 | * and ct->tuplehash[IP_CT_DIR_REPLY].hnnode.next unchanged. | 651 | * and ct->tuplehash[IP_CT_DIR_REPLY].hnnode.next unchanged. |
652 | */ | 652 | */ |
653 | memset(&ct->tuplehash[IP_CT_DIR_MAX], 0, | 653 | memset(&ct->tuplehash[IP_CT_DIR_MAX], 0, |
654 | sizeof(*ct) - offsetof(struct nf_conn, tuplehash[IP_CT_DIR_MAX])); | 654 | offsetof(struct nf_conn, proto) - |
655 | offsetof(struct nf_conn, tuplehash[IP_CT_DIR_MAX])); | ||
655 | spin_lock_init(&ct->lock); | 656 | spin_lock_init(&ct->lock); |
656 | ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple = *orig; | 657 | ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple = *orig; |
657 | ct->tuplehash[IP_CT_DIR_ORIGINAL].hnnode.pprev = NULL; | 658 | ct->tuplehash[IP_CT_DIR_ORIGINAL].hnnode.pprev = NULL; |
diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c index b729ace1dcc1..7f59be82449f 100644 --- a/net/netfilter/nf_conntrack_netlink.c +++ b/net/netfilter/nf_conntrack_netlink.c | |||
@@ -1375,6 +1375,7 @@ ctnetlink_create_conntrack(struct net *net, u16 zone, | |||
1375 | } | 1375 | } |
1376 | #endif | 1376 | #endif |
1377 | 1377 | ||
1378 | memset(&ct->proto, 0, sizeof(ct->proto)); | ||
1378 | if (cda[CTA_PROTOINFO]) { | 1379 | if (cda[CTA_PROTOINFO]) { |
1379 | err = ctnetlink_change_protoinfo(ct, cda); | 1380 | err = ctnetlink_change_protoinfo(ct, cda); |
1380 | if (err < 0) | 1381 | if (err < 0) |
diff --git a/net/netfilter/nf_conntrack_proto_dccp.c b/net/netfilter/nf_conntrack_proto_dccp.c index 5292560d6d4a..9ae57c57c50e 100644 --- a/net/netfilter/nf_conntrack_proto_dccp.c +++ b/net/netfilter/nf_conntrack_proto_dccp.c | |||
@@ -452,6 +452,9 @@ static bool dccp_new(struct nf_conn *ct, const struct sk_buff *skb, | |||
452 | ct->proto.dccp.role[IP_CT_DIR_ORIGINAL] = CT_DCCP_ROLE_CLIENT; | 452 | ct->proto.dccp.role[IP_CT_DIR_ORIGINAL] = CT_DCCP_ROLE_CLIENT; |
453 | ct->proto.dccp.role[IP_CT_DIR_REPLY] = CT_DCCP_ROLE_SERVER; | 453 | ct->proto.dccp.role[IP_CT_DIR_REPLY] = CT_DCCP_ROLE_SERVER; |
454 | ct->proto.dccp.state = CT_DCCP_NONE; | 454 | ct->proto.dccp.state = CT_DCCP_NONE; |
455 | ct->proto.dccp.last_pkt = DCCP_PKT_REQUEST; | ||
456 | ct->proto.dccp.last_dir = IP_CT_DIR_ORIGINAL; | ||
457 | ct->proto.dccp.handshake_seq = 0; | ||
455 | return true; | 458 | return true; |
456 | 459 | ||
457 | out_invalid: | 460 | out_invalid: |
diff --git a/net/netfilter/nf_conntrack_proto_sctp.c b/net/netfilter/nf_conntrack_proto_sctp.c index c6049c2d5ea8..6f4ee70f460b 100644 --- a/net/netfilter/nf_conntrack_proto_sctp.c +++ b/net/netfilter/nf_conntrack_proto_sctp.c | |||
@@ -413,6 +413,7 @@ static bool sctp_new(struct nf_conn *ct, const struct sk_buff *skb, | |||
413 | test_bit(SCTP_CID_COOKIE_ACK, map)) | 413 | test_bit(SCTP_CID_COOKIE_ACK, map)) |
414 | return false; | 414 | return false; |
415 | 415 | ||
416 | memset(&ct->proto.sctp, 0, sizeof(ct->proto.sctp)); | ||
416 | new_state = SCTP_CONNTRACK_MAX; | 417 | new_state = SCTP_CONNTRACK_MAX; |
417 | for_each_sctp_chunk (skb, sch, _sch, offset, dataoff, count) { | 418 | for_each_sctp_chunk (skb, sch, _sch, offset, dataoff, count) { |
418 | /* Don't need lock here: this conntrack not in circulation yet */ | 419 | /* Don't need lock here: this conntrack not in circulation yet */ |
diff --git a/net/netfilter/nf_conntrack_proto_tcp.c b/net/netfilter/nf_conntrack_proto_tcp.c index 3fb2b73b24dc..6f38d0e2ea4a 100644 --- a/net/netfilter/nf_conntrack_proto_tcp.c +++ b/net/netfilter/nf_conntrack_proto_tcp.c | |||
@@ -1066,9 +1066,7 @@ static bool tcp_new(struct nf_conn *ct, const struct sk_buff *skb, | |||
1066 | BUG_ON(th == NULL); | 1066 | BUG_ON(th == NULL); |
1067 | 1067 | ||
1068 | /* Don't need lock here: this conntrack not in circulation yet */ | 1068 | /* Don't need lock here: this conntrack not in circulation yet */ |
1069 | new_state | 1069 | new_state = tcp_conntracks[0][get_conntrack_index(th)][TCP_CONNTRACK_NONE]; |
1070 | = tcp_conntracks[0][get_conntrack_index(th)] | ||
1071 | [TCP_CONNTRACK_NONE]; | ||
1072 | 1070 | ||
1073 | /* Invalid: delete conntrack */ | 1071 | /* Invalid: delete conntrack */ |
1074 | if (new_state >= TCP_CONNTRACK_MAX) { | 1072 | if (new_state >= TCP_CONNTRACK_MAX) { |
@@ -1077,6 +1075,7 @@ static bool tcp_new(struct nf_conn *ct, const struct sk_buff *skb, | |||
1077 | } | 1075 | } |
1078 | 1076 | ||
1079 | if (new_state == TCP_CONNTRACK_SYN_SENT) { | 1077 | if (new_state == TCP_CONNTRACK_SYN_SENT) { |
1078 | memset(&ct->proto.tcp, 0, sizeof(ct->proto.tcp)); | ||
1080 | /* SYN packet */ | 1079 | /* SYN packet */ |
1081 | ct->proto.tcp.seen[0].td_end = | 1080 | ct->proto.tcp.seen[0].td_end = |
1082 | segment_seq_plus_len(ntohl(th->seq), skb->len, | 1081 | segment_seq_plus_len(ntohl(th->seq), skb->len, |
@@ -1088,11 +1087,11 @@ static bool tcp_new(struct nf_conn *ct, const struct sk_buff *skb, | |||
1088 | ct->proto.tcp.seen[0].td_end; | 1087 | ct->proto.tcp.seen[0].td_end; |
1089 | 1088 | ||
1090 | tcp_options(skb, dataoff, th, &ct->proto.tcp.seen[0]); | 1089 | tcp_options(skb, dataoff, th, &ct->proto.tcp.seen[0]); |
1091 | ct->proto.tcp.seen[1].flags = 0; | ||
1092 | } else if (nf_ct_tcp_loose == 0) { | 1090 | } else if (nf_ct_tcp_loose == 0) { |
1093 | /* Don't try to pick up connections. */ | 1091 | /* Don't try to pick up connections. */ |
1094 | return false; | 1092 | return false; |
1095 | } else { | 1093 | } else { |
1094 | memset(&ct->proto.tcp, 0, sizeof(ct->proto.tcp)); | ||
1096 | /* | 1095 | /* |
1097 | * We are in the middle of a connection, | 1096 | * We are in the middle of a connection, |
1098 | * its history is lost for us. | 1097 | * its history is lost for us. |
@@ -1107,7 +1106,6 @@ static bool tcp_new(struct nf_conn *ct, const struct sk_buff *skb, | |||
1107 | ct->proto.tcp.seen[0].td_maxend = | 1106 | ct->proto.tcp.seen[0].td_maxend = |
1108 | ct->proto.tcp.seen[0].td_end + | 1107 | ct->proto.tcp.seen[0].td_end + |
1109 | ct->proto.tcp.seen[0].td_maxwin; | 1108 | ct->proto.tcp.seen[0].td_maxwin; |
1110 | ct->proto.tcp.seen[0].td_scale = 0; | ||
1111 | 1109 | ||
1112 | /* We assume SACK and liberal window checking to handle | 1110 | /* We assume SACK and liberal window checking to handle |
1113 | * window scaling */ | 1111 | * window scaling */ |
@@ -1116,13 +1114,7 @@ static bool tcp_new(struct nf_conn *ct, const struct sk_buff *skb, | |||
1116 | IP_CT_TCP_FLAG_BE_LIBERAL; | 1114 | IP_CT_TCP_FLAG_BE_LIBERAL; |
1117 | } | 1115 | } |
1118 | 1116 | ||
1119 | ct->proto.tcp.seen[1].td_end = 0; | ||
1120 | ct->proto.tcp.seen[1].td_maxend = 0; | ||
1121 | ct->proto.tcp.seen[1].td_maxwin = 0; | ||
1122 | ct->proto.tcp.seen[1].td_scale = 0; | ||
1123 | |||
1124 | /* tcp_packet will set them */ | 1117 | /* tcp_packet will set them */ |
1125 | ct->proto.tcp.state = TCP_CONNTRACK_NONE; | ||
1126 | ct->proto.tcp.last_index = TCP_NONE_SET; | 1118 | ct->proto.tcp.last_index = TCP_NONE_SET; |
1127 | 1119 | ||
1128 | pr_debug("tcp_new: sender end=%u maxend=%u maxwin=%u scale=%i " | 1120 | pr_debug("tcp_new: sender end=%u maxend=%u maxwin=%u scale=%i " |