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 ---