Hello, On Thu, 13 Jun 2013, Alexander Frolkin wrote: > Hi, > > I've patched ipvsadm and fixed up the kernel patch. > > For the ipvsadm option, I've used (-b|--sched-flags) 123. I don't Not sure if we need "-b". > particularly like this style, but I wanted something working for > testing. I guess it is difficult to maintain many options, may be one option --sched-flags should be enough, for example: --sched-flags sh-fallback,sh-port In all cases we should not use any of the --sched-flag-1 variants, better to have scheduler specific tokens that will set some IP_VS_SVC_F_SCHED* flags. > I'm using ip_vs_fill_iph_skb for now (if the flag is set), until I hear > back from you. OK, we will rely on provided iph later... > When you're happy with the patches, I can open the discussion up to the > users mailing list. > > Kernel patch: > > diff --git a/include/uapi/linux/ip_vs.h b/include/uapi/linux/ip_vs.h > index a245377..81af9b2 100644 > --- a/include/uapi/linux/ip_vs.h > +++ b/include/uapi/linux/ip_vs.h > @@ -20,6 +20,9 @@ > #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 */ > +#define IP_VS_SVC_F_SCHED1 0x0008 /* scheduler flag 1 */ > +#define IP_VS_SVC_F_SCHED2 0x0010 /* scheduler flag 2 */ > +#define IP_VS_SVC_F_SCHED3 0x0020 /* scheduler flag 3 */ We have to make the mapping of scheduler flags public, for example, add: #define IP_VS_SVC_F_SCHED_SH_FALLBACK IP_VS_SVC_F_SCHED1 #define IP_VS_SVC_F_SCHED_SH_PORT IP_VS_SVC_F_SCHED2 also in libipvs/ip_vs.h, as usually. > /* > * Destination Server Flags > diff --git a/net/netfilter/ipvs/ip_vs_sh.c b/net/netfilter/ipvs/ip_vs_sh.c > index 0df269d..f9de4d2 100644 > --- a/net/netfilter/ipvs/ip_vs_sh.c > +++ b/net/netfilter/ipvs/ip_vs_sh.c > @@ -48,6 +48,10 @@ > > #include <net/ip_vs.h> > > +#include <net/tcp.h> > +#include <linux/udp.h> > +#include <linux/sctp.h> > + > > /* > * IPVS SH bucket > @@ -74,7 +78,9 @@ struct ip_vs_sh_state { > /* > * Returns hash value for IPVS SH entry > */ > -static inline unsigned int ip_vs_sh_hashkey(int af, const union nf_inet_addr *addr) > +static inline unsigned int ip_vs_sh_hashkey(int af, > + const union nf_inet_addr *addr, __be16 port, > + unsigned int offset) Arguments should be properly aligned, you can reorder them, if needed. > + if (svc->flags & IP_VS_SVC_F_SCHED2) { > + found = false; > + for (offset = 0; offset < IP_VS_SH_TAB_SIZE; offset++) { > + dest = ip_vs_sh_get(svc->af, s, &iph.saddr, > + port, offset); > + if (is_unavailable(dest)) > + IP_VS_DBG_BUF(6, "SH: selected unavailable " > + "server %s:%d (offset %d)", > + IP_VS_DBG_ADDR(svc->af, &dest->addr), dest can be NULL => crash > + ntohs(dest->port), > + offset); May be we have to put this for loop in new func, so that IP_VS_DBG_BUF args are properly aligned? Another option is to move IP_VS_DBG_BUF into is_unavailable(svc, dest, offset) and to use it only when dest != NULL. Regards -- Julian Anastasov <ja@xxxxxx> -- 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