]> 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 c6be5d56823f660564ce70727f32abb7d5046bd9..d208ed6eb9fca36c0ef7c4056153d5eed6a55bd3 100644 (file)
@@ -80,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;
 
-       uh = skb_header_pointer(skb, ip_hdrlen(skb),
-                               sizeof(_udph), &_udph);
+       ip_vs_fill_iphdr(AF_INET, skb_network_header(skb), &iph);
+
+       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.
@@ -158,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;
@@ -166,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)
@@ -211,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;
@@ -219,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)
@@ -343,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)