IPVS: SCTP Tranport Load Balancing Support to IPVS
Subsystems (4)
PATCH 1/1 IPVS: SCTP Tranport Load Balancing Support to IPVS
This patch adds SCTP packet load balancing support to IPVS. This patch is written against linux-2.6.32.3 kernel. This has been written based on the SCTP FSM desribed in the RFC 4960. All the posibilities of chunks have been taken care.
Once the IPVS receives an SCTP packet with INIT chunk we will create a connection object and chooses a real and forward the packet based on the forwarding method. After creating the connection we will drive the FSM based on the chunks(in this code they are called as events). The return packet from the server will be an INIT ACK chunck, then we will move the FSM state to IP_VS_S_INIT_ACK_SER. Like this all the chunks have next states.
As all the packets are destined to the virtual server (VIP) we haven't handled multihomed endpoints.
include/net/ip_vs.h +21 -1
@@ -220,6 +220,26 @@ enum { };/* +* SCTP State Values +*/ +enum ip_vs_sctp_states { +IP_VS_SCTP_S_NONE , +IP_VS_SCTP_S_INIT_CLI , +IP_VS_SCTP_S_INIT_SER , +IP_VS_SCTP_S_INIT_ACK_CLI , +IP_VS_SCTP_S_INIT_ACK_SER , +IP_VS_SCTP_S_ECHO_CLI , +IP_VS_SCTP_S_ECHO_SER , +IP_VS_SCTP_S_ESTABLISHED , +IP_VS_SCTP_S_SHUT_CLI , +IP_VS_SCTP_S_SHUT_SER , +IP_VS_SCTP_S_SHUT_ACK_CLI , +IP_VS_SCTP_S_SHUT_ACK_SER , +IP_VS_SCTP_S_CLOSED , +IP_VS_SCTP_S_LAST +}; + +/* * Delta sequence info structure * Each ip_vs_conn has 2 (output AND input seq. changes). * Only used in the VS/NAT.
@@ -749,7 +769,7 @@ extern struct ip_vs_protocol ip_vs_protoextern struct ip_vs_protocol ip_vs_protocol_icmp;extern struct ip_vs_protocol ip_vs_protocol_esp;extern struct ip_vs_protocol ip_vs_protocol_ah; - +extern struct ip_vs_protocol ip_vs_protocol_sctp;/* * Registering/unregistering scheduler functions
net/netfilter/ipvs/ip_vs_core.c +57 -13
141 lines not on this page · raw message
net/netfilter/ipvs/ip_vs_ctl.c +3 -2
@@ -2128,8 +2128,9 @@ do_ip_vs_set_ctl(struct sock *sk, int cm } } -/* Check for valid protocol: TCP or UDP, even for fwmark!=0 */ -if (usvc.protocol !=IPPROTO_TCP && usvc.protocol !=IPPROTO_UDP ) { +/* Check for valid protocol: TCP or UDP or SCTP, even for fwmark!=0 */ +if (usvc.protocol !=IPPROTO_TCP && usvc.protocol !=IPPROTO_UDP && + usvc.protocol !=IPPROTO_SCTP ) {pr_err ("set_ctl: invalid protocol: %d %pI4:%d %s\n" , usvc.protocol, &usvc.addr.ip,ntohs (usvc.port), usvc.sched_name);
net/netfilter/ipvs/ip_vs_proto.c +3 -0
@@ -257,6 +257,9 @@ int __init ip_vs_protocol_init(void)#ifdef CONFIG_IP_VS_PROTO_UDP REGISTER_PROTOCOL (&ip_vs_protocol_udp);#endif +#ifdef CONFIG_IP_VS_PROTO_SCTP +REGISTER_PROTOCOL (&ip_vs_protocol_sctp); +#endif #ifdef CONFIG_IP_VS_PROTO_AH REGISTER_PROTOCOL (&ip_vs_protocol_ah);#endif
net/netfilter/ipvs/ip_vs_proto_sctp.c +1190 -0
1,190 lines not on this page · raw message
net/netfilter/ipvs/ip_vs_sync.c +14 -0
@@ -400,6 +400,11 @@ static void ip_vs_process_message(const flags |=IP_VS_CONN_F_INACTIVE ; else flags &= ~IP_VS_CONN_F_INACTIVE; + }else if (s->protocol ==IPPROTO_SCTP ) { +if (state !=IP_VS_SCTP_S_ESTABLISHED ) + flags |=IP_VS_CONN_F_INACTIVE ; +else + flags &= ~IP_VS_CONN_F_INACTIVE ; } cp = ip_vs_conn_new(AF_INET, s->protocol, (union nf_inet_addr *)&s->caddr,
@@ -434,6 +439,15 @@ static void ip_vs_process_message(constatomic_dec (&dest->inactconns); cp->flags &= ~IP_VS_CONN_F_INACTIVE ; } + }else if ((cp->dest) && (cp->protocol ==IPPROTO_SCTP ) && + (cp->state != state)) { + dest = cp->dest; +if (!(cp->flags &IP_VS_CONN_F_INACTIVE ) && + (state !=IP_VS_SCTP_S_ESTABLISHED )) { +atomic_dec (&dest->activeconns); +atomic_inc (&dest->inactconns); + cp->flags &= ~IP_VS_CONN_F_INACTIVE ; + } }if (opt)
net/netfilter/ipvs/Kconfig +6 -0
@@ -100,6 +100,12 @@ config IP_VS_PROTO_AH This option enables support for load balancing AH (Authentication Header) transport protocol. Say Y if unsure. +config IP_VS_PROTO_SCTP + bool "SCTP load balancing support" + ---help--- + This option enables support for load balancing SCTP transport + protocol. Say Y if unsure. + comment "IPVS scheduler" config IP_VS_RR
net/netfilter/ipvs/Makefile +1 -0
@@ -7,6 +7,7 @@ ip_vs_proto-objs-y := ip_vs_proto-objs-$(CONFIG_IP_VS_PROTO_TCP) += ip_vs_proto_tcp.o ip_vs_proto-objs-$(CONFIG_IP_VS_PROTO_UDP) += ip_vs_proto_udp.o ip_vs_proto-objs-$(CONFIG_IP_VS_PROTO_AH_ESP) += ip_vs_proto_ah_esp.o +ip_vs_proto-objs-$(CONFIG_IP_VS_PROTO_SCTP) += ip_vs_proto_sctp.o ip_vs-objs := ip_vs_conn.o ip_vs_core.o ip_vs_ctl.o ip_vs_sched.o \ ip_vs_xmit.o ip_vs_app.o ip_vs_sync.o \
Simon Horman
maintainerQuoted 9 lines · Mohan Reddy
This patch adds SCTP packet load balancing support to IPVS. This patch is written against linux-2.6.32.3 kernel. This has been written based on the SCTP FSM desribed in the RFC 4960. All the posibilities of chunks have been taken care.
Once the IPVS receives an SCTP packet with INIT chunk we will create a connection object and chooses a real and forward the packet based on the forwarding method. After creating the connection we will drive the FSM based on the chunks(in this code they are called as events). The return packet from the server will be an INIT ACK chunck, then we will move the FSM state to
IP_VS_S_INIT_ACK_SER. Like this all the chunks have next states.
Quoted 8 lines
As all the packets are destined to the virtual server (VIP) we haven't handled multihomed endpoints.
Signed-off-by Venkata Mohan Reddy Koppula <[email protected]>
Hi,
I haven't had time to review your patch properly yet. But I have two minor comments.
Firstly, could you please base your work on Patrick McHardy's nf-next-2.6 tree or at least Dave Miller's the net-next-2.6 tree. At this stage it just looks like you'll need to re-diff the patch.
[snip]
net/netfilter/ipvs/Kconfig config IP_VS_PROTO_AH · line 104
Quoted 9 lines
diff -Npaur linux-2.6.32.3/net/netfilter/ipvs/Kconfig linux-2.6.32.3_new/net/netfilter/ipvs/Kconfig
net/netfilter/ipvs/Kconfig +2
-0@@ -100,6 +100,12 @@ config IP_VS_PROTO_AH This option enables support for load balancing AH (Authentication Header) transport protocol. Say Y if unsure. +config IP_VS_PROTO_SCTP + bool "SCTP load balancing support"
You need
select CRC32C
here.
Quoted 7 lines
net/netfilter/ipvs/Kconfig +4
-0+ ---help--- + This option enables support for load balancing SCTP transport + protocol. Say Y if unsure. + comment "IPVS scheduler" config IP_VS_RR
[snip]
Quoted 52 lines · Simon Horman
Quoted 9 lines · Mohan Reddy
This patch adds SCTP packet load balancing support to IPVS. This patch is written against linux-2.6.32.3 kernel. This has been written based on the SCTP FSM desribed in the RFC 4960. All the posibilities of chunks have been taken care.
Once the IPVS receives an SCTP packet with INIT chunk we will create a connection object and chooses a real and forward the packet based on the forwarding method. After creating the connection we will drive the FSM based on the chunks(in this code they are called as events). The return packet from the server will be an INIT ACK chunck, then we will move the FSM state to
IP_VS_S_INIT_ACK_SER. Like this all the chunks have next states.Quoted 8 lines
As all the packets are destined to the virtual server (VIP) we haven't handled multihomed endpoints.
Signed-off-by Venkata Mohan Reddy Koppula <[email protected]>Hi,
I haven't had time to review your patch properly yet. But I have two minor comments.
Firstly, could you please base your work on Patrick McHardy's nf-next-2.6 tree or at least Dave Miller's the net-next-2.6 tree. At this stage it just looks like you'll need to re-diff the patch.
[snip]
net/netfilter/ipvs/Kconfig config IP_VS_PROTO_AH · line 104
Quoted 9 lines
diff -Npaur linux-2.6.32.3/net/netfilter/ipvs/Kconfig linux-2.6.32.3_new/net/netfilter/ipvs/Kconfig
net/netfilter/ipvs/Kconfig +2
-0@@ -100,6 +100,12 @@ config IP_VS_PROTO_AH This option enables support for load balancing AH (Authentication Header) transport protocol. Say Y if unsure. +config IP_VS_PROTO_SCTP + bool "SCTP load balancing support"You need
select CRC32C
here.
Quoted 6 lines
net/netfilter/ipvs/Kconfig +4
-0+ ---help--- + This option enables support for load balancing SCTP transport + protocol. Say Y if unsure. + comment "IPVS scheduler"
Quoted 3 lines
Quoted 1 line
net/netfilter/ipvs/Kconfig +0
-0config IP_VS_RR[snip]
As suggested by Simon I have taken diffs against nf-next.2.6 tree and resending the patch. I built the kernel with nf-next.2.6 tree and tested.
Thanks,
Mohan Reddy
include/net/ip_vs.h +21 -1
@@ -225,6 +225,26 @@ enum { };/* +* SCTP State Values +*/ +enum ip_vs_sctp_states { +IP_VS_SCTP_S_NONE , +IP_VS_SCTP_S_INIT_CLI , +IP_VS_SCTP_S_INIT_SER , +IP_VS_SCTP_S_INIT_ACK_CLI , +IP_VS_SCTP_S_INIT_ACK_SER , +IP_VS_SCTP_S_ECHO_CLI , +IP_VS_SCTP_S_ECHO_SER , +IP_VS_SCTP_S_ESTABLISHED , +IP_VS_SCTP_S_SHUT_CLI , +IP_VS_SCTP_S_SHUT_SER , +IP_VS_SCTP_S_SHUT_ACK_CLI , +IP_VS_SCTP_S_SHUT_ACK_SER , +IP_VS_SCTP_S_CLOSED , +IP_VS_SCTP_S_LAST +}; + +/* * Delta sequence info structure * Each ip_vs_conn has 2 (output AND input seq. changes). * Only used in the VS/NAT.
@@ -741,7 +761,7 @@ extern struct ip_vs_protocol ip_vs_protocol_udp;extern struct ip_vs_protocol ip_vs_protocol_icmp;extern struct ip_vs_protocol ip_vs_protocol_esp;extern struct ip_vs_protocol ip_vs_protocol_ah; - +extern struct ip_vs_protocol ip_vs_protocol_sctp;/* * Registering/unregistering scheduler functions
net/netfilter/ipvs/Kconfig +7 -0
@@ -104,6 +104,13 @@ config IP_VS_PROTO_AH This option enables support for load balancing AH (Authentication Header) transport protocol. Say Y if unsure. +config IP_VS_PROTO_SCTP + bool "SCTP load balancing support" + select LIBCRC32C + ---help--- + This option enables support for load balancing SCTP transport + protocol. Say Y if unsure. + comment "IPVS scheduler" config IP_VS_RR
net/netfilter/ipvs/Makefile +1 -0
@@ -7,6 +7,7 @@ ip_vs_proto-objs-y := ip_vs_proto-objs-$(CONFIG_IP_VS_PROTO_TCP) += ip_vs_proto_tcp.o ip_vs_proto-objs-$(CONFIG_IP_VS_PROTO_UDP) += ip_vs_proto_udp.o ip_vs_proto-objs-$(CONFIG_IP_VS_PROTO_AH_ESP) += ip_vs_proto_ah_esp.o +ip_vs_proto-objs-$(CONFIG_IP_VS_PROTO_SCTP) += ip_vs_proto_sctp.o ip_vs-objs := ip_vs_conn.o ip_vs_core.o ip_vs_ctl.o ip_vs_sched.o \ ip_vs_xmit.o ip_vs_app.o ip_vs_sync.o \
net/netfilter/ipvs/ip_vs_core.c +57 -13
141 lines not on this page · raw message
net/netfilter/ipvs/ip_vs_ctl.c +3 -2
@@ -2128,8 +2128,9 @@ do_ip_vs_set_ctl(struct sock *sk, int cmd, void __user *user, unsigned int len) } } -/* Check for valid protocol: TCP or UDP, even for fwmark!=0 */ -if (usvc.protocol !=IPPROTO_TCP && usvc.protocol !=IPPROTO_UDP ) { +/* Check for valid protocol: TCP or UDP or SCTP, even for fwmark!=0 */ +if (usvc.protocol !=IPPROTO_TCP && usvc.protocol !=IPPROTO_UDP && + usvc.protocol !=IPPROTO_SCTP ) {pr_err ("set_ctl: invalid protocol: %d %pI4:%d %s\n" , usvc.protocol, &usvc.addr.ip,ntohs (usvc.port), usvc.sched_name);
net/netfilter/ipvs/ip_vs_proto.c +3 -0
@@ -257,6 +257,9 @@ int __init ip_vs_protocol_init(void)#ifdef CONFIG_IP_VS_PROTO_UDP REGISTER_PROTOCOL (&ip_vs_protocol_udp);#endif +#ifdef CONFIG_IP_VS_PROTO_SCTP +REGISTER_PROTOCOL (&ip_vs_protocol_sctp); +#endif #ifdef CONFIG_IP_VS_PROTO_AH REGISTER_PROTOCOL (&ip_vs_protocol_ah);#endif
net/netfilter/ipvs/ip_vs_proto_sctp.c new file +1190 -0
1,190 lines not on this page · raw message
net/netfilter/ipvs/ip_vs_sync.c +14 -0
@@ -400,6 +400,11 @@ static void ip_vs_process_message(const char *buffer, const size_t buflen) flags |=IP_VS_CONN_F_INACTIVE ; else flags &= ~IP_VS_CONN_F_INACTIVE; + }else if (s->protocol ==IPPROTO_SCTP ) { +if (state !=IP_VS_SCTP_S_ESTABLISHED ) + flags |=IP_VS_CONN_F_INACTIVE ; +else + flags &= ~IP_VS_CONN_F_INACTIVE ; } cp = ip_vs_conn_new(AF_INET, s->protocol, (union nf_inet_addr *)&s->caddr,
@@ -434,6 +439,15 @@ static void ip_vs_process_message(const char *buffer, const size_t buflen)atomic_dec (&dest->inactconns); cp->flags &= ~IP_VS_CONN_F_INACTIVE ; } + }else if ((cp->dest) && (cp->protocol ==IPPROTO_SCTP ) && + (cp->state != state)) { + dest = cp->dest; +if (!(cp->flags &IP_VS_CONN_F_INACTIVE ) && + (state !=IP_VS_SCTP_S_ESTABLISHED )) { +atomic_dec (&dest->activeconns); +atomic_inc (&dest->inactconns); + cp->flags &= ~IP_VS_CONN_F_INACTIVE ; + } }if (opt)