diff -ruN ipvsadm-1.24.orig/ipvsadm.c ipvsadm-1.24/ipvsadm.c --- ipvsadm-1.24.orig/ipvsadm.c 2004-01-10 10:39:03.000000000 +0100 +++ ipvsadm-1.24/ipvsadm.c 2005-09-21 19:16:04.000000000 +0200 @@ -182,7 +182,8 @@ #define OPT_PERSISTENTCONN 0x20000 #define OPT_SORT 0x40000 #define OPT_SYNCID 0x80000 -#define NUMBER_OF_OPT 20 +#define OPT_ONEPACKET 0x100000 +#define NUMBER_OF_OPT 21 static const char* optnames[] = { "numeric", @@ -205,6 +206,7 @@ "persistent-conn", "sort", "syncid", + "ops", }; /* @@ -388,6 +390,7 @@ {"thresholds", '\0', POPT_ARG_NONE, NULL, '9'}, {"persistent-conn", '\0', POPT_ARG_NONE, NULL, 'P'}, {"sort", '\0', POPT_ARG_NONE, NULL, '0'}, + {"ops", 'o', POPT_ARG_NONE, NULL, 'o'}, {NULL, 0, 0, NULL, 0} }; @@ -492,7 +495,7 @@ 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; @@ -590,6 +593,10 @@ set_option(options, OPT_SORT); *format |= FMT_SORT; 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)); @@ -636,7 +643,7 @@ unsigned int *options, unsigned int *format) { int c, parse; - const char *optstring = "AEDCZSRaedlLhvt:u:f:s:M:p::r:gmiw:x:y:cn"; + const char *optstring = "AEDCZSRaedlLhvt:u:f:s:M:p::r:gmiw:x:y:cno"; const struct option long_options[] = { {"add-service", 0, 0, 'A'}, {"edit-service", 0, 0, 'E'}, @@ -678,6 +685,7 @@ {"thresholds", 0, 0, '9'}, {"persistent-conn", 0, 0, 'P'}, {"sort", 0, 0, '0'}, + {"ops", 0, 0, 'o'}, {"help", 0, 0, 'h'}, {0, 0, 0, 0} }; @@ -801,7 +809,7 @@ break; case 'p': set_option(options, OPT_PERSISTENT); - ce->svc.flags = IP_VS_SVC_F_PERSISTENT; + ce->svc.flags |= IP_VS_SVC_F_PERSISTENT; if (!optarg && optind < argc && argv[optind][0] != '-' && argv[optind][0] != '!') optarg = argv[optind++]; @@ -902,6 +910,10 @@ set_option(options, OPT_SORT); *format |= FMT_SORT; break; + case 'o': + set_option(options, OPT_ONEPACKET); + ce->svc.flags |= IP_VS_SVC_F_ONEPACKET; + break; default: fail(2, "invalid option `%s'", argv[optind-1]); } @@ -960,10 +972,15 @@ 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); @@ -1328,6 +1345,7 @@ " --thresholds output of thresholds information\n" " --persistent-conn output of persistent connection info\n" " --sort sorting output of service/server entries\n" + " --ops -o one-packet scheduling\n" " --numeric -n numeric output of addresses and ports\n", DEF_SCHED); @@ -1629,6 +1647,9 @@ printf(" -M %s", inet_ntoa(mask)); } } + if (se->flags & IP_VS_SVC_F_ONEPACKET) { + printf(" ops"); + } } else if (format & FMT_STATS) { printf("%-33s", svc_name); print_largenum(se->stats.conns); @@ -1653,6 +1674,9 @@ printf(" mask %s", inet_ntoa(mask)); } } + if (se->flags & IP_VS_SVC_F_ONEPACKET) { + printf(" ops"); + } } printf("\n");