On Sun, Sep 26, 2010 at 04:31:49PM +0200, Sven Wegener wrote: > On Sun, 26 Sep 2010, Simon Horman wrote: > > > here is an updated though as yet untested version of your patch from Julian > > to take into account recent changes. In particualr, the ip_vs_sync.c > > portion is no longer needed as only the flags in the first 16 bits are > > synced now. It applies against Patrick McHardy's nf-next-2.6 tree. > > > > You mentioned in your original post that you would work on an ipvsadm > > patch for this feature. Have you had time to do so? > > > > Also, are you in a position to test this? If not I can do so. > > Hi, > > I've tested your patch with the below addition to ipvsadm and it works > correctly. Thanks Sven, I'll push the kernel side to Patrick McHardy and assuming Wensong doesn't object, I'll push the ipvsadm side myself. > > Sven > > From: Sven Wegener <sven.wegener@xxxxxxxxxxx> > Subject: [PATCH] Show backlog connections > > Signed-off-by: Sven Wegener <sven.wegener@xxxxxxxxxxx> > --- > ipvsadm.c | 51 ++++++++++++++++++++++++++++++-------------- > libipvs/ip_vs.h | 4 +++ > libipvs/ip_vs_nl_policy.c | 1 + > libipvs/libipvs.c | 3 ++ > 4 files changed, 43 insertions(+), 16 deletions(-) > > diff --git a/ipvsadm.c b/ipvsadm.c > index 8557d21..54ae110 100644 > --- a/ipvsadm.c > +++ b/ipvsadm.c > @@ -181,7 +181,8 @@ static const char* cmdnames[] = { > #define OPT_SYNCID 0x080000 > #define OPT_EXACT 0x100000 > #define OPT_ONEPACKET 0x200000 > -#define NUMBER_OF_OPT 22 > +#define OPT_BACKLOGCONN 0x400000 > +#define NUMBER_OF_OPT 23 > > static const char* optnames[] = { > "numeric", > @@ -206,6 +207,7 @@ static const char* optnames[] = { > "syncid", > "exact", > "ops", > + "backlog-conn", > }; > > /* > @@ -218,21 +220,21 @@ static const char* optnames[] = { > */ > static const char commands_v_options[NUMBER_OF_CMD][NUMBER_OF_OPT] = > { > - /* -n -c svc -s -p -M -r fwd -w -x -y -mc tot dmn -st -rt thr -pc srt sid -ex ops */ > -/*ADD*/ {'x', 'x', '+', ' ', ' ', ' ', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', ' '}, > -/*EDIT*/ {'x', 'x', '+', ' ', ' ', ' ', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', ' '}, > -/*DEL*/ {'x', 'x', '+', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x'}, > -/*FLUSH*/ {'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x'}, > -/*LIST*/ {' ', '1', '1', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', '1', '1', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'x'}, > -/*ADDSRV*/ {'x', 'x', '+', 'x', 'x', 'x', '+', ' ', ' ', ' ', ' ', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x'}, > -/*DELSRV*/ {'x', 'x', '+', 'x', 'x', 'x', '+', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x'}, > -/*EDITSRV*/ {'x', 'x', '+', 'x', 'x', 'x', '+', ' ', ' ', ' ', ' ', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x'}, > -/*TIMEOUT*/ {'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x'}, > -/*STARTD*/ {'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', ' ', 'x', 'x', 'x', 'x', 'x', 'x', 'x', ' ', 'x', 'x'}, > -/*STOPD*/ {'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', ' ', 'x', 'x'}, > -/*RESTORE*/ {'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x'}, > -/*SAVE*/ {' ', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x'}, > -/*ZERO*/ {'x', 'x', ' ', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x'}, > + /* -n -c svc -s -p -M -r fwd -w -x -y -mc tot dmn -st -rt thr -pc srt sid -ex ops, blc */ > +/*ADD*/ {'x', 'x', '+', ' ', ' ', ' ', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', ' ', 'x'}, > +/*EDIT*/ {'x', 'x', '+', ' ', ' ', ' ', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', ' ', 'x'}, > +/*DEL*/ {'x', 'x', '+', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x'}, > +/*FLUSH*/ {'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x'}, > +/*LIST*/ {' ', '1', '1', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', '1', '1', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'x', ' '}, > +/*ADDSRV*/ {'x', 'x', '+', 'x', 'x', 'x', '+', ' ', ' ', ' ', ' ', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x'}, > +/*DELSRV*/ {'x', 'x', '+', 'x', 'x', 'x', '+', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x'}, > +/*EDITSRV*/ {'x', 'x', '+', 'x', 'x', 'x', '+', ' ', ' ', ' ', ' ', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x'}, > +/*TIMEOUT*/ {'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x'}, > +/*STARTD*/ {'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', ' ', 'x', 'x', 'x', 'x', 'x', 'x', 'x', ' ', 'x', 'x', 'x'}, > +/*STOPD*/ {'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', ' ', 'x', 'x', 'x'}, > +/*RESTORE*/ {'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x'}, > +/*SAVE*/ {' ', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x'}, > +/*ZERO*/ {'x', 'x', ' ', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x'}, > }; > > /* printing format flags */ > @@ -245,6 +247,7 @@ static const char commands_v_options[NUMBER_OF_CMD][NUMBER_OF_OPT] = > #define FMT_PERSISTENTCONN 0x0020 > #define FMT_NOSORT 0x0040 > #define FMT_EXACT 0x0080 > +#define FMT_BACKLOGCONN 0x0100 > > #define SERVICE_NONE 0x0000 > #define SERVICE_ADDR 0x0001 > @@ -282,6 +285,7 @@ enum { > TAG_PERSISTENTCONN, > TAG_SORT, > TAG_NO_SORT, > + TAG_BACKLOGCONN, > }; > > /* various parsing helpers & parsing functions */ > @@ -421,6 +425,8 @@ parse_options(int argc, char **argv, struct ipvs_command_entry *ce, > { "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 }, > + { "backlog-conn", '\0', POPT_ARG_NONE, NULL, > + TAG_BACKLOGCONN, NULL, NULL }, > { NULL, 0, 0, NULL, 0, NULL, NULL } > }; > > @@ -647,6 +653,10 @@ parse_options(int argc, char **argv, struct ipvs_command_entry *ce, > set_option(options, OPT_ONEPACKET); > ce->svc.flags |= IP_VS_SVC_F_ONEPACKET; > break; > + case TAG_BACKLOGCONN: > + set_option(options, OPT_BACKLOGCONN); > + *format |= FMT_BACKLOGCONN; > + break; > default: > fail(2, "invalid option `%s'", > poptBadOption(context, POPT_BADOPTION_NOALIAS)); > @@ -1396,6 +1406,11 @@ static void print_title(unsigned int format) > " -> RemoteAddress:Port\n", > "Prot LocalAddress:Port", > "Weight", "PersistConn", "ActiveConn", "InActConn"); > + else if (format & FMT_BACKLOGCONN) > + printf("%-33s %-9s %-11s %-10s %-10s\n" > + " -> RemoteAddress:Port\n", > + "Prot LocalAddress:Port", > + "Weight", "BacklogConn", "ActiveConn", "InActConn"); > else if (!(format & FMT_RULE)) > printf("Prot LocalAddress:Port Scheduler Flags\n" > " -> RemoteAddress:Port Forward Weight ActiveConn InActConn\n"); > @@ -1539,6 +1554,10 @@ print_service_entry(ipvs_service_entry_t *se, unsigned int format) > printf(" -> %-28s %-9u %-11u %-10u %-10u\n", dname, > e->weight, e->persistconns, > e->activeconns, e->inactconns); > + } else if (format & FMT_BACKLOGCONN) { > + printf(" -> %-28s %-9u %-11u %-10u %-10u\n", dname, > + e->weight, e->backlogconns, > + e->activeconns, e->inactconns); > } else > printf(" -> %-28s %-7s %-6d %-10u %-10u\n", > dname, fwd_name(e->conn_flags), > diff --git a/libipvs/ip_vs.h b/libipvs/ip_vs.h > index 843c51a..4c2c265 100644 > --- a/libipvs/ip_vs.h > +++ b/libipvs/ip_vs.h > @@ -277,6 +277,8 @@ struct ip_vs_dest_entry { > struct ip_vs_stats_user stats; > u_int16_t af; > union nf_inet_addr addr; > + > + u_int32_t backlogconns; /* backlog connections */ > }; > > /* The argument to IP_VS_SO_GET_DESTS */ > @@ -455,6 +457,8 @@ enum { > IPVS_DEST_ATTR_PERSIST_CONNS, /* persistent connections */ > > IPVS_DEST_ATTR_STATS, /* nested attribute for dest stats */ > + > + IPVS_DEST_ATTR_BACKLOG_CONNS, /* backlog connections */ > __IPVS_DEST_ATTR_MAX, > }; > > diff --git a/libipvs/ip_vs_nl_policy.c b/libipvs/ip_vs_nl_policy.c > index c80083e..d06a490 100644 > --- a/libipvs/ip_vs_nl_policy.c > +++ b/libipvs/ip_vs_nl_policy.c > @@ -40,6 +40,7 @@ struct nla_policy ipvs_dest_policy[IPVS_DEST_ATTR_MAX + 1] = { > [IPVS_DEST_ATTR_INACT_CONNS] = { .type = NLA_U32 }, > [IPVS_DEST_ATTR_PERSIST_CONNS] = { .type = NLA_U32 }, > [IPVS_DEST_ATTR_STATS] = { .type = NLA_NESTED }, > + [IPVS_DEST_ATTR_BACKLOG_CONNS] = { .type = NLA_U32 }, > }; > > struct nla_policy ipvs_stats_policy[IPVS_STATS_ATTR_MAX + 1] = { > diff --git a/libipvs/libipvs.c b/libipvs/libipvs.c > index 979d5bd..e06f9fa 100644 > --- a/libipvs/libipvs.c > +++ b/libipvs/libipvs.c > @@ -748,6 +748,8 @@ static int ipvs_dests_parse_cb(struct nl_msg *msg, void *arg) > d->entrytable[i].l_threshold = nla_get_u32(dest_attrs[IPVS_DEST_ATTR_L_THRESH]); > d->entrytable[i].activeconns = nla_get_u32(dest_attrs[IPVS_DEST_ATTR_ACTIVE_CONNS]); > d->entrytable[i].inactconns = nla_get_u32(dest_attrs[IPVS_DEST_ATTR_INACT_CONNS]); > + if (dest_attrs[IPVS_DEST_ATTR_BACKLOG_CONNS]) > + d->entrytable[i].backlogconns = nla_get_u32(dest_attrs[IPVS_DEST_ATTR_BACKLOG_CONNS]); > d->entrytable[i].persistconns = nla_get_u32(dest_attrs[IPVS_DEST_ATTR_PERSIST_CONNS]); > d->entrytable[i].af = d->af; > > @@ -853,6 +855,7 @@ ipvs_nl_dest_failure: > sizeof(struct ip_vs_dest_entry_kern)); > d->entrytable[i].af = AF_INET; > d->entrytable[i].addr.ip = d->entrytable[i].__addr_v4; > + d->entrytable[i].backlogconns = 0; > } > free(dk); > return d; > -- 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