target: Fix bug in handling of FILEIO + block_device resize ops
[linux-flexiantxendom0-3.2.10.git] / net / netfilter / ipvs / ip_vs_proto_sctp.c
1 #include <linux/kernel.h>
2 #include <linux/ip.h>
3 #include <linux/sctp.h>
4 #include <net/ip.h>
5 #include <net/ip6_checksum.h>
6 #include <linux/netfilter.h>
7 #include <linux/netfilter_ipv4.h>
8 #include <net/sctp/checksum.h>
9 #include <net/ip_vs.h>
10
11 static int
12 sctp_conn_schedule(int af, struct sk_buff *skb, struct ip_vs_proto_data *pd,
13                    int *verdict, struct ip_vs_conn **cpp)
14 {
15         struct net *net;
16         struct ip_vs_service *svc;
17         sctp_chunkhdr_t _schunkh, *sch;
18         sctp_sctphdr_t *sh, _sctph;
19         struct ip_vs_iphdr iph;
20
21         ip_vs_fill_iphdr(af, skb_network_header(skb), &iph);
22
23         sh = skb_header_pointer(skb, iph.len, sizeof(_sctph), &_sctph);
24         if (sh == NULL)
25                 return 0;
26
27         sch = skb_header_pointer(skb, iph.len + sizeof(sctp_sctphdr_t),
28                                  sizeof(_schunkh), &_schunkh);
29         if (sch == NULL)
30                 return 0;
31         net = skb_net(skb);
32         if ((sch->type == SCTP_CID_INIT) &&
33             (svc = ip_vs_service_get(net, af, skb->mark, iph.protocol,
34                                      &iph.daddr, sh->dest))) {
35                 int ignored;
36
37                 if (ip_vs_todrop(net_ipvs(net))) {
38                         /*
39                          * It seems that we are very loaded.
40                          * We have to drop this packet :(
41                          */
42                         ip_vs_service_put(svc);
43                         *verdict = NF_DROP;
44                         return 0;
45                 }
46                 /*
47                  * Let the virtual server select a real server for the
48                  * incoming connection, and create a connection entry.
49                  */
50                 *cpp = ip_vs_schedule(svc, skb, pd, &ignored);
51                 if (!*cpp && ignored <= 0) {
52                         if (!ignored)
53                                 *verdict = ip_vs_leave(svc, skb, pd);
54                         else {
55                                 ip_vs_service_put(svc);
56                                 *verdict = NF_DROP;
57                         }
58                         return 0;
59                 }
60                 ip_vs_service_put(svc);
61         }
62         /* NF_ACCEPT */
63         return 1;
64 }
65
66 static int
67 sctp_snat_handler(struct sk_buff *skb,
68                   struct ip_vs_protocol *pp, struct ip_vs_conn *cp)
69 {
70         sctp_sctphdr_t *sctph;
71         unsigned int sctphoff;
72         struct sk_buff *iter;
73         __be32 crc32;
74
75 #ifdef CONFIG_IP_VS_IPV6
76         if (cp->af == AF_INET6)
77                 sctphoff = sizeof(struct ipv6hdr);
78         else
79 #endif
80                 sctphoff = ip_hdrlen(skb);
81
82         /* csum_check requires unshared skb */
83         if (!skb_make_writable(skb, sctphoff + sizeof(*sctph)))
84                 return 0;
85
86         if (unlikely(cp->app != NULL)) {
87                 /* Some checks before mangling */
88                 if (pp->csum_check && !pp->csum_check(cp->af, skb, pp))
89                         return 0;
90
91                 /* Call application helper if needed */
92                 if (!ip_vs_app_pkt_out(cp, skb))
93                         return 0;
94         }
95
96         sctph = (void *) skb_network_header(skb) + sctphoff;
97         sctph->source = cp->vport;
98
99         /* Calculate the checksum */
100         crc32 = sctp_start_cksum((u8 *) sctph, skb_headlen(skb) - sctphoff);
101         skb_walk_frags(skb, iter)
102                 crc32 = sctp_update_cksum((u8 *) iter->data, skb_headlen(iter),
103                                           crc32);
104         crc32 = sctp_end_cksum(crc32);
105         sctph->checksum = crc32;
106
107         return 1;
108 }
109
110 static int
111 sctp_dnat_handler(struct sk_buff *skb,
112                   struct ip_vs_protocol *pp, struct ip_vs_conn *cp)
113 {
114         sctp_sctphdr_t *sctph;
115         unsigned int sctphoff;
116         struct sk_buff *iter;
117         __be32 crc32;
118
119 #ifdef CONFIG_IP_VS_IPV6
120         if (cp->af == AF_INET6)
121                 sctphoff = sizeof(struct ipv6hdr);
122         else
123 #endif
124                 sctphoff = ip_hdrlen(skb);
125
126         /* csum_check requires unshared skb */
127         if (!skb_make_writable(skb, sctphoff + sizeof(*sctph)))
128                 return 0;
129
130         if (unlikely(cp->app != NULL)) {
131                 /* Some checks before mangling */
132                 if (pp->csum_check && !pp->csum_check(cp->af, skb, pp))
133                         return 0;
134
135                 /* Call application helper if needed */
136                 if (!ip_vs_app_pkt_in(cp, skb))
137                         return 0;
138         }
139
140         sctph = (void *) skb_network_header(skb) + sctphoff;
141         sctph->dest = cp->dport;
142
143         /* Calculate the checksum */
144         crc32 = sctp_start_cksum((u8 *) sctph, skb_headlen(skb) - sctphoff);
145         skb_walk_frags(skb, iter)
146                 crc32 = sctp_update_cksum((u8 *) iter->data, skb_headlen(iter),
147                                           crc32);
148         crc32 = sctp_end_cksum(crc32);
149         sctph->checksum = crc32;
150
151         return 1;
152 }
153
154 static int
155 sctp_csum_check(int af, struct sk_buff *skb, struct ip_vs_protocol *pp)
156 {
157         unsigned int sctphoff;
158         struct sctphdr *sh, _sctph;
159         struct sk_buff *iter;
160         __le32 cmp;
161         __le32 val;
162         __u32 tmp;
163
164 #ifdef CONFIG_IP_VS_IPV6
165         if (af == AF_INET6)
166                 sctphoff = sizeof(struct ipv6hdr);
167         else
168 #endif
169                 sctphoff = ip_hdrlen(skb);
170
171         sh = skb_header_pointer(skb, sctphoff, sizeof(_sctph), &_sctph);
172         if (sh == NULL)
173                 return 0;
174
175         cmp = sh->checksum;
176
177         tmp = sctp_start_cksum((__u8 *) sh, skb_headlen(skb));
178         skb_walk_frags(skb, iter)
179                 tmp = sctp_update_cksum((__u8 *) iter->data,
180                                         skb_headlen(iter), tmp);
181
182         val = sctp_end_cksum(tmp);
183
184         if (val != cmp) {
185                 /* CRC failure, dump it. */
186                 IP_VS_DBG_RL_PKT(0, af, pp, skb, 0,
187                                 "Failed checksum for");
188                 return 0;
189         }
190         return 1;
191 }
192
193 struct ipvs_sctp_nextstate {
194         int next_state;
195 };
196 enum ipvs_sctp_event_t {
197         IP_VS_SCTP_EVE_DATA_CLI,
198         IP_VS_SCTP_EVE_DATA_SER,
199         IP_VS_SCTP_EVE_INIT_CLI,
200         IP_VS_SCTP_EVE_INIT_SER,
201         IP_VS_SCTP_EVE_INIT_ACK_CLI,
202         IP_VS_SCTP_EVE_INIT_ACK_SER,
203         IP_VS_SCTP_EVE_COOKIE_ECHO_CLI,
204         IP_VS_SCTP_EVE_COOKIE_ECHO_SER,
205         IP_VS_SCTP_EVE_COOKIE_ACK_CLI,
206         IP_VS_SCTP_EVE_COOKIE_ACK_SER,
207         IP_VS_SCTP_EVE_ABORT_CLI,
208         IP_VS_SCTP_EVE__ABORT_SER,
209         IP_VS_SCTP_EVE_SHUT_CLI,
210         IP_VS_SCTP_EVE_SHUT_SER,
211         IP_VS_SCTP_EVE_SHUT_ACK_CLI,
212         IP_VS_SCTP_EVE_SHUT_ACK_SER,
213         IP_VS_SCTP_EVE_SHUT_COM_CLI,
214         IP_VS_SCTP_EVE_SHUT_COM_SER,
215         IP_VS_SCTP_EVE_LAST
216 };
217
218 static enum ipvs_sctp_event_t sctp_events[255] = {
219         IP_VS_SCTP_EVE_DATA_CLI,
220         IP_VS_SCTP_EVE_INIT_CLI,
221         IP_VS_SCTP_EVE_INIT_ACK_CLI,
222         IP_VS_SCTP_EVE_DATA_CLI,
223         IP_VS_SCTP_EVE_DATA_CLI,
224         IP_VS_SCTP_EVE_DATA_CLI,
225         IP_VS_SCTP_EVE_ABORT_CLI,
226         IP_VS_SCTP_EVE_SHUT_CLI,
227         IP_VS_SCTP_EVE_SHUT_ACK_CLI,
228         IP_VS_SCTP_EVE_DATA_CLI,
229         IP_VS_SCTP_EVE_COOKIE_ECHO_CLI,
230         IP_VS_SCTP_EVE_COOKIE_ACK_CLI,
231         IP_VS_SCTP_EVE_DATA_CLI,
232         IP_VS_SCTP_EVE_DATA_CLI,
233         IP_VS_SCTP_EVE_SHUT_COM_CLI,
234 };
235
236 static struct ipvs_sctp_nextstate
237  sctp_states_table[IP_VS_SCTP_S_LAST][IP_VS_SCTP_EVE_LAST] = {
238         /*
239          * STATE : IP_VS_SCTP_S_NONE
240          */
241         /*next state *//*event */
242         {{IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_DATA_CLI */ },
243          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_DATA_SER */ },
244          {IP_VS_SCTP_S_INIT_CLI /* IP_VS_SCTP_EVE_INIT_CLI */ },
245          {IP_VS_SCTP_S_INIT_SER /* IP_VS_SCTP_EVE_INIT_SER */ },
246          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_INIT_ACK_CLI */ },
247          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_INIT_ACK_SER */ },
248          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_COOKIE_ECHO_CLI */ },
249          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_COOKIE_ECHO_SER */ },
250          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_COOKIE_ACK_CLI */ },
251          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_COOKIE_ACK_SER */ },
252          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_ABORT_CLI */ },
253          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_ABORT_SER */ },
254          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_CLI */ },
255          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_SER */ },
256          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_ACK_CLI */ },
257          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_ACK_SER */ },
258          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_COM_CLI */ },
259          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_COM_SER */ },
260          },
261         /*
262          * STATE : IP_VS_SCTP_S_INIT_CLI
263          * Cient sent INIT and is waiting for reply from server(In ECHO_WAIT)
264          */
265         {{IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_DATA_CLI */ },
266          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_DATA_SER */ },
267          {IP_VS_SCTP_S_INIT_CLI /* IP_VS_SCTP_EVE_INIT_CLI */ },
268          {IP_VS_SCTP_S_INIT_SER /* IP_VS_SCTP_EVE_INIT_SER */ },
269          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_INIT_ACK_CLI */ },
270          {IP_VS_SCTP_S_INIT_ACK_SER /* IP_VS_SCTP_EVE_INIT_ACK_SER */ },
271          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_ECHO_CLI */ },
272          {IP_VS_SCTP_S_INIT_CLI /* IP_VS_SCTP_EVE_ECHO_SER */ },
273          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_COOKIE_ACK_CLI */ },
274          {IP_VS_SCTP_S_INIT_CLI /* IP_VS_SCTP_EVE_COOKIE_ACK_SER */ },
275          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_ABORT_CLI */ },
276          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_ABORT_SER */ },
277          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_CLI */ },
278          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_SER */ },
279          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_ACK_CLI */ },
280          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_ACK_SER */ },
281          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_COM_CLI */ },
282          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_COM_SER */ }
283          },
284         /*
285          * State : IP_VS_SCTP_S_INIT_SER
286          * Server sent INIT and waiting for INIT ACK from the client
287          */
288         {{IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_DATA_CLI */ },
289          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_DATA_SER */ },
290          {IP_VS_SCTP_S_INIT_CLI /* IP_VS_SCTP_EVE_INIT_CLI */ },
291          {IP_VS_SCTP_S_INIT_SER /* IP_VS_SCTP_EVE_INIT_SER */ },
292          {IP_VS_SCTP_S_INIT_ACK_CLI /* IP_VS_SCTP_EVE_INIT_ACK_CLI */ },
293          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_INIT_ACK_SER */ },
294          {IP_VS_SCTP_S_INIT_SER /* IP_VS_SCTP_EVE_COOKIE_ECHO_CLI */ },
295          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_COOKIE_ECHO_SER */ },
296          {IP_VS_SCTP_S_INIT_SER /* IP_VS_SCTP_EVE_COOKIE_ACK_CLI */ },
297          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_COOKIE_ACK_SER */ },
298          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_ABORT_CLI */ },
299          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_ABORT_SER */ },
300          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_CLI */ },
301          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_SER */ },
302          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_ACK_CLI */ },
303          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_ACK_SER */ },
304          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_COM_CLI */ },
305          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_COM_SER */ }
306          },
307         /*
308          * State : IP_VS_SCTP_S_INIT_ACK_CLI
309          * Client sent INIT ACK and waiting for ECHO from the server
310          */
311         {{IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_DATA_CLI */ },
312          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_DATA_SER */ },
313          /*
314           * We have got an INIT from client. From the spec.“Upon receipt of
315           * an INIT in the COOKIE-WAIT state, an endpoint MUST respond with
316           * an INIT ACK using the same parameters it sent in its  original
317           * INIT chunk (including its Initiate Tag, unchanged”).
318           */
319          {IP_VS_SCTP_S_INIT_CLI /* IP_VS_SCTP_EVE_INIT_CLI */ },
320          {IP_VS_SCTP_S_INIT_SER /* IP_VS_SCTP_EVE_INIT_SER */ },
321          /*
322           * INIT_ACK has been resent by the client, let us stay is in
323           * the same state
324           */
325          {IP_VS_SCTP_S_INIT_ACK_CLI /* IP_VS_SCTP_EVE_INIT_ACK_CLI */ },
326          /*
327           * INIT_ACK sent by the server, close the connection
328           */
329          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_INIT_ACK_SER */ },
330          /*
331           * ECHO by client, it should not happen, close the connection
332           */
333          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_COOKIE_ECHO_CLI */ },
334          /*
335           * ECHO by server, this is what we are expecting, move to ECHO_SER
336           */
337          {IP_VS_SCTP_S_ECHO_SER /* IP_VS_SCTP_EVE_COOKIE_ECHO_SER */ },
338          /*
339           * COOKIE ACK from client, it should not happen, close the connection
340           */
341          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_COOKIE_ACK_CLI */ },
342          /*
343           * Unexpected COOKIE ACK from server, staty in the same state
344           */
345          {IP_VS_SCTP_S_INIT_ACK_CLI /* IP_VS_SCTP_EVE_COOKIE_ACK_SER */ },
346          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_ABORT_CLI */ },
347          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_ABORT_SER */ },
348          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_CLI */ },
349          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_SER */ },
350          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_ACK_CLI */ },
351          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_ACK_SER */ },
352          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_COM_CLI */ },
353          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_COM_SER */ }
354          },
355         /*
356          * State : IP_VS_SCTP_S_INIT_ACK_SER
357          * Server sent INIT ACK and waiting for ECHO from the client
358          */
359         {{IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_DATA_CLI */ },
360          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_DATA_SER */ },
361          /*
362           * We have got an INIT from client. From the spec.“Upon receipt of
363           * an INIT in the COOKIE-WAIT state, an endpoint MUST respond with
364           * an INIT ACK using the same parameters it sent in its  original
365           * INIT chunk (including its Initiate Tag, unchanged”).
366           */
367          {IP_VS_SCTP_S_INIT_CLI /* IP_VS_SCTP_EVE_INIT_CLI */ },
368          {IP_VS_SCTP_S_INIT_SER /* IP_VS_SCTP_EVE_INIT_SER */ },
369          /*
370           * Unexpected INIT_ACK by the client, let us close the connection
371           */
372          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_INIT_ACK_CLI */ },
373          /*
374           * INIT_ACK resent by the server, let us move to same state
375           */
376          {IP_VS_SCTP_S_INIT_ACK_SER /* IP_VS_SCTP_EVE_INIT_ACK_SER */ },
377          /*
378           * Client send the ECHO, this is what we are expecting,
379           * move to ECHO_CLI
380           */
381          {IP_VS_SCTP_S_ECHO_CLI /* IP_VS_SCTP_EVE_COOKIE_ECHO_CLI */ },
382          /*
383           * ECHO received from the server, Not sure what to do,
384           * let us close it
385           */
386          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_COOKIE_ECHO_SER */ },
387          /*
388           * COOKIE ACK from client, let us stay in the same state
389           */
390          {IP_VS_SCTP_S_INIT_ACK_SER /* IP_VS_SCTP_EVE_COOKIE_ACK_CLI */ },
391          /*
392           * COOKIE ACK from server, hmm... this should not happen, lets close
393           * the connection.
394           */
395          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_COOKIE_ACK_SER */ },
396          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_ABORT_CLI */ },
397          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_ABORT_SER */ },
398          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_CLI */ },
399          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_SER */ },
400          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_ACK_CLI */ },
401          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_ACK_SER */ },
402          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_COM_CLI */ },
403          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_COM_SER */ }
404          },
405         /*
406          * State : IP_VS_SCTP_S_ECHO_CLI
407          * Cient  sent ECHO and waiting COOKEI ACK from the Server
408          */
409         {{IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_DATA_CLI */ },
410          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_DATA_SER */ },
411          /*
412           * We have got an INIT from client. From the spec.“Upon receipt of
413           * an INIT in the COOKIE-WAIT state, an endpoint MUST respond with
414           * an INIT ACK using the same parameters it sent in its  original
415           * INIT chunk (including its Initiate Tag, unchanged”).
416           */
417          {IP_VS_SCTP_S_INIT_CLI /* IP_VS_SCTP_EVE_INIT_CLI */ },
418          {IP_VS_SCTP_S_INIT_SER /* IP_VS_SCTP_EVE_INIT_SER */ },
419          /*
420           * INIT_ACK has been by the client, let us close the connection
421           */
422          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_INIT_ACK_CLI */ },
423          /*
424           * INIT_ACK sent by the server, Unexpected INIT ACK, spec says,
425           * “If an INIT ACK is received by an endpoint in any state other
426           * than the COOKIE-WAIT state, the endpoint should discard the
427           * INIT ACK chunk”. Stay in the same state
428           */
429          {IP_VS_SCTP_S_ECHO_CLI /* IP_VS_SCTP_EVE_INIT_ACK_SER */ },
430          /*
431           * Client resent the ECHO, let us stay in the same state
432           */
433          {IP_VS_SCTP_S_ECHO_CLI /* IP_VS_SCTP_EVE_COOKIE_ECHO_CLI */ },
434          /*
435           * ECHO received from the server, Not sure what to do,
436           * let us close it
437           */
438          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_COOKIE_ECHO_SER */ },
439          /*
440           * COOKIE ACK from client, this shoud not happen, let's close the
441           * connection
442           */
443          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_COOKIE_ACK_CLI */ },
444          /*
445           * COOKIE ACK from server, this is what we are awaiting,lets move to
446           * ESTABLISHED.
447           */
448          {IP_VS_SCTP_S_ESTABLISHED /* IP_VS_SCTP_EVE_COOKIE_ACK_SER */ },
449          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_ABORT_CLI */ },
450          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_ABORT_SER */ },
451          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_CLI */ },
452          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_SER */ },
453          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_ACK_CLI */ },
454          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_ACK_SER */ },
455          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_COM_CLI */ },
456          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_COM_SER */ }
457          },
458         /*
459          * State : IP_VS_SCTP_S_ECHO_SER
460          * Server sent ECHO and waiting COOKEI ACK from the client
461          */
462         {{IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_DATA_CLI */ },
463          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_DATA_SER */ },
464          /*
465           * We have got an INIT from client. From the spec.“Upon receipt of
466           * an INIT in the COOKIE-WAIT state, an endpoint MUST respond with
467           * an INIT ACK using the same parameters it sent in its  original
468           * INIT chunk (including its Initiate Tag, unchanged”).
469           */
470          {IP_VS_SCTP_S_INIT_CLI /* IP_VS_SCTP_EVE_INIT_CLI */ },
471          {IP_VS_SCTP_S_INIT_SER /* IP_VS_SCTP_EVE_INIT_SER */ },
472          /*
473           * INIT_ACK sent by the server, Unexpected INIT ACK, spec says,
474           * “If an INIT ACK is received by an endpoint in any state other
475           * than the COOKIE-WAIT state, the endpoint should discard the
476           * INIT ACK chunk”. Stay in the same state
477           */
478          {IP_VS_SCTP_S_ECHO_SER /* IP_VS_SCTP_EVE_INIT_ACK_CLI */ },
479          /*
480           * INIT_ACK has been by the server, let us close the connection
481           */
482          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_INIT_ACK_SER */ },
483          /*
484           * Client sent the ECHO, not sure what to do, let's close the
485           * connection.
486           */
487          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_COOKIE_ECHO_CLI */ },
488          /*
489           * ECHO resent by the server, stay in the same state
490           */
491          {IP_VS_SCTP_S_ECHO_SER /* IP_VS_SCTP_EVE_COOKIE_ECHO_SER */ },
492          /*
493           * COOKIE ACK from client, this is what we are expecting, let's move
494           * to ESTABLISHED.
495           */
496          {IP_VS_SCTP_S_ESTABLISHED /* IP_VS_SCTP_EVE_COOKIE_ACK_CLI */ },
497          /*
498           * COOKIE ACK from server, this should not happen, lets close the
499           * connection.
500           */
501          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_COOKIE_ACK_SER */ },
502          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_ABORT_CLI */ },
503          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_ABORT_SER */ },
504          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_CLI */ },
505          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_SER */ },
506          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_ACK_CLI */ },
507          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_ACK_SER */ },
508          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_COM_CLI */ },
509          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_COM_SER */ }
510          },
511         /*
512          * State : IP_VS_SCTP_S_ESTABLISHED
513          * Association established
514          */
515         {{IP_VS_SCTP_S_ESTABLISHED /* IP_VS_SCTP_EVE_DATA_CLI */ },
516          {IP_VS_SCTP_S_ESTABLISHED /* IP_VS_SCTP_EVE_DATA_SER */ },
517          /*
518           * We have got an INIT from client. From the spec.“Upon receipt of
519           * an INIT in the COOKIE-WAIT state, an endpoint MUST respond with
520           * an INIT ACK using the same parameters it sent in its  original
521           * INIT chunk (including its Initiate Tag, unchanged”).
522           */
523          {IP_VS_SCTP_S_INIT_CLI /* IP_VS_SCTP_EVE_INIT_CLI */ },
524          {IP_VS_SCTP_S_INIT_SER /* IP_VS_SCTP_EVE_INIT_SER */ },
525          /*
526           * INIT_ACK sent by the server, Unexpected INIT ACK, spec says,
527           * “If an INIT ACK is received by an endpoint in any state other
528           * than the COOKIE-WAIT state, the endpoint should discard the
529           * INIT ACK chunk”. Stay in the same state
530           */
531          {IP_VS_SCTP_S_ESTABLISHED /* IP_VS_SCTP_EVE_INIT_ACK_CLI */ },
532          {IP_VS_SCTP_S_ESTABLISHED /* IP_VS_SCTP_EVE_INIT_ACK_SER */ },
533          /*
534           * Client sent ECHO, Spec(sec 5.2.4) says it may be handled by the
535           * peer and peer shall move to the ESTABISHED. if it doesn't handle
536           * it will send ERROR chunk. So, stay in the same state
537           */
538          {IP_VS_SCTP_S_ESTABLISHED /* IP_VS_SCTP_EVE_COOKIE_ECHO_CLI */ },
539          {IP_VS_SCTP_S_ESTABLISHED /* IP_VS_SCTP_EVE_COOKIE_ECHO_SER */ },
540          /*
541           * COOKIE ACK from client, not sure what to do stay in the same state
542           */
543          {IP_VS_SCTP_S_ESTABLISHED /* IP_VS_SCTP_EVE_COOKIE_ACK_CLI */ },
544          {IP_VS_SCTP_S_ESTABLISHED /* IP_VS_SCTP_EVE_COOKIE_ACK_SER */ },
545          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_ABORT_CLI */ },
546          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_ABORT_SER */ },
547          /*
548           * SHUTDOWN from the client, move to SHUDDOWN_CLI
549           */
550          {IP_VS_SCTP_S_SHUT_CLI /* IP_VS_SCTP_EVE_SHUT_CLI */ },
551          /*
552           * SHUTDOWN from the server, move to SHUTDOWN_SER
553           */
554          {IP_VS_SCTP_S_SHUT_SER /* IP_VS_SCTP_EVE_SHUT_SER */ },
555          /*
556           * client sent SHUDTDOWN_ACK, this should not happen, let's close
557           * the connection
558           */
559          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_ACK_CLI */ },
560          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_ACK_SER */ },
561          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_COM_CLI */ },
562          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_COM_SER */ }
563          },
564         /*
565          * State : IP_VS_SCTP_S_SHUT_CLI
566          * SHUTDOWN sent from the client, waitinf for SHUT ACK from the server
567          */
568         /*
569          * We received the data chuck, keep the state unchanged. I assume
570          * that still data chuncks  can be received by both the peers in
571          * SHUDOWN state
572          */
573
574         {{IP_VS_SCTP_S_SHUT_CLI /* IP_VS_SCTP_EVE_DATA_CLI */ },
575          {IP_VS_SCTP_S_SHUT_CLI /* IP_VS_SCTP_EVE_DATA_SER */ },
576          /*
577           * We have got an INIT from client. From the spec.“Upon receipt of
578           * an INIT in the COOKIE-WAIT state, an endpoint MUST respond with
579           * an INIT ACK using the same parameters it sent in its  original
580           * INIT chunk (including its Initiate Tag, unchanged”).
581           */
582          {IP_VS_SCTP_S_INIT_CLI /* IP_VS_SCTP_EVE_INIT_CLI */ },
583          {IP_VS_SCTP_S_INIT_SER /* IP_VS_SCTP_EVE_INIT_SER */ },
584          /*
585           * INIT_ACK sent by the server, Unexpected INIT ACK, spec says,
586           * “If an INIT ACK is received by an endpoint in any state other
587           * than the COOKIE-WAIT state, the endpoint should discard the
588           * INIT ACK chunk”. Stay in the same state
589           */
590          {IP_VS_SCTP_S_SHUT_CLI /* IP_VS_SCTP_EVE_INIT_ACK_CLI */ },
591          {IP_VS_SCTP_S_SHUT_CLI /* IP_VS_SCTP_EVE_INIT_ACK_SER */ },
592          /*
593           * Client sent ECHO, Spec(sec 5.2.4) says it may be handled by the
594           * peer and peer shall move to the ESTABISHED. if it doesn't handle
595           * it will send ERROR chunk. So, stay in the same state
596           */
597          {IP_VS_SCTP_S_ESTABLISHED /* IP_VS_SCTP_EVE_COOKIE_ECHO_CLI */ },
598          {IP_VS_SCTP_S_ESTABLISHED /* IP_VS_SCTP_EVE_COOKIE_ECHO_SER */ },
599          /*
600           * COOKIE ACK from client, not sure what to do stay in the same state
601           */
602          {IP_VS_SCTP_S_SHUT_CLI /* IP_VS_SCTP_EVE_COOKIE_ACK_CLI */ },
603          {IP_VS_SCTP_S_SHUT_CLI /* IP_VS_SCTP_EVE_COOKIE_ACK_SER */ },
604          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_ABORT_CLI */ },
605          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_ABORT_SER */ },
606          /*
607           * SHUTDOWN resent from the client, move to SHUDDOWN_CLI
608           */
609          {IP_VS_SCTP_S_SHUT_CLI /* IP_VS_SCTP_EVE_SHUT_CLI */ },
610          /*
611           * SHUTDOWN from the server, move to SHUTDOWN_SER
612           */
613          {IP_VS_SCTP_S_SHUT_SER /* IP_VS_SCTP_EVE_SHUT_SER */ },
614          /*
615           * client sent SHUDTDOWN_ACK, this should not happen, let's close
616           * the connection
617           */
618          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_ACK_CLI */ },
619          /*
620           * Server sent SHUTDOWN ACK, this is what we are expecting, let's move
621           * to SHUDOWN_ACK_SER
622           */
623          {IP_VS_SCTP_S_SHUT_ACK_SER /* IP_VS_SCTP_EVE_SHUT_ACK_SER */ },
624          /*
625           * SHUTDOWN COM from client, this should not happen, let's close the
626           * connection
627           */
628          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_COM_CLI */ },
629          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_COM_SER */ }
630          },
631         /*
632          * State : IP_VS_SCTP_S_SHUT_SER
633          * SHUTDOWN sent from the server, waitinf for SHUTDOWN ACK from client
634          */
635         /*
636          * We received the data chuck, keep the state unchanged. I assume
637          * that still data chuncks  can be received by both the peers in
638          * SHUDOWN state
639          */
640
641         {{IP_VS_SCTP_S_SHUT_SER /* IP_VS_SCTP_EVE_DATA_CLI */ },
642          {IP_VS_SCTP_S_SHUT_SER /* IP_VS_SCTP_EVE_DATA_SER */ },
643          /*
644           * We have got an INIT from client. From the spec.“Upon receipt of
645           * an INIT in the COOKIE-WAIT state, an endpoint MUST respond with
646           * an INIT ACK using the same parameters it sent in its  original
647           * INIT chunk (including its Initiate Tag, unchanged”).
648           */
649          {IP_VS_SCTP_S_INIT_CLI /* IP_VS_SCTP_EVE_INIT_CLI */ },
650          {IP_VS_SCTP_S_INIT_SER /* IP_VS_SCTP_EVE_INIT_SER */ },
651          /*
652           * INIT_ACK sent by the server, Unexpected INIT ACK, spec says,
653           * “If an INIT ACK is received by an endpoint in any state other
654           * than the COOKIE-WAIT state, the endpoint should discard the
655           * INIT ACK chunk”. Stay in the same state
656           */
657          {IP_VS_SCTP_S_SHUT_SER /* IP_VS_SCTP_EVE_INIT_ACK_CLI */ },
658          {IP_VS_SCTP_S_SHUT_SER /* IP_VS_SCTP_EVE_INIT_ACK_SER */ },
659          /*
660           * Client sent ECHO, Spec(sec 5.2.4) says it may be handled by the
661           * peer and peer shall move to the ESTABISHED. if it doesn't handle
662           * it will send ERROR chunk. So, stay in the same state
663           */
664          {IP_VS_SCTP_S_ESTABLISHED /* IP_VS_SCTP_EVE_COOKIE_ECHO_CLI */ },
665          {IP_VS_SCTP_S_ESTABLISHED /* IP_VS_SCTP_EVE_COOKIE_ECHO_SER */ },
666          /*
667           * COOKIE ACK from client, not sure what to do stay in the same state
668           */
669          {IP_VS_SCTP_S_SHUT_SER /* IP_VS_SCTP_EVE_COOKIE_ACK_CLI */ },
670          {IP_VS_SCTP_S_SHUT_SER /* IP_VS_SCTP_EVE_COOKIE_ACK_SER */ },
671          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_ABORT_CLI */ },
672          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_ABORT_SER */ },
673          /*
674           * SHUTDOWN resent from the client, move to SHUDDOWN_CLI
675           */
676          {IP_VS_SCTP_S_SHUT_CLI /* IP_VS_SCTP_EVE_SHUT_CLI */ },
677          /*
678           * SHUTDOWN resent from the server, move to SHUTDOWN_SER
679           */
680          {IP_VS_SCTP_S_SHUT_SER /* IP_VS_SCTP_EVE_SHUT_SER */ },
681          /*
682           * client sent SHUDTDOWN_ACK, this is what we are expecting, let's
683           * move to SHUT_ACK_CLI
684           */
685          {IP_VS_SCTP_S_SHUT_ACK_CLI /* IP_VS_SCTP_EVE_SHUT_ACK_CLI */ },
686          /*
687           * Server sent SHUTDOWN ACK, this should not happen, let's close the
688           * connection
689           */
690          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_ACK_SER */ },
691          /*
692           * SHUTDOWN COM from client, this should not happen, let's close the
693           * connection
694           */
695          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_COM_CLI */ },
696          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_COM_SER */ }
697          },
698
699         /*
700          * State : IP_VS_SCTP_S_SHUT_ACK_CLI
701          * SHUTDOWN ACK from the client, awaiting for SHUTDOWN COM from server
702          */
703         /*
704          * We received the data chuck, keep the state unchanged. I assume
705          * that still data chuncks  can be received by both the peers in
706          * SHUDOWN state
707          */
708
709         {{IP_VS_SCTP_S_SHUT_ACK_CLI /* IP_VS_SCTP_EVE_DATA_CLI */ },
710          {IP_VS_SCTP_S_SHUT_ACK_CLI /* IP_VS_SCTP_EVE_DATA_SER */ },
711          /*
712           * We have got an INIT from client. From the spec.“Upon receipt of
713           * an INIT in the COOKIE-WAIT state, an endpoint MUST respond with
714           * an INIT ACK using the same parameters it sent in its  original
715           * INIT chunk (including its Initiate Tag, unchanged”).
716           */
717          {IP_VS_SCTP_S_INIT_CLI /* IP_VS_SCTP_EVE_INIT_CLI */ },
718          {IP_VS_SCTP_S_INIT_SER /* IP_VS_SCTP_EVE_INIT_SER */ },
719          /*
720           * INIT_ACK sent by the server, Unexpected INIT ACK, spec says,
721           * “If an INIT ACK is received by an endpoint in any state other
722           * than the COOKIE-WAIT state, the endpoint should discard the
723           * INIT ACK chunk”. Stay in the same state
724           */
725          {IP_VS_SCTP_S_SHUT_ACK_CLI /* IP_VS_SCTP_EVE_INIT_ACK_CLI */ },
726          {IP_VS_SCTP_S_SHUT_ACK_CLI /* IP_VS_SCTP_EVE_INIT_ACK_SER */ },
727          /*
728           * Client sent ECHO, Spec(sec 5.2.4) says it may be handled by the
729           * peer and peer shall move to the ESTABISHED. if it doesn't handle
730           * it will send ERROR chunk. So, stay in the same state
731           */
732          {IP_VS_SCTP_S_ESTABLISHED /* IP_VS_SCTP_EVE_COOKIE_ECHO_CLI */ },
733          {IP_VS_SCTP_S_ESTABLISHED /* IP_VS_SCTP_EVE_COOKIE_ECHO_SER */ },
734          /*
735           * COOKIE ACK from client, not sure what to do stay in the same state
736           */
737          {IP_VS_SCTP_S_SHUT_ACK_CLI /* IP_VS_SCTP_EVE_COOKIE_ACK_CLI */ },
738          {IP_VS_SCTP_S_SHUT_ACK_CLI /* IP_VS_SCTP_EVE_COOKIE_ACK_SER */ },
739          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_ABORT_CLI */ },
740          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_ABORT_SER */ },
741          /*
742           * SHUTDOWN sent from the client, move to SHUDDOWN_CLI
743           */
744          {IP_VS_SCTP_S_SHUT_CLI /* IP_VS_SCTP_EVE_SHUT_CLI */ },
745          /*
746           * SHUTDOWN sent from the server, move to SHUTDOWN_SER
747           */
748          {IP_VS_SCTP_S_SHUT_SER /* IP_VS_SCTP_EVE_SHUT_SER */ },
749          /*
750           * client resent SHUDTDOWN_ACK, let's stay in the same state
751           */
752          {IP_VS_SCTP_S_SHUT_ACK_CLI /* IP_VS_SCTP_EVE_SHUT_ACK_CLI */ },
753          /*
754           * Server sent SHUTDOWN ACK, this should not happen, let's close the
755           * connection
756           */
757          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_ACK_SER */ },
758          /*
759           * SHUTDOWN COM from client, this should not happen, let's close the
760           * connection
761           */
762          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_COM_CLI */ },
763          /*
764           * SHUTDOWN COMPLETE from server this is what we are expecting.
765           */
766          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_COM_SER */ }
767          },
768
769         /*
770          * State : IP_VS_SCTP_S_SHUT_ACK_SER
771          * SHUTDOWN ACK from the server, awaiting for SHUTDOWN COM from client
772          */
773         /*
774          * We received the data chuck, keep the state unchanged. I assume
775          * that still data chuncks  can be received by both the peers in
776          * SHUDOWN state
777          */
778
779         {{IP_VS_SCTP_S_SHUT_ACK_SER /* IP_VS_SCTP_EVE_DATA_CLI */ },
780          {IP_VS_SCTP_S_SHUT_ACK_SER /* IP_VS_SCTP_EVE_DATA_SER */ },
781          /*
782           * We have got an INIT from client. From the spec.“Upon receipt of
783           * an INIT in the COOKIE-WAIT state, an endpoint MUST respond with
784           * an INIT ACK using the same parameters it sent in its  original
785           * INIT chunk (including its Initiate Tag, unchanged”).
786           */
787          {IP_VS_SCTP_S_INIT_CLI /* IP_VS_SCTP_EVE_INIT_CLI */ },
788          {IP_VS_SCTP_S_INIT_SER /* IP_VS_SCTP_EVE_INIT_SER */ },
789          /*
790           * INIT_ACK sent by the server, Unexpected INIT ACK, spec says,
791           * “If an INIT ACK is received by an endpoint in any state other
792           * than the COOKIE-WAIT state, the endpoint should discard the
793           * INIT ACK chunk”. Stay in the same state
794           */
795          {IP_VS_SCTP_S_SHUT_ACK_SER /* IP_VS_SCTP_EVE_INIT_ACK_CLI */ },
796          {IP_VS_SCTP_S_SHUT_ACK_SER /* IP_VS_SCTP_EVE_INIT_ACK_SER */ },
797          /*
798           * Client sent ECHO, Spec(sec 5.2.4) says it may be handled by the
799           * peer and peer shall move to the ESTABISHED. if it doesn't handle
800           * it will send ERROR chunk. So, stay in the same state
801           */
802          {IP_VS_SCTP_S_ESTABLISHED /* IP_VS_SCTP_EVE_COOKIE_ECHO_CLI */ },
803          {IP_VS_SCTP_S_ESTABLISHED /* IP_VS_SCTP_EVE_COOKIE_ECHO_SER */ },
804          /*
805           * COOKIE ACK from client, not sure what to do stay in the same state
806           */
807          {IP_VS_SCTP_S_SHUT_ACK_SER /* IP_VS_SCTP_EVE_COOKIE_ACK_CLI */ },
808          {IP_VS_SCTP_S_SHUT_ACK_SER /* IP_VS_SCTP_EVE_COOKIE_ACK_SER */ },
809          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_ABORT_CLI */ },
810          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_ABORT_SER */ },
811          /*
812           * SHUTDOWN sent from the client, move to SHUDDOWN_CLI
813           */
814          {IP_VS_SCTP_S_SHUT_CLI /* IP_VS_SCTP_EVE_SHUT_CLI */ },
815          /*
816           * SHUTDOWN sent from the server, move to SHUTDOWN_SER
817           */
818          {IP_VS_SCTP_S_SHUT_SER /* IP_VS_SCTP_EVE_SHUT_SER */ },
819          /*
820           * client sent SHUDTDOWN_ACK, this should not happen let's close
821           * the connection.
822           */
823          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_ACK_CLI */ },
824          /*
825           * Server resent SHUTDOWN ACK, stay in the same state
826           */
827          {IP_VS_SCTP_S_SHUT_ACK_SER /* IP_VS_SCTP_EVE_SHUT_ACK_SER */ },
828          /*
829           * SHUTDOWN COM from client, this what we are expecting, let's close
830           * the connection
831           */
832          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_COM_CLI */ },
833          /*
834           * SHUTDOWN COMPLETE from server this should not happen.
835           */
836          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_COM_SER */ }
837          },
838         /*
839          * State : IP_VS_SCTP_S_CLOSED
840          */
841         {{IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_DATA_CLI */ },
842          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_DATA_SER */ },
843          {IP_VS_SCTP_S_INIT_CLI /* IP_VS_SCTP_EVE_INIT_CLI */ },
844          {IP_VS_SCTP_S_INIT_SER /* IP_VS_SCTP_EVE_INIT_SER */ },
845          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_INIT_ACK_CLI */ },
846          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_INIT_ACK_SER */ },
847          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_COOKIE_ECHO_CLI */ },
848          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_COOKIE_ECHO_SER */ },
849          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_COOKIE_ACK_CLI */ },
850          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_COOKIE_ACK_SER */ },
851          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_ABORT_CLI */ },
852          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_ABORT_SER */ },
853          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_CLI */ },
854          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_SER */ },
855          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_ACK_CLI */ },
856          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_ACK_SER */ },
857          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_COM_CLI */ },
858          {IP_VS_SCTP_S_CLOSED /* IP_VS_SCTP_EVE_SHUT_COM_SER */ }
859          }
860 };
861
862 /*
863  *      Timeout table[state]
864  */
865 static const int sctp_timeouts[IP_VS_SCTP_S_LAST + 1] = {
866         [IP_VS_SCTP_S_NONE]         =     2 * HZ,
867         [IP_VS_SCTP_S_INIT_CLI]     =     1 * 60 * HZ,
868         [IP_VS_SCTP_S_INIT_SER]     =     1 * 60 * HZ,
869         [IP_VS_SCTP_S_INIT_ACK_CLI] =     1 * 60 * HZ,
870         [IP_VS_SCTP_S_INIT_ACK_SER] =     1 * 60 * HZ,
871         [IP_VS_SCTP_S_ECHO_CLI]     =     1 * 60 * HZ,
872         [IP_VS_SCTP_S_ECHO_SER]     =     1 * 60 * HZ,
873         [IP_VS_SCTP_S_ESTABLISHED]  =    15 * 60 * HZ,
874         [IP_VS_SCTP_S_SHUT_CLI]     =     1 * 60 * HZ,
875         [IP_VS_SCTP_S_SHUT_SER]     =     1 * 60 * HZ,
876         [IP_VS_SCTP_S_SHUT_ACK_CLI] =     1 * 60 * HZ,
877         [IP_VS_SCTP_S_SHUT_ACK_SER] =     1 * 60 * HZ,
878         [IP_VS_SCTP_S_CLOSED]       =    10 * HZ,
879         [IP_VS_SCTP_S_LAST]         =     2 * HZ,
880 };
881
882 static const char *sctp_state_name_table[IP_VS_SCTP_S_LAST + 1] = {
883         [IP_VS_SCTP_S_NONE]         =    "NONE",
884         [IP_VS_SCTP_S_INIT_CLI]     =    "INIT_CLI",
885         [IP_VS_SCTP_S_INIT_SER]     =    "INIT_SER",
886         [IP_VS_SCTP_S_INIT_ACK_CLI] =    "INIT_ACK_CLI",
887         [IP_VS_SCTP_S_INIT_ACK_SER] =    "INIT_ACK_SER",
888         [IP_VS_SCTP_S_ECHO_CLI]     =    "COOKIE_ECHO_CLI",
889         [IP_VS_SCTP_S_ECHO_SER]     =    "COOKIE_ECHO_SER",
890         [IP_VS_SCTP_S_ESTABLISHED]  =    "ESTABISHED",
891         [IP_VS_SCTP_S_SHUT_CLI]     =    "SHUTDOWN_CLI",
892         [IP_VS_SCTP_S_SHUT_SER]     =    "SHUTDOWN_SER",
893         [IP_VS_SCTP_S_SHUT_ACK_CLI] =    "SHUTDOWN_ACK_CLI",
894         [IP_VS_SCTP_S_SHUT_ACK_SER] =    "SHUTDOWN_ACK_SER",
895         [IP_VS_SCTP_S_CLOSED]       =    "CLOSED",
896         [IP_VS_SCTP_S_LAST]         =    "BUG!"
897 };
898
899
900 static const char *sctp_state_name(int state)
901 {
902         if (state >= IP_VS_SCTP_S_LAST)
903                 return "ERR!";
904         if (sctp_state_name_table[state])
905                 return sctp_state_name_table[state];
906         return "?";
907 }
908
909 static inline void
910 set_sctp_state(struct ip_vs_proto_data *pd, struct ip_vs_conn *cp,
911                 int direction, const struct sk_buff *skb)
912 {
913         sctp_chunkhdr_t _sctpch, *sch;
914         unsigned char chunk_type;
915         int event, next_state;
916         int ihl;
917
918 #ifdef CONFIG_IP_VS_IPV6
919         ihl = cp->af == AF_INET ? ip_hdrlen(skb) : sizeof(struct ipv6hdr);
920 #else
921         ihl = ip_hdrlen(skb);
922 #endif
923
924         sch = skb_header_pointer(skb, ihl + sizeof(sctp_sctphdr_t),
925                                 sizeof(_sctpch), &_sctpch);
926         if (sch == NULL)
927                 return;
928
929         chunk_type = sch->type;
930         /*
931          * Section 3: Multiple chunks can be bundled into one SCTP packet
932          * up to the MTU size, except for the INIT, INIT ACK, and
933          * SHUTDOWN COMPLETE chunks. These chunks MUST NOT be bundled with
934          * any other chunk in a packet.
935          *
936          * Section 3.3.7: DATA chunks MUST NOT be bundled with ABORT. Control
937          * chunks (except for INIT, INIT ACK, and SHUTDOWN COMPLETE) MAY be
938          * bundled with an ABORT, but they MUST be placed before the ABORT
939          * in the SCTP packet or they will be ignored by the receiver.
940          */
941         if ((sch->type == SCTP_CID_COOKIE_ECHO) ||
942             (sch->type == SCTP_CID_COOKIE_ACK)) {
943                 sch = skb_header_pointer(skb, (ihl + sizeof(sctp_sctphdr_t) +
944                                 sch->length), sizeof(_sctpch), &_sctpch);
945                 if (sch) {
946                         if (sch->type == SCTP_CID_ABORT)
947                                 chunk_type = sch->type;
948                 }
949         }
950
951         event = sctp_events[chunk_type];
952
953         /*
954          *  If the direction is IP_VS_DIR_OUTPUT, this event is from server
955          */
956         if (direction == IP_VS_DIR_OUTPUT)
957                 event++;
958         /*
959          * get next state
960          */
961         next_state = sctp_states_table[cp->state][event].next_state;
962
963         if (next_state != cp->state) {
964                 struct ip_vs_dest *dest = cp->dest;
965
966                 IP_VS_DBG_BUF(8, "%s %s  %s:%d->"
967                                 "%s:%d state: %s->%s conn->refcnt:%d\n",
968                                 pd->pp->name,
969                                 ((direction == IP_VS_DIR_OUTPUT) ?
970                                  "output " : "input "),
971                                 IP_VS_DBG_ADDR(cp->af, &cp->daddr),
972                                 ntohs(cp->dport),
973                                 IP_VS_DBG_ADDR(cp->af, &cp->caddr),
974                                 ntohs(cp->cport),
975                                 sctp_state_name(cp->state),
976                                 sctp_state_name(next_state),
977                                 atomic_read(&cp->refcnt));
978                 if (dest) {
979                         if (!(cp->flags & IP_VS_CONN_F_INACTIVE) &&
980                                 (next_state != IP_VS_SCTP_S_ESTABLISHED)) {
981                                 atomic_dec(&dest->activeconns);
982                                 atomic_inc(&dest->inactconns);
983                                 cp->flags |= IP_VS_CONN_F_INACTIVE;
984                         } else if ((cp->flags & IP_VS_CONN_F_INACTIVE) &&
985                                    (next_state == IP_VS_SCTP_S_ESTABLISHED)) {
986                                 atomic_inc(&dest->activeconns);
987                                 atomic_dec(&dest->inactconns);
988                                 cp->flags &= ~IP_VS_CONN_F_INACTIVE;
989                         }
990                 }
991         }
992         if (likely(pd))
993                 cp->timeout = pd->timeout_table[cp->state = next_state];
994         else    /* What to do ? */
995                 cp->timeout = sctp_timeouts[cp->state = next_state];
996 }
997
998 static void
999 sctp_state_transition(struct ip_vs_conn *cp, int direction,
1000                 const struct sk_buff *skb, struct ip_vs_proto_data *pd)
1001 {
1002         spin_lock(&cp->lock);
1003         set_sctp_state(pd, cp, direction, skb);
1004         spin_unlock(&cp->lock);
1005 }
1006
1007 static inline __u16 sctp_app_hashkey(__be16 port)
1008 {
1009         return (((__force u16)port >> SCTP_APP_TAB_BITS) ^ (__force u16)port)
1010                 & SCTP_APP_TAB_MASK;
1011 }
1012
1013 static int sctp_register_app(struct net *net, struct ip_vs_app *inc)
1014 {
1015         struct ip_vs_app *i;
1016         __u16 hash;
1017         __be16 port = inc->port;
1018         int ret = 0;
1019         struct netns_ipvs *ipvs = net_ipvs(net);
1020         struct ip_vs_proto_data *pd = ip_vs_proto_data_get(net, IPPROTO_SCTP);
1021
1022         hash = sctp_app_hashkey(port);
1023
1024         spin_lock_bh(&ipvs->sctp_app_lock);
1025         list_for_each_entry(i, &ipvs->sctp_apps[hash], p_list) {
1026                 if (i->port == port) {
1027                         ret = -EEXIST;
1028                         goto out;
1029                 }
1030         }
1031         list_add(&inc->p_list, &ipvs->sctp_apps[hash]);
1032         atomic_inc(&pd->appcnt);
1033 out:
1034         spin_unlock_bh(&ipvs->sctp_app_lock);
1035
1036         return ret;
1037 }
1038
1039 static void sctp_unregister_app(struct net *net, struct ip_vs_app *inc)
1040 {
1041         struct netns_ipvs *ipvs = net_ipvs(net);
1042         struct ip_vs_proto_data *pd = ip_vs_proto_data_get(net, IPPROTO_SCTP);
1043
1044         spin_lock_bh(&ipvs->sctp_app_lock);
1045         atomic_dec(&pd->appcnt);
1046         list_del(&inc->p_list);
1047         spin_unlock_bh(&ipvs->sctp_app_lock);
1048 }
1049
1050 static int sctp_app_conn_bind(struct ip_vs_conn *cp)
1051 {
1052         struct netns_ipvs *ipvs = net_ipvs(ip_vs_conn_net(cp));
1053         int hash;
1054         struct ip_vs_app *inc;
1055         int result = 0;
1056
1057         /* Default binding: bind app only for NAT */
1058         if (IP_VS_FWD_METHOD(cp) != IP_VS_CONN_F_MASQ)
1059                 return 0;
1060         /* Lookup application incarnations and bind the right one */
1061         hash = sctp_app_hashkey(cp->vport);
1062
1063         spin_lock(&ipvs->sctp_app_lock);
1064         list_for_each_entry(inc, &ipvs->sctp_apps[hash], p_list) {
1065                 if (inc->port == cp->vport) {
1066                         if (unlikely(!ip_vs_app_inc_get(inc)))
1067                                 break;
1068                         spin_unlock(&ipvs->sctp_app_lock);
1069
1070                         IP_VS_DBG_BUF(9, "%s: Binding conn %s:%u->"
1071                                         "%s:%u to app %s on port %u\n",
1072                                         __func__,
1073                                         IP_VS_DBG_ADDR(cp->af, &cp->caddr),
1074                                         ntohs(cp->cport),
1075                                         IP_VS_DBG_ADDR(cp->af, &cp->vaddr),
1076                                         ntohs(cp->vport),
1077                                         inc->name, ntohs(inc->port));
1078                         cp->app = inc;
1079                         if (inc->init_conn)
1080                                 result = inc->init_conn(inc, cp);
1081                         goto out;
1082                 }
1083         }
1084         spin_unlock(&ipvs->sctp_app_lock);
1085 out:
1086         return result;
1087 }
1088
1089 /* ---------------------------------------------
1090  *   timeouts is netns related now.
1091  * ---------------------------------------------
1092  */
1093 static void __ip_vs_sctp_init(struct net *net, struct ip_vs_proto_data *pd)
1094 {
1095         struct netns_ipvs *ipvs = net_ipvs(net);
1096
1097         ip_vs_init_hash_table(ipvs->sctp_apps, SCTP_APP_TAB_SIZE);
1098         spin_lock_init(&ipvs->sctp_app_lock);
1099         pd->timeout_table = ip_vs_create_timeout_table((int *)sctp_timeouts,
1100                                                         sizeof(sctp_timeouts));
1101 }
1102
1103 static void __ip_vs_sctp_exit(struct net *net, struct ip_vs_proto_data *pd)
1104 {
1105         kfree(pd->timeout_table);
1106 }
1107
1108 struct ip_vs_protocol ip_vs_protocol_sctp = {
1109         .name           = "SCTP",
1110         .protocol       = IPPROTO_SCTP,
1111         .num_states     = IP_VS_SCTP_S_LAST,
1112         .dont_defrag    = 0,
1113         .init           = NULL,
1114         .exit           = NULL,
1115         .init_netns     = __ip_vs_sctp_init,
1116         .exit_netns     = __ip_vs_sctp_exit,
1117         .register_app   = sctp_register_app,
1118         .unregister_app = sctp_unregister_app,
1119         .conn_schedule  = sctp_conn_schedule,
1120         .conn_in_get    = ip_vs_conn_in_get_proto,
1121         .conn_out_get   = ip_vs_conn_out_get_proto,
1122         .snat_handler   = sctp_snat_handler,
1123         .dnat_handler   = sctp_dnat_handler,
1124         .csum_check     = sctp_csum_check,
1125         .state_name     = sctp_state_name,
1126         .state_transition = sctp_state_transition,
1127         .app_conn_bind  = sctp_app_conn_bind,
1128         .debug_packet   = ip_vs_tcpudp_debug_packet,
1129         .timeout_change = NULL,
1130 };