diff options
Diffstat (limited to 'net/ipv6/udp.c')
| -rw-r--r-- | net/ipv6/udp.c | 61 |
1 files changed, 34 insertions, 27 deletions
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index c28551fd6078..a8e89f16dc2c 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c @@ -65,11 +65,11 @@ static int udp_v6_get_port(struct sock *sk, unsigned short snum) best_size_so_far = 32767; best = result = udp_port_rover; for (i = 0; i < UDP_HTABLE_SIZE; i++, result++) { - struct sock *sk; + struct sock *sk2; int size; - sk = udp_hash[result & (UDP_HTABLE_SIZE - 1)]; - if (!sk) { + sk2 = udp_hash[result & (UDP_HTABLE_SIZE - 1)]; + if (!sk2) { if (result > sysctl_local_port_range[1]) result = sysctl_local_port_range[0] + ((result - sysctl_local_port_range[0]) & @@ -80,7 +80,7 @@ static int udp_v6_get_port(struct sock *sk, unsigned short snum) do { if (++size >= best_size_so_far) goto next; - } while ((sk = sk->next) != NULL); + } while ((sk2 = sk2->next) != NULL); best_size_so_far = size; best = result; next:; @@ -104,23 +104,24 @@ gotit: for (sk2 = udp_hash[snum & (UDP_HTABLE_SIZE - 1)]; sk2 != NULL; sk2 = sk2->next) { + struct inet_opt *inet2 = inet_sk(sk2); struct ipv6_pinfo *np2 = inet6_sk(sk2); - if (sk2->num == snum && + if (inet2->num == snum && sk2 != sk && sk2->bound_dev_if == sk->bound_dev_if && - (!sk2->rcv_saddr || + (!inet2->rcv_saddr || addr_type == IPV6_ADDR_ANY || !ipv6_addr_cmp(&np->rcv_saddr, &np2->rcv_saddr) || (addr_type == IPV6_ADDR_MAPPED && sk2->family == AF_INET && - sk->rcv_saddr == sk2->rcv_saddr)) && + inet_sk(sk)->rcv_saddr == inet2->rcv_saddr)) && (!sk2->reuse || !sk->reuse)) goto fail; } } - sk->num = snum; + inet_sk(sk)->num = snum; if (sk->pprev == NULL) { struct sock **skp = &udp_hash[snum & (UDP_HTABLE_SIZE - 1)]; if ((sk->next = *skp) != NULL) @@ -151,7 +152,7 @@ static void udp_v6_unhash(struct sock *sk) sk->next->pprev = sk->pprev; *sk->pprev = sk->next; sk->pprev = NULL; - sk->num = 0; + inet_sk(sk)->num = 0; sock_prot_dec_use(sk->prot); __sock_put(sk); } @@ -167,12 +168,13 @@ static struct sock *udp_v6_lookup(struct in6_addr *saddr, u16 sport, read_lock(&udp_hash_lock); for(sk = udp_hash[hnum & (UDP_HTABLE_SIZE - 1)]; sk != NULL; sk = sk->next) { - if((sk->num == hnum) && - (sk->family == PF_INET6)) { + struct inet_opt *inet = inet_sk(sk); + + if (inet->num == hnum && sk->family == PF_INET6) { struct ipv6_pinfo *np = inet6_sk(sk); int score = 0; - if(sk->dport) { - if(sk->dport != sport) + if (inet->dport) { + if (inet->dport != sport) continue; score++; } @@ -213,6 +215,7 @@ static struct sock *udp_v6_lookup(struct in6_addr *saddr, u16 sport, int udpv6_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) { struct sockaddr_in6 *usin = (struct sockaddr_in6 *) uaddr; + struct inet_opt *inet = inet_sk(sk); struct ipv6_pinfo *np = inet6_sk(sk); struct in6_addr *daddr; struct in6_addr saddr; @@ -268,16 +271,16 @@ ipv4_connected: if (err < 0) return err; - ipv6_addr_set(&np->daddr, 0, 0, htonl(0x0000ffff), sk->daddr); + ipv6_addr_set(&np->daddr, 0, 0, htonl(0x0000ffff), inet->daddr); if (ipv6_addr_any(&np->saddr)) { ipv6_addr_set(&np->saddr, 0, 0, htonl(0x0000ffff), - sk->saddr); + inet->saddr); } if (ipv6_addr_any(&np->rcv_saddr)) { ipv6_addr_set(&np->rcv_saddr, 0, 0, htonl(0x0000ffff), - sk->rcv_saddr); + inet->rcv_saddr); } return 0; } @@ -300,7 +303,7 @@ ipv4_connected: ipv6_addr_copy(&np->daddr, daddr); np->flow_label = fl.fl6_flowlabel; - sk->dport = usin->sin6_port; + inet->dport = usin->sin6_port; /* * Check for a route to destination an obtain the @@ -311,8 +314,8 @@ ipv4_connected: fl.fl6_dst = &np->daddr; fl.fl6_src = &saddr; fl.oif = sk->bound_dev_if; - fl.uli_u.ports.dport = sk->dport; - fl.uli_u.ports.sport = sk->sport; + fl.uli_u.ports.dport = inet->dport; + fl.uli_u.ports.sport = inet->sport; if (flowlabel) { if (flowlabel->opt && flowlabel->opt->srcrt) { @@ -344,7 +347,7 @@ ipv4_connected: if (ipv6_addr_any(&np->rcv_saddr)) { ipv6_addr_copy(&np->rcv_saddr, &saddr); - sk->rcv_saddr = LOOPBACK4_IPV6; + inet->rcv_saddr = LOOPBACK4_IPV6; } sk->state = TCP_ESTABLISHED; } @@ -528,10 +531,12 @@ static struct sock *udp_v6_mcast_next(struct sock *sk, struct sock *s = sk; unsigned short num = ntohs(loc_port); for(; s; s = s->next) { - if(s->num == num) { + struct inet_opt *inet = inet_sk(s); + + if (inet->num == num) { struct ipv6_pinfo *np = inet6_sk(s); - if(s->dport) { - if(s->dport != rmt_port) + if (inet->dport) { + if (inet->dport != rmt_port) continue; } if (!ipv6_addr_any(&np->daddr) && @@ -757,6 +762,7 @@ static int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, int ulen) { struct ipv6_txoptions opt_space; struct udpv6fakehdr udh; + struct inet_opt *inet = inet_sk(sk); struct ipv6_pinfo *np = inet6_sk(sk); struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) msg->msg_name; struct ipv6_txoptions *opt = NULL; @@ -818,7 +824,7 @@ static int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, int ulen) if (sk->state != TCP_ESTABLISHED) return -ENOTCONN; - udh.uh.dest = sk->dport; + udh.uh.dest = inet->dport; daddr = &np->daddr; fl.fl6_flowlabel = np->flow_label; } @@ -867,7 +873,7 @@ static int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, int ulen) if (opt && opt->srcrt) udh.daddr = daddr; - udh.uh.source = sk->sport; + udh.uh.source = inet->sport; udh.uh.len = len < 0x10000 ? htons(len) : 0; udh.uh.check = 0; udh.iov = msg->msg_iov; @@ -905,14 +911,15 @@ static struct inet6_protocol udpv6_protocol = { static void get_udp6_sock(struct sock *sp, char *tmpbuf, int i) { + struct inet_opt *inet = inet_sk(sp); struct ipv6_pinfo *np = inet6_sk(sp); struct in6_addr *dest, *src; __u16 destp, srcp; dest = &np->daddr; src = &np->rcv_saddr; - destp = ntohs(sp->dport); - srcp = ntohs(sp->sport); + destp = ntohs(inet->dport); + srcp = ntohs(inet->sport); sprintf(tmpbuf, "%4d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X " "%02X %08X:%08X %02X:%08lX %08X %5d %8d %ld %d %p", |
