1 #include <linux/kernel.h>
6 #include <linux/netfilter.h>
7 #include <linux/netfilter_ipv4.h>
21 ip_vs_fill_iphdr(af, skb_network_header(skb), &iph);
23 sh = skb_header_pointer(skb, iph.
len,
sizeof(_sctph), &_sctph);
28 sizeof(_schunkh), &_schunkh);
34 &iph.daddr, sh->
dest))) {
37 if (ip_vs_todrop(net_ipvs(net))) {
42 ip_vs_service_put(svc);
51 if (!*cpp && ignored <= 0) {
55 ip_vs_service_put(svc);
60 ip_vs_service_put(svc);
67 sctp_snat_handler(
struct sk_buff *skb,
71 unsigned int sctphoff;
75 #ifdef CONFIG_IP_VS_IPV6
77 sctphoff =
sizeof(
struct ipv6hdr);
80 sctphoff = ip_hdrlen(skb);
96 sctph = (
void *) skb_network_header(skb) + sctphoff;
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),
104 crc32 = sctp_end_cksum(crc32);
115 unsigned int sctphoff;
119 #ifdef CONFIG_IP_VS_IPV6
121 sctphoff =
sizeof(
struct ipv6hdr);
124 sctphoff = ip_hdrlen(skb);
132 if (pp->csum_check && !pp->csum_check(cp->af, skb, pp))
140 sctph = (
void *) skb_network_header(skb) + sctphoff;
141 sctph->
dest = cp->dport;
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),
148 crc32 = sctp_end_cksum(crc32);
157 unsigned int sctphoff;
164 #ifdef CONFIG_IP_VS_IPV6
166 sctphoff =
sizeof(
struct ipv6hdr);
169 sctphoff = ip_hdrlen(skb);
171 sh = skb_header_pointer(skb, sctphoff,
sizeof(_sctph), &_sctph);
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);
182 val = sctp_end_cksum(tmp);
187 "Failed checksum for");
900 static const char *sctp_state_name(
int state)
904 if (sctp_state_name_table[state])
905 return sctp_state_name_table[
state];
914 unsigned char chunk_type;
918 #ifdef CONFIG_IP_VS_IPV6
921 ihl = ip_hdrlen(skb);
925 sizeof(_sctpch), &_sctpch);
929 chunk_type = sch->
type;
944 sch->
length),
sizeof(_sctpch), &_sctpch);
947 chunk_type = sch->
type;
951 event = sctp_events[chunk_type];
963 if (next_state != cp->
state) {
967 "%s:%d state: %s->%s conn->refcnt:%d\n",
970 "output " :
"input "),
971 IP_VS_DBG_ADDR(cp->
af, &cp->
daddr),
973 IP_VS_DBG_ADDR(cp->
af, &cp->
caddr),
975 sctp_state_name(cp->
state),
976 sctp_state_name(next_state),
999 sctp_state_transition(
struct ip_vs_conn *cp,
int direction,
1002 spin_lock(&cp->
lock);
1003 set_sctp_state(pd, cp, direction, skb);
1004 spin_unlock(&cp->
lock);
1010 & SCTP_APP_TAB_MASK;
1013 static int sctp_register_app(
struct net *net,
struct ip_vs_app *
inc)
1022 hash = sctp_app_hashkey(port);
1024 spin_lock_bh(&ipvs->sctp_app_lock);
1026 if (i->
port == port) {
1031 list_add(&inc->
p_list, &ipvs->sctp_apps[hash]);
1034 spin_unlock_bh(&ipvs->sctp_app_lock);
1039 static void sctp_unregister_app(
struct net *net,
struct ip_vs_app *inc)
1044 spin_lock_bh(&ipvs->sctp_app_lock);
1047 spin_unlock_bh(&ipvs->sctp_app_lock);
1050 static int sctp_app_conn_bind(
struct ip_vs_conn *cp)
1052 struct netns_ipvs *ipvs = net_ipvs(ip_vs_conn_net(cp));
1061 hash = sctp_app_hashkey(cp->
vport);
1063 spin_lock(&ipvs->sctp_app_lock);
1068 spin_unlock(&ipvs->sctp_app_lock);
1071 "%s:%u to app %s on port %u\n",
1073 IP_VS_DBG_ADDR(cp->
af, &cp->
caddr),
1075 IP_VS_DBG_ADDR(cp->
af, &cp->
vaddr),
1084 spin_unlock(&ipvs->sctp_app_lock);
1100 sizeof(sctp_timeouts));
1106 static void __ip_vs_sctp_exit(
struct net *net,
struct ip_vs_proto_data *pd)
1118 .init_netns = __ip_vs_sctp_init,
1119 .exit_netns = __ip_vs_sctp_exit,
1120 .register_app = sctp_register_app,
1121 .unregister_app = sctp_unregister_app,
1122 .conn_schedule = sctp_conn_schedule,
1125 .snat_handler = sctp_snat_handler,
1126 .dnat_handler = sctp_dnat_handler,
1127 .csum_check = sctp_csum_check,
1128 .state_name = sctp_state_name,
1129 .state_transition = sctp_state_transition,
1130 .app_conn_bind = sctp_app_conn_bind,
1132 .timeout_change =
NULL,