Exemple #1
0
/*
 *      Source Hashing scheduling
 */
static struct ip_vs_dest *
ip_vs_sh_schedule(struct ip_vs_service *svc, struct iphdr *iph)
{
	struct ip_vs_dest *dest;
	struct ip_vs_sh_bucket *tbl;

	IP_VS_DBG(6, "ip_vs_sh_schedule(): Scheduling...\n");

	tbl = (struct ip_vs_sh_bucket *)svc->sched_data;
	dest = ip_vs_sh_get(tbl, iph->saddr);
	if (!dest
	    || !(dest->flags & IP_VS_DEST_F_AVAILABLE)
	    || atomic_read(&dest->weight) <= 0
	    || is_overloaded(dest)) {
		return NULL;
	}

	IP_VS_DBG(6, "SH: source IP address %u.%u.%u.%u "
		  "--> server %u.%u.%u.%u:%d\n",
		  NIPQUAD(iph->saddr),
		  NIPQUAD(dest->addr),
		  ntohs(dest->port));

	return dest;
}
Exemple #2
0
/*
 *      Source Hashing scheduling
 */
static struct ip_vs_dest *
ip_vs_sh_schedule(struct ip_vs_service *svc, const struct sk_buff *skb)
{
    struct ip_vs_dest *dest;
    struct ip_vs_sh_bucket *tbl;
    struct ip_vs_iphdr iph;

    ip_vs_fill_iphdr(svc->af, skb_network_header(skb), &iph);

    IP_VS_DBG(6, "ip_vs_sh_schedule(): Scheduling...\n");

    tbl = (struct ip_vs_sh_bucket *)svc->sched_data;
    dest = ip_vs_sh_get(svc->af, tbl, &iph.saddr);
    if (!dest
            || !(dest->flags & IP_VS_DEST_F_AVAILABLE)
            || atomic_read(&dest->weight) <= 0
            || is_overloaded(dest)) {
        ip_vs_scheduler_err(svc, "no destination available");
        return NULL;
    }

    IP_VS_DBG_BUF(6, "SH: source IP address %s --> server %s:%d\n",
                  IP_VS_DBG_ADDR(svc->af, &iph.saddr),
                  IP_VS_DBG_ADDR(svc->af, &dest->addr),
                  ntohs(dest->port));

    return dest;
}
Exemple #3
0
/*
 *      Source Hashing scheduling
 */
static struct ip_vs_dest *
ip_vs_sh_schedule(struct ip_vs_service *svc, const struct sk_buff *skb,
		  struct ip_vs_iphdr *iph)
{
	struct ip_vs_dest *dest;
	struct ip_vs_sh_state *s;
	__be16 port = 0;

	IP_VS_DBG(6, "ip_vs_sh_schedule(): Scheduling...\n");

	if (svc->flags & IP_VS_SVC_F_SCHED_SH_PORT)
		port = ip_vs_sh_get_port(skb, iph);

	s = (struct ip_vs_sh_state *) svc->sched_data;

	if (svc->flags & IP_VS_SVC_F_SCHED_SH_FALLBACK)
		dest = ip_vs_sh_get_fallback(svc, s, &iph->saddr, port);
	else
		dest = ip_vs_sh_get(svc, s, &iph->saddr, port);

	if (!dest) {
		ip_vs_scheduler_err(svc, "no destination available");
		return NULL;
	}

	IP_VS_DBG_BUF(6, "SH: source IP address %s --> server %s:%d\n",
		      IP_VS_DBG_ADDR(svc->af, &iph->saddr),
		      IP_VS_DBG_ADDR(svc->af, &dest->addr),
		      ntohs(dest->port));

	return dest;
}
Exemple #4
0
/*
 *      Source Hashing scheduling
 */
static struct ip_vs_dest *
ip_vs_sh_schedule(struct ip_vs_service *svc, const struct sk_buff *skb)
{
    struct ip_vs_dest *dest;
    struct ip_vs_sh_bucket *tbl;
    struct iphdr *iph = ip_hdr(skb);

    IP_VS_DBG(6, "ip_vs_sh_schedule(): Scheduling...\n");

    tbl = (struct ip_vs_sh_bucket *)svc->sched_data;
    dest = ip_vs_sh_get(tbl, iph->saddr);
    if (!dest
            || !(dest->flags & IP_VS_DEST_F_AVAILABLE)
            || atomic_read(&dest->weight) <= 0
            || is_overloaded(dest)) {
        return NULL;
    }

    IP_VS_DBG(6, "SH: source IP address %pI4 --> server %pI4:%u\n",
              &iph->saddr, &dest->addr, ntohs(dest->port));

    return dest;
}