aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/udp.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv4/udp.c')
-rw-r--r--net/ipv4/udp.c95
1 files changed, 48 insertions, 47 deletions
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
index 86368832d481..21901d2c5324 100644
--- a/net/ipv4/udp.c
+++ b/net/ipv4/udp.c
@@ -175,7 +175,8 @@ int __udp_lib_get_port(struct sock *sk, unsigned short snum,
175 ; 175 ;
176 } 176 }
177 result = best; 177 result = best;
178 for(i = 0; i < (1 << 16) / UDP_HTABLE_SIZE; i++, result += UDP_HTABLE_SIZE) { 178 for (i = 0; i < (1 << 16) / UDP_HTABLE_SIZE;
179 i++, result += UDP_HTABLE_SIZE) {
179 if (result > sysctl_local_port_range[1]) 180 if (result > sysctl_local_port_range[1])
180 result = sysctl_local_port_range[0] 181 result = sysctl_local_port_range[0]
181 + ((result - sysctl_local_port_range[0]) & 182 + ((result - sysctl_local_port_range[0]) &
@@ -270,10 +271,10 @@ static struct sock *__udp4_lib_lookup(__be32 saddr, __be16 sport,
270 continue; 271 continue;
271 score+=2; 272 score+=2;
272 } 273 }
273 if(score == 9) { 274 if (score == 9) {
274 result = sk; 275 result = sk;
275 break; 276 break;
276 } else if(score > badness) { 277 } else if (score > badness) {
277 result = sk; 278 result = sk;
278 badness = score; 279 badness = score;
279 } 280 }
@@ -765,38 +766,38 @@ out:
765 766
766int udp_ioctl(struct sock *sk, int cmd, unsigned long arg) 767int udp_ioctl(struct sock *sk, int cmd, unsigned long arg)
767{ 768{
768 switch(cmd) 769 switch (cmd) {
770 case SIOCOUTQ:
769 { 771 {
770 case SIOCOUTQ: 772 int amount = atomic_read(&sk->sk_wmem_alloc);
771 { 773 return put_user(amount, (int __user *)arg);
772 int amount = atomic_read(&sk->sk_wmem_alloc); 774 }
773 return put_user(amount, (int __user *)arg);
774 }
775 775
776 case SIOCINQ: 776 case SIOCINQ:
777 { 777 {
778 struct sk_buff *skb; 778 struct sk_buff *skb;
779 unsigned long amount; 779 unsigned long amount;
780 780
781 amount = 0; 781 amount = 0;
782 spin_lock_bh(&sk->sk_receive_queue.lock); 782 spin_lock_bh(&sk->sk_receive_queue.lock);
783 skb = skb_peek(&sk->sk_receive_queue); 783 skb = skb_peek(&sk->sk_receive_queue);
784 if (skb != NULL) { 784 if (skb != NULL) {
785 /* 785 /*
786 * We will only return the amount 786 * We will only return the amount
787 * of this packet since that is all 787 * of this packet since that is all
788 * that will be read. 788 * that will be read.
789 */ 789 */
790 amount = skb->len - sizeof(struct udphdr); 790 amount = skb->len - sizeof(struct udphdr);
791 }
792 spin_unlock_bh(&sk->sk_receive_queue.lock);
793 return put_user(amount, (int __user *)arg);
794 } 791 }
792 spin_unlock_bh(&sk->sk_receive_queue.lock);
793 return put_user(amount, (int __user *)arg);
794 }
795 795
796 default: 796 default:
797 return -ENOIOCTLCMD; 797 return -ENOIOCTLCMD;
798 } 798 }
799 return(0); 799
800 return 0;
800} 801}
801 802
802/* 803/*
@@ -958,7 +959,7 @@ static int udp_encap_rcv(struct sock * sk, struct sk_buff *skb)
958 /* Check if this is a keepalive packet. If so, eat it. */ 959 /* Check if this is a keepalive packet. If so, eat it. */
959 if (len == 1 && udpdata[0] == 0xff) { 960 if (len == 1 && udpdata[0] == 0xff) {
960 return 0; 961 return 0;
961 } else if (len > sizeof(struct ip_esp_hdr) && udpdata32[0] != 0 ) { 962 } else if (len > sizeof(struct ip_esp_hdr) && udpdata32[0] != 0) {
962 /* ESP Packet without Non-ESP header */ 963 /* ESP Packet without Non-ESP header */
963 len = sizeof(struct udphdr); 964 len = sizeof(struct udphdr);
964 } else 965 } else
@@ -1141,10 +1142,10 @@ static int __udp4_lib_mcast_deliver(struct sk_buff *skb,
1141 1142
1142 sknext = udp_v4_mcast_next(sk_next(sk), uh->dest, daddr, 1143 sknext = udp_v4_mcast_next(sk_next(sk), uh->dest, daddr,
1143 uh->source, saddr, dif); 1144 uh->source, saddr, dif);
1144 if(sknext) 1145 if (sknext)
1145 skb1 = skb_clone(skb, GFP_ATOMIC); 1146 skb1 = skb_clone(skb, GFP_ATOMIC);
1146 1147
1147 if(skb1) { 1148 if (skb1) {
1148 int ret = udp_queue_rcv_skb(sk, skb1); 1149 int ret = udp_queue_rcv_skb(sk, skb1);
1149 if (ret > 0) 1150 if (ret > 0)
1150 /* we should probably re-process instead 1151 /* we should probably re-process instead
@@ -1152,7 +1153,7 @@ static int __udp4_lib_mcast_deliver(struct sk_buff *skb,
1152 kfree_skb(skb1); 1153 kfree_skb(skb1);
1153 } 1154 }
1154 sk = sknext; 1155 sk = sknext;
1155 } while(sknext); 1156 } while (sknext);
1156 } else 1157 } else
1157 kfree_skb(skb); 1158 kfree_skb(skb);
1158 read_unlock(&udp_hash_lock); 1159 read_unlock(&udp_hash_lock);
@@ -1230,7 +1231,7 @@ int __udp4_lib_rcv(struct sk_buff *skb, struct hlist_head udptable[],
1230 if (udp4_csum_init(skb, uh, proto)) 1231 if (udp4_csum_init(skb, uh, proto))
1231 goto csum_error; 1232 goto csum_error;
1232 1233
1233 if(rt->rt_flags & (RTCF_BROADCAST|RTCF_MULTICAST)) 1234 if (rt->rt_flags & (RTCF_BROADCAST|RTCF_MULTICAST))
1234 return __udp4_lib_mcast_deliver(skb, uh, saddr, daddr, udptable); 1235 return __udp4_lib_mcast_deliver(skb, uh, saddr, daddr, udptable);
1235 1236
1236 sk = __udp4_lib_lookup(saddr, uh->source, daddr, uh->dest, 1237 sk = __udp4_lib_lookup(saddr, uh->source, daddr, uh->dest,
@@ -1264,7 +1265,7 @@ int __udp4_lib_rcv(struct sk_buff *skb, struct hlist_head udptable[],
1264 * don't wanna listen. Ignore it. 1265 * don't wanna listen. Ignore it.
1265 */ 1266 */
1266 kfree_skb(skb); 1267 kfree_skb(skb);
1267 return(0); 1268 return 0;
1268 1269
1269short_packet: 1270short_packet:
1270 LIMIT_NETDEBUG(KERN_DEBUG "UDP%s: short packet: From %u.%u.%u.%u:%u %d/%d to %u.%u.%u.%u:%u\n", 1271 LIMIT_NETDEBUG(KERN_DEBUG "UDP%s: short packet: From %u.%u.%u.%u:%u %d/%d to %u.%u.%u.%u:%u\n",
@@ -1292,7 +1293,7 @@ csum_error:
1292drop: 1293drop:
1293 UDP_INC_STATS_BH(UDP_MIB_INERRORS, proto == IPPROTO_UDPLITE); 1294 UDP_INC_STATS_BH(UDP_MIB_INERRORS, proto == IPPROTO_UDPLITE);
1294 kfree_skb(skb); 1295 kfree_skb(skb);
1295 return(0); 1296 return 0;
1296} 1297}
1297 1298
1298__inline__ int udp_rcv(struct sk_buff *skb) 1299__inline__ int udp_rcv(struct sk_buff *skb)
@@ -1319,13 +1320,13 @@ int udp_lib_setsockopt(struct sock *sk, int level, int optname,
1319 int val; 1320 int val;
1320 int err = 0; 1321 int err = 0;
1321 1322
1322 if(optlen<sizeof(int)) 1323 if (optlen<sizeof(int))
1323 return -EINVAL; 1324 return -EINVAL;
1324 1325
1325 if (get_user(val, (int __user *)optval)) 1326 if (get_user(val, (int __user *)optval))
1326 return -EFAULT; 1327 return -EFAULT;
1327 1328
1328 switch(optname) { 1329 switch (optname) {
1329 case UDP_CORK: 1330 case UDP_CORK:
1330 if (val != 0) { 1331 if (val != 0) {
1331 up->corkflag = 1; 1332 up->corkflag = 1;
@@ -1379,7 +1380,7 @@ int udp_lib_setsockopt(struct sock *sk, int level, int optname,
1379 default: 1380 default:
1380 err = -ENOPROTOOPT; 1381 err = -ENOPROTOOPT;
1381 break; 1382 break;
1382 }; 1383 }
1383 1384
1384 return err; 1385 return err;
1385} 1386}
@@ -1410,15 +1411,15 @@ int udp_lib_getsockopt(struct sock *sk, int level, int optname,
1410 struct udp_sock *up = udp_sk(sk); 1411 struct udp_sock *up = udp_sk(sk);
1411 int val, len; 1412 int val, len;
1412 1413
1413 if(get_user(len,optlen)) 1414 if (get_user(len,optlen))
1414 return -EFAULT; 1415 return -EFAULT;
1415 1416
1416 len = min_t(unsigned int, len, sizeof(int)); 1417 len = min_t(unsigned int, len, sizeof(int));
1417 1418
1418 if(len < 0) 1419 if (len < 0)
1419 return -EINVAL; 1420 return -EINVAL;
1420 1421
1421 switch(optname) { 1422 switch (optname) {
1422 case UDP_CORK: 1423 case UDP_CORK:
1423 val = up->corkflag; 1424 val = up->corkflag;
1424 break; 1425 break;
@@ -1439,11 +1440,11 @@ int udp_lib_getsockopt(struct sock *sk, int level, int optname,
1439 1440
1440 default: 1441 default:
1441 return -ENOPROTOOPT; 1442 return -ENOPROTOOPT;
1442 }; 1443 }
1443 1444
1444 if(put_user(len, optlen)) 1445 if (put_user(len, optlen))
1445 return -EFAULT; 1446 return -EFAULT;
1446 if(copy_to_user(optval, &val,len)) 1447 if (copy_to_user(optval, &val,len))
1447 return -EFAULT; 1448 return -EFAULT;
1448 return 0; 1449 return 0;
1449} 1450}
@@ -1575,7 +1576,7 @@ static struct sock *udp_get_idx(struct seq_file *seq, loff_t pos)
1575 struct sock *sk = udp_get_first(seq); 1576 struct sock *sk = udp_get_first(seq);
1576 1577
1577 if (sk) 1578 if (sk)
1578 while(pos && (sk = udp_get_next(seq, sk)) != NULL) 1579 while (pos && (sk = udp_get_next(seq, sk)) != NULL)
1579 --pos; 1580 --pos;
1580 return pos ? NULL : sk; 1581 return pos ? NULL : sk;
1581} 1582}