On Wed, Aug 20, 2008 at 06:15:17PM +0200, Julius Volz wrote:
> Convert ip_vs_schedule() and ip_vs_sched_persist() to support scheduling
> IPv6 connections.
>
> Signed-off-by: Julius Volz <juliusv@xxxxxxxxxx>
>
> 1 files changed, 58 insertions(+), 43 deletions(-)
>
> diff --git a/net/ipv4/ipvs/ip_vs_core.c b/net/ipv4/ipvs/ip_vs_core.c
> index 99e8938..0f9a0a2 100644
> --- a/net/ipv4/ipvs/ip_vs_core.c
> +++ b/net/ipv4/ipvs/ip_vs_core.c
> @@ -183,14 +183,21 @@ ip_vs_sched_persist(struct ip_vs_service *svc,
> __be16 ports[2])
> {
> struct ip_vs_conn *cp = NULL;
> - struct iphdr *iph = ip_hdr(skb);
> + struct ip_vs_iphdr iph;
> struct ip_vs_dest *dest;
> struct ip_vs_conn *ct;
> - __be16 dport; /* destination port to forward */
> - __be32 snet; /* source network of the client, after masking */
> + __be16 dport; /* destination port to forward */
> + union nf_inet_addr snet; /* source network of the client, after
> masking */
Can you break the line above so that it is <= 80 columns wide?
union nf_inet_addr snet; /* source network of the client,
* after masking */
> +
> + ip_vs_fill_iphdr(svc->af, skb_network_header(skb), &iph);
>
> /* Mask saddr with the netmask to adjust template granularity */
> - snet = iph->saddr & svc->netmask;
> +#ifdef CONFIG_IP_VS_IPV6
> + if (svc->af == AF_INET6)
> + ipv6_addr_prefix(&snet.in6, &iph.saddr.in6, svc->netmask);
> + else
> +#endif
> + snet.ip = iph.saddr.ip & svc->netmask;
>
> IP_VS_DBG_BUF(6, "p-schedule: src %s:%u dest %s:%u "
> "mnet %s\n",
> @@ -214,11 +221,11 @@ ip_vs_sched_persist(struct ip_vs_service *svc,
> if (ports[1] == svc->port) {
> /* Check if a template already exists */
> if (svc->port != FTPPORT)
> - ct = ip_vs_ct_in_get(iph->protocol, snet, 0,
> - iph->daddr, ports[1]);
> + ct = ip_vs_ct_in_get(svc->af, iph.protocol, &snet, 0,
> + &iph.daddr, ports[1]);
> else
> - ct = ip_vs_ct_in_get(iph->protocol, snet, 0,
> - iph->daddr, 0);
> + ct = ip_vs_ct_in_get(svc->af, iph.protocol, &snet, 0,
> + &iph.daddr, 0);
>
> if (!ct || !ip_vs_check_template(ct)) {
> /*
> @@ -238,18 +245,18 @@ ip_vs_sched_persist(struct ip_vs_service *svc,
> * for ftp service.
> */
> if (svc->port != FTPPORT)
> - ct = ip_vs_conn_new(iph->protocol,
> - snet, 0,
> - iph->daddr,
> + ct = ip_vs_conn_new(svc->af, iph.protocol,
> + &snet, 0,
> + &iph.daddr,
> ports[1],
> - dest->addr, dest->port,
> + &dest->addr, dest->port,
> IP_VS_CONN_F_TEMPLATE,
> dest);
> else
> - ct = ip_vs_conn_new(iph->protocol,
> - snet, 0,
> - iph->daddr, 0,
> - dest->addr, 0,
> + ct = ip_vs_conn_new(svc->af, iph.protocol,
> + &snet, 0,
> + &iph.daddr, 0,
> + &dest->addr, 0,
> IP_VS_CONN_F_TEMPLATE,
> dest);
> if (ct == NULL)
> @@ -268,12 +275,16 @@ ip_vs_sched_persist(struct ip_vs_service *svc,
> * fwmark template: <IPPROTO_IP,caddr,0,fwmark,0,daddr,0>
> * port zero template: <protocol,caddr,0,vaddr,0,daddr,0>
> */
> - if (svc->fwmark)
> - ct = ip_vs_ct_in_get(IPPROTO_IP, snet, 0,
> - htonl(svc->fwmark), 0);
> - else
> - ct = ip_vs_ct_in_get(iph->protocol, snet, 0,
> - iph->daddr, 0);
> + if (svc->fwmark) {
> + union nf_inet_addr fwmark = {
> + .all = { 0, 0, 0, htonl(svc->fwmark) }
> + };
> +
> + ct = ip_vs_ct_in_get(svc->af, IPPROTO_IP, &snet, 0,
> + &fwmark, 0);
> + } else
> + ct = ip_vs_ct_in_get(svc->af, iph.protocol, &snet, 0,
> + &iph.daddr, 0);
>
> if (!ct || !ip_vs_check_template(ct)) {
> /*
> @@ -292,18 +303,22 @@ ip_vs_sched_persist(struct ip_vs_service *svc,
> /*
> * Create a template according to the service
> */
> - if (svc->fwmark)
> - ct = ip_vs_conn_new(IPPROTO_IP,
> - snet, 0,
> - htonl(svc->fwmark), 0,
> - dest->addr, 0,
> + if (svc->fwmark) {
> + union nf_inet_addr fwmark = {
> + .all = { 0, 0, 0, htonl(svc->fwmark) }
> + };
> +
> + ct = ip_vs_conn_new(svc->af, IPPROTO_IP,
> + &snet, 0,
> + &fwmark, 0,
> + &dest->addr, 0,
> IP_VS_CONN_F_TEMPLATE,
> dest);
> - else
> - ct = ip_vs_conn_new(iph->protocol,
> - snet, 0,
> - iph->daddr, 0,
> - dest->addr, 0,
> + } else
> + ct = ip_vs_conn_new(svc->af, iph.protocol,
> + &snet, 0,
> + &iph.daddr, 0,
> + &dest->addr, 0,
> IP_VS_CONN_F_TEMPLATE,
> dest);
> if (ct == NULL)
> @@ -320,10 +335,10 @@ ip_vs_sched_persist(struct ip_vs_service *svc,
> /*
> * Create a new connection according to the template
> */
> - cp = ip_vs_conn_new(iph->protocol,
> - iph->saddr, ports[0],
> - iph->daddr, ports[1],
> - dest->addr, dport,
> + cp = ip_vs_conn_new(svc->af, iph.protocol,
> + &iph.saddr, ports[0],
> + &iph.daddr, ports[1],
> + &dest->addr, dport,
> 0,
> dest);
> if (cp == NULL) {
> @@ -352,12 +367,12 @@ struct ip_vs_conn *
> ip_vs_schedule(struct ip_vs_service *svc, const struct sk_buff *skb)
> {
> struct ip_vs_conn *cp = NULL;
> - struct iphdr *iph = ip_hdr(skb);
> + struct ip_vs_iphdr iph;
> struct ip_vs_dest *dest;
> __be16 _ports[2], *pptr;
>
> - pptr = skb_header_pointer(skb, iph->ihl*4,
> - sizeof(_ports), _ports);
> + ip_vs_fill_iphdr(svc->af, skb_network_header(skb), &iph);
> + pptr = skb_header_pointer(skb, iph.len, sizeof(_ports), _ports);
> if (pptr == NULL)
> return NULL;
>
> @@ -387,10 +402,10 @@ ip_vs_schedule(struct ip_vs_service *svc, const struct
> sk_buff *skb)
> /*
> * Create a connection entry.
> */
> - cp = ip_vs_conn_new(iph->protocol,
> - iph->saddr, pptr[0],
> - iph->daddr, pptr[1],
> - dest->addr, dest->port?dest->port:pptr[1],
> + cp = ip_vs_conn_new(svc->af, iph.protocol,
> + &iph.saddr, pptr[0],
> + &iph.daddr, pptr[1],
> + &dest->addr, dest->port ? dest->port : pptr[1],
> 0,
> dest);
> if (cp == NULL)
> --
> 1.5.4.5
--
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
|