Applied, thanks!
On Mon, Jul 26, 2010 at 4:04 PM, Simon Horman <horms@xxxxxxxxxxxx> wrote:
> Allow one-packet scheduling for UDP connections. When the fwmark-based or
> normal virtual service is marked with '-o' or '--ops' options all
> connections are created only to schedule one packet. Useful to schedule UDP
> packets from same client port to different real servers. Recommended with
> RR or WRR schedulers (the connections are not visible with ipvsadm -L).
>
> The kernel side of this change has already been merged
> and should appear in 2.6.35.
>
> Based on http://www.ssi.bg/~ja/tmp/ops-ipvsadm-1.21-1.diff
> by Julian Anastasov <ja@xxxxxx>
>
> Signed-off-by: Simon Horman <horms@xxxxxxxxxxxx>
>
> Index: trunk/ipvsadm.c
> ===================================================================
> --- trunk.orig/ipvsadm.c 2010-07-25 21:01:02.000000000 +0900
> +++ trunk/ipvsadm.c 2010-07-25 21:01:04.000000000 +0900
> @@ -180,7 +180,8 @@ static const char* cmdnames[] = {
> #define OPT_NOSORT 0x040000
> #define OPT_SYNCID 0x080000
> #define OPT_EXACT 0x100000
> -#define NUMBER_OF_OPT 21
> +#define OPT_ONEPACKET 0x200000
> +#define NUMBER_OF_OPT 22
>
> static const char* optnames[] = {
> "numeric",
> @@ -204,6 +205,7 @@ static const char* optnames[] = {
> "nosort",
> "syncid",
> "exact",
> + "ops",
> };
>
> /*
> @@ -418,6 +420,7 @@ parse_options(int argc, char **argv, str
> { "sort", '\0', POPT_ARG_NONE, NULL, TAG_SORT, NULL, NULL },
> { "exact", 'X', POPT_ARG_NONE, NULL, 'X', NULL, NULL },
> { "ipv6", '6', POPT_ARG_NONE, NULL, '6', NULL, NULL },
> + { "ops", 'o', POPT_ARG_NONE, NULL, 'o', NULL, NULL },
> { NULL, 0, 0, NULL, 0, NULL, NULL }
> };
>
> @@ -520,7 +523,7 @@ parse_options(int argc, char **argv, str
> break;
> case 'p':
> set_option(options, OPT_PERSISTENT);
> - ce->svc.flags = IP_VS_SVC_F_PERSISTENT;
> + ce->svc.flags |= IP_VS_SVC_F_PERSISTENT;
> ce->svc.timeout =
> parse_timeout(optarg, 1, MAX_TIMEOUT);
> break;
> @@ -640,6 +643,10 @@ parse_options(int argc, char **argv, str
> fail(2, "-6 used before -f\n");
> }
> break;
> + case 'o':
> + set_option(options, OPT_ONEPACKET);
> + ce->svc.flags |= IP_VS_SVC_F_ONEPACKET;
> + break;
> default:
> fail(2, "invalid option `%s'",
> poptBadOption(context, POPT_BADOPTION_NOALIAS));
> @@ -725,10 +732,15 @@ static int process_options(int argc, cha
> if (ce.cmd == CMD_ADD || ce.cmd == CMD_EDIT) {
> /* Make sure that port zero service is persistent */
> if (!ce.svc.fwmark && !ce.svc.port &&
> - (ce.svc.flags != IP_VS_SVC_F_PERSISTENT))
> + !(ce.svc.flags & IP_VS_SVC_F_PERSISTENT))
> fail(2, "Zero port specified "
> "for non-persistent service");
>
> + if (ce.svc.flags & IP_VS_SVC_F_ONEPACKET &&
> + !ce.svc.fwmark && ce.svc.protocol != IPPROTO_UDP)
> + fail(2, "One-Packet Scheduling is only "
> + "for UDP virtual services");
> +
> /* Set the default scheduling algorithm if not specified */
> if (strlen(ce.svc.sched_name) == 0)
> strcpy(ce.svc.sched_name, DEF_SCHED);
> @@ -1116,6 +1128,7 @@ static void usage_exit(const char *progr
> " --persistent-conn output of persistent
> connection info\n"
> " --nosort disable sorting output
> of service/server entries\n"
> " --sort does nothing, for
> backwards compatibility\n"
> + " --ops -o one-packet
> scheduling\n"
> " --numeric -n numeric output of
> addresses and ports\n",
> DEF_SCHED);
>
> @@ -1448,6 +1461,8 @@ print_service_entry(ipvs_service_entry_t
> printf(" -M %i", se->netmask);
> }
> }
> + if (se->flags & IP_VS_SVC_F_ONEPACKET)
> + printf(" ops");
> } else if (format & FMT_STATS) {
> printf("%-33s", svc_name);
> print_largenum(se->stats.conns, format);
> @@ -1475,6 +1490,8 @@ print_service_entry(ipvs_service_entry_t
> if (se->af == AF_INET6)
> if (se->netmask != 128)
> printf(" mask %i", se->netmask);
> + if (se->flags & IP_VS_SVC_F_ONEPACKET)
> + printf(" ops");
> }
> }
> printf("\n");
> Index: trunk/libipvs/ip_vs.h
> ===================================================================
> --- trunk.orig/libipvs/ip_vs.h 2010-07-25 20:58:51.000000000 +0900
> +++ trunk/libipvs/ip_vs.h 2010-07-25 21:01:04.000000000 +0900
> @@ -28,6 +28,7 @@
> */
> #define IP_VS_SVC_F_PERSISTENT 0x0001 /* persistent port */
> #define IP_VS_SVC_F_HASHED 0x0002 /* hashed entry */
> +#define IP_VS_SVC_F_ONEPACKET 0x0004 /* one-packet scheduling */
>
> /*
> * IPVS sync daemon states
> @@ -88,6 +89,7 @@
> #define IP_VS_CONN_F_SEQ_MASK 0x0600 /* in/out sequence mask */
> #define IP_VS_CONN_F_NO_CPORT 0x0800 /* no client port set yet */
> #define IP_VS_CONN_F_TEMPLATE 0x1000 /* template, not connection */
> +#define IP_VS_CONN_F_ONE_PACKET 0x2000 /* forward only one
> packet */
>
> #define IP_VS_SCHEDNAME_MAXLEN 16
> #define IP_VS_IFNAME_MAXLEN 16
> Index: trunk/ipvsadm.8
> ===================================================================
> --- trunk.orig/ipvsadm.8 2010-07-25 21:01:08.000000000 +0900
> +++ trunk/ipvsadm.8 2010-07-25 21:04:03.000000000 +0900
> @@ -414,6 +414,12 @@ option is only relevant for the -L comma
> .TP
> .B -6, --ipv6
> Use with -f to signify fwmark rule uses IPv6 addresses.
> +.TP
> +.B -o, --ops
> +One-packet scheduling.
> +Used in conjunction with a UDP virtual service or
> +a fwmark virtual service that handles only UDP packets.
> +All connections are created such that they only schedule one packet.
> .SH EXAMPLE 1 - Simple Virtual Service
> The following commands configure a Linux Director to distribute
> incoming requests addressed to port 80 on 207.175.44.110 equally to
>
>
--
To unsubscribe from this list: send the line "unsubscribe lvs-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
|