udp.c (c74a7469f97c0f40b46e82ee979f9fb1bb6e847c) | udp.c (8217ca653ec601246832d562207bc24bdf652d2f) |
---|---|
1/* 2 * UDP over IPv6 3 * Linux INET6 implementation 4 * 5 * Authors: 6 * Pedro Roque <roque@di.fc.ul.pt> 7 * 8 * Based on linux/ipv4/udp.c --- 221 unchanged lines hidden (view full) --- 230 if (hslot->count < hslot2->count) 231 goto begin; 232 233 result = udp6_lib_lookup2(net, saddr, sport, 234 daddr, hnum, dif, sdif, 235 exact_dif, hslot2, 236 skb); 237 } | 1/* 2 * UDP over IPv6 3 * Linux INET6 implementation 4 * 5 * Authors: 6 * Pedro Roque <roque@di.fc.ul.pt> 7 * 8 * Based on linux/ipv4/udp.c --- 221 unchanged lines hidden (view full) --- 230 if (hslot->count < hslot2->count) 231 goto begin; 232 233 result = udp6_lib_lookup2(net, saddr, sport, 234 daddr, hnum, dif, sdif, 235 exact_dif, hslot2, 236 skb); 237 } |
238 if (unlikely(IS_ERR(result))) 239 return NULL; |
|
238 return result; 239 } 240begin: 241 result = NULL; 242 badness = -1; 243 sk_for_each_rcu(sk, &hslot->head) { 244 score = compute_score(sk, net, saddr, sport, daddr, hnum, dif, 245 sdif, exact_dif); 246 if (score > badness) { 247 if (sk->sk_reuseport) { 248 hash = udp6_ehashfn(net, daddr, hnum, 249 saddr, sport); 250 result = reuseport_select_sock(sk, hash, skb, 251 sizeof(struct udphdr)); | 240 return result; 241 } 242begin: 243 result = NULL; 244 badness = -1; 245 sk_for_each_rcu(sk, &hslot->head) { 246 score = compute_score(sk, net, saddr, sport, daddr, hnum, dif, 247 sdif, exact_dif); 248 if (score > badness) { 249 if (sk->sk_reuseport) { 250 hash = udp6_ehashfn(net, daddr, hnum, 251 saddr, sport); 252 result = reuseport_select_sock(sk, hash, skb, 253 sizeof(struct udphdr)); |
254 if (unlikely(IS_ERR(result))) 255 return NULL; |
|
252 if (result) 253 return result; 254 } 255 result = sk; 256 badness = score; 257 } 258 } 259 return result; --- 876 unchanged lines hidden (view full) --- 1136 struct ipcm6_cookie ipc6; 1137 int addr_len = msg->msg_namelen; 1138 bool connected = false; 1139 int ulen = len; 1140 int corkreq = up->corkflag || msg->msg_flags&MSG_MORE; 1141 int err; 1142 int is_udplite = IS_UDPLITE(sk); 1143 int (*getfrag)(void *, char *, int, int, int, struct sk_buff *); | 256 if (result) 257 return result; 258 } 259 result = sk; 260 badness = score; 261 } 262 } 263 return result; --- 876 unchanged lines hidden (view full) --- 1140 struct ipcm6_cookie ipc6; 1141 int addr_len = msg->msg_namelen; 1142 bool connected = false; 1143 int ulen = len; 1144 int corkreq = up->corkflag || msg->msg_flags&MSG_MORE; 1145 int err; 1146 int is_udplite = IS_UDPLITE(sk); 1147 int (*getfrag)(void *, char *, int, int, int, struct sk_buff *); |
1144 struct sockcm_cookie sockc; | |
1145 | 1148 |
1146 ipc6.hlimit = -1; 1147 ipc6.tclass = -1; 1148 ipc6.dontfrag = -1; | 1149 ipcm6_init(&ipc6); |
1149 ipc6.gso_size = up->gso_size; | 1150 ipc6.gso_size = up->gso_size; |
1150 sockc.tsflags = sk->sk_tsflags; | 1151 ipc6.sockc.tsflags = sk->sk_tsflags; |
1151 1152 /* destination address check */ 1153 if (sin6) { 1154 if (addr_len < offsetof(struct sockaddr, sa_data)) 1155 return -EINVAL; 1156 1157 switch (sin6->sin6_family) { 1158 case AF_INET6: --- 118 unchanged lines hidden (view full) --- 1277 opt = &opt_space; 1278 memset(opt, 0, sizeof(struct ipv6_txoptions)); 1279 opt->tot_len = sizeof(*opt); 1280 ipc6.opt = opt; 1281 1282 err = udp_cmsg_send(sk, msg, &ipc6.gso_size); 1283 if (err > 0) 1284 err = ip6_datagram_send_ctl(sock_net(sk), sk, msg, &fl6, | 1152 1153 /* destination address check */ 1154 if (sin6) { 1155 if (addr_len < offsetof(struct sockaddr, sa_data)) 1156 return -EINVAL; 1157 1158 switch (sin6->sin6_family) { 1159 case AF_INET6: --- 118 unchanged lines hidden (view full) --- 1278 opt = &opt_space; 1279 memset(opt, 0, sizeof(struct ipv6_txoptions)); 1280 opt->tot_len = sizeof(*opt); 1281 ipc6.opt = opt; 1282 1283 err = udp_cmsg_send(sk, msg, &ipc6.gso_size); 1284 if (err > 0) 1285 err = ip6_datagram_send_ctl(sock_net(sk), sk, msg, &fl6, |
1285 &ipc6, &sockc); | 1286 &ipc6); |
1286 if (err < 0) { 1287 fl6_sock_release(flowlabel); 1288 return err; 1289 } 1290 if ((fl6.flowlabel&IPV6_FLOWLABEL_MASK) && !flowlabel) { 1291 flowlabel = fl6_sock_lookup(sk, fl6.flowlabel); 1292 if (!flowlabel) 1293 return -EINVAL; --- 77 unchanged lines hidden (view full) --- 1371 /* Lockless fast path for the non-corking case */ 1372 if (!corkreq) { 1373 struct inet_cork_full cork; 1374 struct sk_buff *skb; 1375 1376 skb = ip6_make_skb(sk, getfrag, msg, ulen, 1377 sizeof(struct udphdr), &ipc6, 1378 &fl6, (struct rt6_info *)dst, | 1287 if (err < 0) { 1288 fl6_sock_release(flowlabel); 1289 return err; 1290 } 1291 if ((fl6.flowlabel&IPV6_FLOWLABEL_MASK) && !flowlabel) { 1292 flowlabel = fl6_sock_lookup(sk, fl6.flowlabel); 1293 if (!flowlabel) 1294 return -EINVAL; --- 77 unchanged lines hidden (view full) --- 1372 /* Lockless fast path for the non-corking case */ 1373 if (!corkreq) { 1374 struct inet_cork_full cork; 1375 struct sk_buff *skb; 1376 1377 skb = ip6_make_skb(sk, getfrag, msg, ulen, 1378 sizeof(struct udphdr), &ipc6, 1379 &fl6, (struct rt6_info *)dst, |
1379 msg->msg_flags, &cork, &sockc); | 1380 msg->msg_flags, &cork); |
1380 err = PTR_ERR(skb); 1381 if (!IS_ERR_OR_NULL(skb)) 1382 err = udp_v6_send_skb(skb, &fl6, &cork.base); 1383 goto out; 1384 } 1385 1386 lock_sock(sk); 1387 if (unlikely(up->pending)) { --- 9 unchanged lines hidden (view full) --- 1397 up->pending = AF_INET6; 1398 1399do_append_data: 1400 if (ipc6.dontfrag < 0) 1401 ipc6.dontfrag = np->dontfrag; 1402 up->len += ulen; 1403 err = ip6_append_data(sk, getfrag, msg, ulen, sizeof(struct udphdr), 1404 &ipc6, &fl6, (struct rt6_info *)dst, | 1381 err = PTR_ERR(skb); 1382 if (!IS_ERR_OR_NULL(skb)) 1383 err = udp_v6_send_skb(skb, &fl6, &cork.base); 1384 goto out; 1385 } 1386 1387 lock_sock(sk); 1388 if (unlikely(up->pending)) { --- 9 unchanged lines hidden (view full) --- 1398 up->pending = AF_INET6; 1399 1400do_append_data: 1401 if (ipc6.dontfrag < 0) 1402 ipc6.dontfrag = np->dontfrag; 1403 up->len += ulen; 1404 err = ip6_append_data(sk, getfrag, msg, ulen, sizeof(struct udphdr), 1405 &ipc6, &fl6, (struct rt6_info *)dst, |
1405 corkreq ? msg->msg_flags|MSG_MORE : msg->msg_flags, &sockc); | 1406 corkreq ? msg->msg_flags|MSG_MORE : msg->msg_flags); |
1406 if (err) 1407 udp_v6_flush_pending_frames(sk); 1408 else if (!corkreq) 1409 err = udp_v6_push_pending_frames(sk); 1410 else if (unlikely(skb_queue_empty(&sk->sk_write_queue))) 1411 up->pending = 0; 1412 1413 if (err > 0) --- 211 unchanged lines hidden --- | 1407 if (err) 1408 udp_v6_flush_pending_frames(sk); 1409 else if (!corkreq) 1410 err = udp_v6_push_pending_frames(sk); 1411 else if (unlikely(skb_queue_empty(&sk->sk_write_queue))) 1412 up->pending = 0; 1413 1414 if (err > 0) --- 211 unchanged lines hidden --- |