]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - net/ipv4/ipvs/ip_vs_proto_udp.c
IPVS: Add v6 support to ip_vs_service_get()
[net-next-2.6.git] / net / ipv4 / ipvs / ip_vs_proto_udp.c
index 1caa2908373f28cea2f7c98e3d7191fbaf25d4f3..d208ed6eb9fca36c0ef7c4056153d5eed6a55bd3 100644 (file)
@@ -1,8 +1,6 @@
 /*
  * ip_vs_proto_udp.c:  UDP load balancing support for IPVS
  *
- * Version:     $Id: ip_vs_proto_udp.c,v 1.3 2002/11/30 01:50:35 wensong Exp $
- *
  * Authors:     Wensong Zhang <wensong@linuxvirtualserver.org>
  *              Julian Anastasov <ja@ssi.bg>
  *
@@ -82,16 +80,19 @@ udp_conn_schedule(struct sk_buff *skb, struct ip_vs_protocol *pp,
 {
        struct ip_vs_service *svc;
        struct udphdr _udph, *uh;
+       struct ip_vs_iphdr iph;
+
+       ip_vs_fill_iphdr(AF_INET, skb_network_header(skb), &iph);
 
-       uh = skb_header_pointer(skb, ip_hdrlen(skb),
-                               sizeof(_udph), &_udph);
+       uh = skb_header_pointer(skb, iph.len, sizeof(_udph), &_udph);
        if (uh == NULL) {
                *verdict = NF_DROP;
                return 0;
        }
 
-       if ((svc = ip_vs_service_get(skb->mark, ip_hdr(skb)->protocol,
-                                    ip_hdr(skb)->daddr, uh->dest))) {
+       svc = ip_vs_service_get(AF_INET, skb->mark, iph.protocol,
+                               &iph.daddr, uh->dest);
+       if (svc) {
                if (ip_vs_todrop()) {
                        /*
                         * It seems that we are very loaded.
@@ -160,7 +161,7 @@ udp_snat_handler(struct sk_buff *skb,
         */
        if (!cp->app && (udph->check != 0)) {
                /* Only port and addr are changed, do fast csum update */
-               udp_fast_csum_update(udph, cp->daddr, cp->vaddr,
+               udp_fast_csum_update(udph, cp->daddr.ip, cp->vaddr.ip,
                                     cp->dport, cp->vport);
                if (skb->ip_summed == CHECKSUM_COMPLETE)
                        skb->ip_summed = CHECKSUM_NONE;
@@ -168,7 +169,7 @@ udp_snat_handler(struct sk_buff *skb,
                /* full checksum calculation */
                udph->check = 0;
                skb->csum = skb_checksum(skb, udphoff, skb->len - udphoff, 0);
-               udph->check = csum_tcpudp_magic(cp->vaddr, cp->caddr,
+               udph->check = csum_tcpudp_magic(cp->vaddr.ip, cp->caddr.ip,
                                                skb->len - udphoff,
                                                cp->protocol, skb->csum);
                if (udph->check == 0)
@@ -213,7 +214,7 @@ udp_dnat_handler(struct sk_buff *skb,
         */
        if (!cp->app && (udph->check != 0)) {
                /* Only port and addr are changed, do fast csum update */
-               udp_fast_csum_update(udph, cp->vaddr, cp->daddr,
+               udp_fast_csum_update(udph, cp->vaddr.ip, cp->daddr.ip,
                                     cp->vport, cp->dport);
                if (skb->ip_summed == CHECKSUM_COMPLETE)
                        skb->ip_summed = CHECKSUM_NONE;
@@ -221,7 +222,7 @@ udp_dnat_handler(struct sk_buff *skb,
                /* full checksum calculation */
                udph->check = 0;
                skb->csum = skb_checksum(skb, udphoff, skb->len - udphoff, 0);
-               udph->check = csum_tcpudp_magic(cp->caddr, cp->daddr,
+               udph->check = csum_tcpudp_magic(cp->caddr.ip, cp->daddr.ip,
                                                skb->len - udphoff,
                                                cp->protocol, skb->csum);
                if (udph->check == 0)
@@ -345,8 +346,8 @@ static int udp_app_conn_bind(struct ip_vs_conn *cp)
                        IP_VS_DBG(9, "%s: Binding conn %u.%u.%u.%u:%u->"
                                  "%u.%u.%u.%u:%u to app %s on port %u\n",
                                  __func__,
-                                 NIPQUAD(cp->caddr), ntohs(cp->cport),
-                                 NIPQUAD(cp->vaddr), ntohs(cp->vport),
+                                 NIPQUAD(cp->caddr.ip), ntohs(cp->cport),
+                                 NIPQUAD(cp->vaddr.ip), ntohs(cp->vport),
                                  inc->name, ntohs(inc->port));
                        cp->app = inc;
                        if (inc->init_conn)
@@ -409,6 +410,7 @@ static void udp_exit(struct ip_vs_protocol *pp)
 struct ip_vs_protocol ip_vs_protocol_udp = {
        .name =                 "UDP",
        .protocol =             IPPROTO_UDP,
+       .num_states =           IP_VS_UDP_S_LAST,
        .dont_defrag =          0,
        .init =                 udp_init,
        .exit =                 udp_exit,