LVS
lvs-users
Google
 
Web LinuxVirtualServer.org

Aw: [lvs-users] [PATCH] ipvsadm: add SCTP support

To: lvs-users@xxxxxxxxxxxxxxxxxxxxxx, formorer@xxxxxxxxxx, logan@xxxxxxxxxx, mt@xxxxxxx
Subject: Aw: [lvs-users] [PATCH] ipvsadm: add SCTP support
Cc: "Jesper Dangaard Brouer" <brouer@xxxxxxxxxx>, lvs-devel@xxxxxxxxxxxxxxx, lvs-users@xxxxxxxxxxxxxxxxxxxxxx, "Simon Horman" <horms@xxxxxxxxxxxx>, overcastsky.zhao@xxxxxxxxx, formorer@xxxxxxxxxx
From: support@xxxxxxxxxx
Date: Thu, 5 Feb 2015 21:55:12 +0100
Dear Julian & Simon ,

Please Include this "ipvsadm: add SCTP support" patch and any outstaning 
patches 
at the  https://git.kernel.org/cgit/utils/kernel/ipvsadm/ipvsadm.git .

Please Simon ;
I´ts time for new release of ipvsadm .. 2 years passed allready with an few 
important patches added to ipvsadm 1.27.

I can´t understand why Debian , Suse , FC / Redhat  and it´s clones 
Distrubtions still publish the buggy ipvsadm 1.26 .

Today faced again issue on very Highly traffik PRODUCTIVE shop site with Debian 
7.8 with IPVS, keepalived and outdated ipvsadm
 due that  - caused an Customer emergency Firecall ..

Please please dear Distribution Maintainers -  UPDATE from the Offial  ipvsadm 
GIT repro .
Thanks.


--
Mit freundlichen Grüßen / Best Regards

Horst Venzke ; PGP NET : 1024G/082F2E6D ;  http://www.remsnet.de

Legal Notice: This transmittal and/or attachments may be privileged or 
confidential. It is intended solely for the addressee named above. Any review, 
dissemination, or copying is strictly prohibited. If you received this 
transmittal in error, please notify us immediately by reply and immediately 
delete this message and all its attachments. Thank you.


> Gesendet: Samstag, 31. Januar 2015 um 09:41 Uhr
> Von: "Julian Anastasov" <ja@xxxxxx>
> An: "Jesper Dangaard Brouer" <brouer@xxxxxxxxxx>
> Cc: lvs-devel@xxxxxxxxxxxxxxx, lvs-users@xxxxxxxxxxxxxxxxxxxxxx, "Simon 
> Horman" <horms@xxxxxxxxxxxx>, overcastsky.zhao@xxxxxxxxx
> Betreff: [lvs-users] [PATCH] ipvsadm: add SCTP support
>
> SCTP support in kernel is from 2.6.34 but ipvsadm
> restricts users to fwmark-based virtual services.
> 
> * Add option --sctp-service to specify the virtual service
> 
> * Update man page to use virtual-service and the new option
> 
> Signed-off-by: Julian Anastasov <ja@xxxxxx>
> ---
>  ipvsadm.8 |  30 +++++++++++--------
>  ipvsadm.c | 100 
> +++++++++++++++++++++++++++++++++++++++++++++++++-------------
>  2 files changed, 98 insertions(+), 32 deletions(-)
> 
> diff --git a/ipvsadm.8 b/ipvsadm.8
> index 9a9e9b3..3df3b83 100644
> --- a/ipvsadm.8
> +++ b/ipvsadm.8
> @@ -35,11 +35,11 @@
>  .SH NAME
>  ipvsadm \- Linux Virtual Server administration
>  .SH SYNOPSIS
> -.B ipvsadm -A|E -t|u|f \fIservice-address\fP [-s \fIscheduler\fP]
> +.B ipvsadm -A|E \fIvirtual-service\fP [-s \fIscheduler\fP]
>  .ti 15
>  .B [-p [\fItimeout\fP]] [-M \fInetmask\fP] [-b \fIsched-flags\fP]
>  .br
> -.B ipvsadm -D -t|u|f \fIservice-address\fP
> +.B ipvsadm -D \fIvirtual-service\fP
>  .br
>  .B ipvsadm -C
>  .br
> @@ -47,15 +47,15 @@ ipvsadm \- Linux Virtual Server administration
>  .br
>  .B ipvsadm -S [-n]
>  .br
> -.B ipvsadm -a|e -t|u|f \fIservice-address\fP -r \fIserver-address\fP
> +.B ipvsadm -a|e \fIvirtual-service\fP -r \fIserver-address\fP
>  .ti 15
>  .B [-g|i|m] [-w \fIweight\fP] [-x \fIupper\fP] [-y \fIlower\fP]
>  .br
> -.B ipvsadm -d -t|u|f \fIservice-address\fP -r \fIserver-address\fP
> +.B ipvsadm -d \fIvirtual-service\fP -r \fIserver-address\fP
>  .br
> -.B ipvsadm -L|l [options]
> +.B ipvsadm -L|l [\fIvirtual-service\fP] [options]
>  .br
> -.B ipvsadm -Z [-t|u|f \fIservice-address\fP]
> +.B ipvsadm -Z [\fIvirtual-service\fP]
>  .br
>  .B ipvsadm --set \fItcp\fP \fItcpfin\fP \fIudp\fP
>  .br
> @@ -72,7 +72,7 @@ server table in the Linux kernel. The Linux Virtual Server 
> can be used
>  to build scalable network services based on a cluster of two or more
>  nodes. The active node of the cluster redirects service requests to a
>  collection of server hosts that will actually perform the
> -services. Supported features include two protocols (TCP and UDP),
> +services. Supported features include three protocols (TCP, UDP and SCTP),
>  three packet-forwarding methods (NAT, tunneling, and direct routing),
>  and eight load balancing algorithms (round robin, weighted round
>  robin, least-connection, weighted least-connection, locality-based
> @@ -81,11 +81,11 @@ destination-hashing, and source-hashing).
>  .PP
>  The command has two basic formats for execution:
>  .TP
> -.B ipvsadm \fICOMMAND\fP [\fIprotocol\fP] \fIservice-address\fP
> +.B ipvsadm \fICOMMAND\fP \fIvirtual-service\fP
>  .ti 15
>  .B [\fIscheduling-method\fP] [\fIpersistence options\fP]
>  .TP
> -.B ipvsadm \fIcommand\fP [\fIprotocol\fP] \fIservice-address\fP
> +.B ipvsadm \fIcommand\fP \fIvirtual-service\fP
>  .ti 15
>  .B \fIserver-address\fP [\fIpacket-forwarding-method\fP]
>  .ti 15
> @@ -174,9 +174,8 @@ Stop the connection synchronization daemon.
>  .TP
>  \fB-h, --help\fR
>  Display a description of the command syntax.
> -.SS PARAMETERS
> -The commands above accept or require zero or more of the following
> -parameters.
> +.SS virtual-service
> +Specifies the virtual service based on protocol/addr/port or firewall mark.
>  .TP
>  .B -t, --tcp-service \fIservice-address\fP
>  Use TCP service. The \fIservice-address\fP is of the form
> @@ -191,6 +190,10 @@ wild-card port, that is connections will be accepted to 
> any port.
>  Use UDP service. See the -t|--tcp-service for the description of  the
>  \fIservice-address\fP.
>  .TP
> +.B --sctp-service \fIservice-address\fP
> +Use SCTP service. See the -t|--tcp-service for the description of the
> +\fIservice-address\fP.
> +.TP
>  .B -f, --fwmark-service \fIinteger\fP
>  Use a firewall-mark, an integer value greater than zero, to denote a
>  virtual service instead of an address, port and protocol (UDP or
> @@ -206,6 +209,9 @@ single virtual service. This is useful for both 
> simplifying
>  configuration if a large number of virtual services are required and
>  grouping persistence across what would otherwise be multiple virtual
>  services.
> +.SS PARAMETERS
> +The commands above accept or require zero or more of the following
> +parameters.
>  .TP
>  .B -s, --scheduler \fIscheduling-method\fP
>  \fIscheduling-method\fP  Algorithm for allocating TCP connections and
> diff --git a/ipvsadm.c b/ipvsadm.c
> index a33ecfa..1669634 100644
> --- a/ipvsadm.c
> +++ b/ipvsadm.c
> @@ -287,6 +287,7 @@ enum {
>       TAG_SORT,
>       TAG_NO_SORT,
>       TAG_PERSISTENCE_ENGINE,
> +     TAG_SCTP_SERVICE,
>  };
>  
>  /* various parsing helpers & parsing functions */
> @@ -359,6 +360,47 @@ int main(int argc, char **argv)
>       return result;
>  }
>  
> +static int option_to_protocol(int opt)
> +{
> +     switch (opt) {
> +     case 't':
> +             return IPPROTO_TCP;
> +     case 'u':
> +             return IPPROTO_UDP;
> +     case TAG_SCTP_SERVICE:
> +             return IPPROTO_SCTP;
> +     default:
> +             return IPPROTO_IP;
> +     }
> +}
> +
> +static char *option_from_protocol(int proto)
> +{
> +     switch (proto) {
> +     case IPPROTO_TCP:
> +             return "-t";
> +     case IPPROTO_UDP:
> +             return "-u";
> +     case IPPROTO_SCTP:
> +             return "--sctp-service";
> +     default:
> +             return NULL;
> +     }
> +}
> +
> +static char *protocol_name(int proto)
> +{
> +     switch (proto) {
> +     case IPPROTO_TCP:
> +             return "TCP";
> +     case IPPROTO_UDP:
> +             return "UDP";
> +     case IPPROTO_SCTP:
> +             return "SCTP";
> +     default:
> +             return "?";
> +     }
> +}
>  
>  static int
>  parse_options(int argc, char **argv, struct ipvs_command_entry *ce,
> @@ -391,6 +433,8 @@ parse_options(int argc, char **argv, struct 
> ipvs_command_entry *ce,
>                 NULL, NULL },
>               { "udp-service", 'u', POPT_ARG_STRING, &optarg, 'u',
>                 NULL, NULL },
> +             { "sctp-service", '\0', POPT_ARG_STRING, &optarg,
> +               TAG_SCTP_SERVICE, NULL, NULL },
>               { "fwmark-service", 'f', POPT_ARG_STRING, &optarg, 'f',
>                 NULL, NULL },
>               { "scheduler", 's', POPT_ARG_STRING, &optarg, 's', NULL, NULL },
> @@ -510,9 +554,9 @@ parse_options(int argc, char **argv, struct 
> ipvs_command_entry *ce,
>               switch (c) {
>               case 't':
>               case 'u':
> +             case TAG_SCTP_SERVICE:
>                       set_option(options, OPT_SERVICE);
> -                     ce->svc.protocol =
> -                             (c=='t' ? IPPROTO_TCP : IPPROTO_UDP);
> +                     ce->svc.protocol = option_to_protocol(c);
>                       parse = parse_service(optarg, &ce->svc);
>                       if (!(parse & SERVICE_ADDR))
>                               fail(2, "illegal virtual server "
> @@ -1128,15 +1172,15 @@ static void usage_exit(const char *program, const int 
> exit_status)
>       version(stream);
>       fprintf(stream,
>               "Usage:\n"
> -             "  %s -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] 
> [-M netmask] [--pe persistence_engine] [-b sched-flags]\n"
> -             "  %s -D -t|u|f service-address\n"
> +             "  %s -A|E virtual-service [-s scheduler] [-p [timeout]] [-M 
> netmask] [--pe persistence_engine] [-b sched-flags]\n"
> +             "  %s -D virtual-service\n"
>               "  %s -C\n"
>               "  %s -R\n"
>               "  %s -S [-n]\n"
> -             "  %s -a|e -t|u|f service-address -r server-address [options]\n"
> -             "  %s -d -t|u|f service-address -r server-address\n"
> -             "  %s -L|l [options]\n"
> -             "  %s -Z [-t|u|f service-address]\n"
> +             "  %s -a|e virtual-service -r server-address [options]\n"
> +             "  %s -d virtual-service -r server-address\n"
> +             "  %s -L|l [virtual-service] [options]\n"
> +             "  %s -Z [virtual-service]\n"
>               "  %s --set tcp tcpfin udp\n"
>               "  %s --start-daemon state [--mcast-interface interface] 
> [--syncid sid]\n"
>               "  %s --stop-daemon state\n"
> @@ -1166,10 +1210,15 @@ static void usage_exit(const char *program, const int 
> exit_status)
>               );
>  
>       fprintf(stream,
> +             "virtual-service:\n"
> +             "  --tcp-service|-t  service-address   service-address is 
> host[:port]\n"
> +             "  --udp-service|-u  service-address   service-address is 
> host[:port]\n"
> +             "  --sctp-service    service-address   service-address is 
> host[:port]\n"
> +             "  --fwmark-service|-f fwmark          fwmark is an integer 
> greater than zero\n"
> +             "\n");
> +
> +     fprintf(stream,
>               "Options:\n"
> -             "  --tcp-service  -t service-address   service-address is 
> host[:port]\n"
> -             "  --udp-service  -u service-address   service-address is 
> host[:port]\n"
> -             "  --fwmark-service  -f fwmark         fwmark is an integer 
> greater than zero\n"
>               "  --ipv6         -6                   fwmark entry uses IPv6\n"
>               "  --scheduler    -s scheduler         one of " SCHEDULERS ",\n"
>               "                                      the default scheduler is 
> %s.\n"
> @@ -1316,6 +1365,8 @@ static void print_conn(char *buf, unsigned int format)
>               proto = IPPROTO_TCP;
>       else if (strcmp(protocol, "UDP") == 0)
>               proto = IPPROTO_UDP;
> +     else if (strcmp(protocol, "SCTP") == 0)
> +             proto = IPPROTO_SCTP;
>       else
>               proto = 0;
>  
> @@ -1518,7 +1569,7 @@ static void
>  print_service_entry(ipvs_service_entry_t *se, unsigned int format)
>  {
>       struct ip_vs_get_dests *d;
> -     char svc_name[64];
> +     char svc_name[1024];
>       int i;
>  
>       if (!(d = ipvs_get_dests(se))) {
> @@ -1543,14 +1594,17 @@ print_service_entry(ipvs_service_entry_t *se, 
> unsigned int format)
>               if (!(vname = addrport_to_anyname(se->af, &se->addr, 
> ntohs(se->port),
>                                                 se->protocol, format)))
>                       fail(2, "addrport_to_anyname: %s", strerror(errno));
> -             if (format & FMT_RULE)
> -                     sprintf(svc_name, "%s %s",
> -                             se->protocol==IPPROTO_TCP?"-t":"-u",
> -                             vname);
> -             else {
> -                     sprintf(svc_name, "%s  %s",
> -                             se->protocol==IPPROTO_TCP?"TCP":"UDP",
> -                             vname);
> +             if (format & FMT_RULE) {
> +                     char *stype = option_from_protocol(se->protocol) ? :
> +                                   "--xxx-service";
> +
> +                     snprintf(svc_name, sizeof(svc_name), "%s %s",
> +                              stype, vname);
> +             } else {
> +                     char *stype = protocol_name(se->protocol);
> +
> +                     snprintf(svc_name, sizeof(svc_name), "%-4s %s",
> +                              stype, vname);
>                       if (se->af != AF_INET6)
>                               svc_name[33] = '\0';
>               }
> @@ -1806,6 +1860,9 @@ int service_to_port(const char *name, unsigned short 
> proto)
>       else if (proto == IPPROTO_UDP
>                && (service = getservbyname(name, "udp")) != NULL)
>               return ntohs((unsigned short) service->s_port);
> +     else if (proto == IPPROTO_SCTP
> +              && (service = getservbyname(name, "sctp")) != NULL)
> +             return ntohs((unsigned short) service->s_port);
>       else
>               return -1;
>  }
> @@ -1821,6 +1878,9 @@ static char * port_to_service(unsigned short port, 
> unsigned short proto)
>       else if (proto == IPPROTO_UDP &&
>                (service = getservbyport(htons(port), "udp")) != NULL)
>               return service->s_name;
> +     else if (proto == IPPROTO_SCTP &&
> +              (service = getservbyport(htons(port), "sctp")) != NULL)
> +             return service->s_name;
>       else
>               return (char *) NULL;
>  }
> -- 
> 1.9.3
> 
> 
> _______________________________________________
> Please read the documentation before posting - it's available at:
> http://www.linuxvirtualserver.org/
> 
> LinuxVirtualServer.org mailing list - lvs-users@xxxxxxxxxxxxxxxxxxxxxx
> Send requests to lvs-users-request@xxxxxxxxxxxxxxxxxxxxxx
> or go to http://lists.graemef.net/mailman/listinfo/lvs-users
>

Attachment: addressbook.vcf
Description: Vcard

<Prev in Thread] Current Thread [Next in Thread>