Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/net/ipv6/raw.c
15109 views
1
/*
2
* RAW sockets for IPv6
3
* Linux INET6 implementation
4
*
5
* Authors:
6
* Pedro Roque <[email protected]>
7
*
8
* Adapted from linux/net/ipv4/raw.c
9
*
10
* Fixes:
11
* Hideaki YOSHIFUJI : sin6_scope_id support
12
* YOSHIFUJI,H.@USAGI : raw checksum (RFC2292(bis) compliance)
13
* Kazunori MIYAZAWA @USAGI: change process style to use ip6_append_data
14
*
15
* This program is free software; you can redistribute it and/or
16
* modify it under the terms of the GNU General Public License
17
* as published by the Free Software Foundation; either version
18
* 2 of the License, or (at your option) any later version.
19
*/
20
21
#include <linux/errno.h>
22
#include <linux/types.h>
23
#include <linux/socket.h>
24
#include <linux/slab.h>
25
#include <linux/sockios.h>
26
#include <linux/net.h>
27
#include <linux/in6.h>
28
#include <linux/netdevice.h>
29
#include <linux/if_arp.h>
30
#include <linux/icmpv6.h>
31
#include <linux/netfilter.h>
32
#include <linux/netfilter_ipv6.h>
33
#include <linux/skbuff.h>
34
#include <linux/compat.h>
35
#include <asm/uaccess.h>
36
#include <asm/ioctls.h>
37
38
#include <net/net_namespace.h>
39
#include <net/ip.h>
40
#include <net/sock.h>
41
#include <net/snmp.h>
42
43
#include <net/ipv6.h>
44
#include <net/ndisc.h>
45
#include <net/protocol.h>
46
#include <net/ip6_route.h>
47
#include <net/ip6_checksum.h>
48
#include <net/addrconf.h>
49
#include <net/transp_v6.h>
50
#include <net/udp.h>
51
#include <net/inet_common.h>
52
#include <net/tcp_states.h>
53
#if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE)
54
#include <net/mip6.h>
55
#endif
56
#include <linux/mroute6.h>
57
58
#include <net/raw.h>
59
#include <net/rawv6.h>
60
#include <net/xfrm.h>
61
62
#include <linux/proc_fs.h>
63
#include <linux/seq_file.h>
64
65
static struct raw_hashinfo raw_v6_hashinfo = {
66
.lock = __RW_LOCK_UNLOCKED(raw_v6_hashinfo.lock),
67
};
68
69
static struct sock *__raw_v6_lookup(struct net *net, struct sock *sk,
70
unsigned short num, const struct in6_addr *loc_addr,
71
const struct in6_addr *rmt_addr, int dif)
72
{
73
struct hlist_node *node;
74
int is_multicast = ipv6_addr_is_multicast(loc_addr);
75
76
sk_for_each_from(sk, node)
77
if (inet_sk(sk)->inet_num == num) {
78
struct ipv6_pinfo *np = inet6_sk(sk);
79
80
if (!net_eq(sock_net(sk), net))
81
continue;
82
83
if (!ipv6_addr_any(&np->daddr) &&
84
!ipv6_addr_equal(&np->daddr, rmt_addr))
85
continue;
86
87
if (sk->sk_bound_dev_if && sk->sk_bound_dev_if != dif)
88
continue;
89
90
if (!ipv6_addr_any(&np->rcv_saddr)) {
91
if (ipv6_addr_equal(&np->rcv_saddr, loc_addr))
92
goto found;
93
if (is_multicast &&
94
inet6_mc_check(sk, loc_addr, rmt_addr))
95
goto found;
96
continue;
97
}
98
goto found;
99
}
100
sk = NULL;
101
found:
102
return sk;
103
}
104
105
/*
106
* 0 - deliver
107
* 1 - block
108
*/
109
static __inline__ int icmpv6_filter(struct sock *sk, struct sk_buff *skb)
110
{
111
struct icmp6hdr *icmph;
112
struct raw6_sock *rp = raw6_sk(sk);
113
114
if (pskb_may_pull(skb, sizeof(struct icmp6hdr))) {
115
__u32 *data = &rp->filter.data[0];
116
int bit_nr;
117
118
icmph = (struct icmp6hdr *) skb->data;
119
bit_nr = icmph->icmp6_type;
120
121
return (data[bit_nr >> 5] & (1 << (bit_nr & 31))) != 0;
122
}
123
return 0;
124
}
125
126
#if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE)
127
typedef int mh_filter_t(struct sock *sock, struct sk_buff *skb);
128
129
static mh_filter_t __rcu *mh_filter __read_mostly;
130
131
int rawv6_mh_filter_register(mh_filter_t filter)
132
{
133
rcu_assign_pointer(mh_filter, filter);
134
return 0;
135
}
136
EXPORT_SYMBOL(rawv6_mh_filter_register);
137
138
int rawv6_mh_filter_unregister(mh_filter_t filter)
139
{
140
rcu_assign_pointer(mh_filter, NULL);
141
synchronize_rcu();
142
return 0;
143
}
144
EXPORT_SYMBOL(rawv6_mh_filter_unregister);
145
146
#endif
147
148
/*
149
* demultiplex raw sockets.
150
* (should consider queueing the skb in the sock receive_queue
151
* without calling rawv6.c)
152
*
153
* Caller owns SKB so we must make clones.
154
*/
155
static int ipv6_raw_deliver(struct sk_buff *skb, int nexthdr)
156
{
157
const struct in6_addr *saddr;
158
const struct in6_addr *daddr;
159
struct sock *sk;
160
int delivered = 0;
161
__u8 hash;
162
struct net *net;
163
164
saddr = &ipv6_hdr(skb)->saddr;
165
daddr = saddr + 1;
166
167
hash = nexthdr & (MAX_INET_PROTOS - 1);
168
169
read_lock(&raw_v6_hashinfo.lock);
170
sk = sk_head(&raw_v6_hashinfo.ht[hash]);
171
172
if (sk == NULL)
173
goto out;
174
175
net = dev_net(skb->dev);
176
sk = __raw_v6_lookup(net, sk, nexthdr, daddr, saddr, IP6CB(skb)->iif);
177
178
while (sk) {
179
int filtered;
180
181
delivered = 1;
182
switch (nexthdr) {
183
case IPPROTO_ICMPV6:
184
filtered = icmpv6_filter(sk, skb);
185
break;
186
187
#if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE)
188
case IPPROTO_MH:
189
{
190
/* XXX: To validate MH only once for each packet,
191
* this is placed here. It should be after checking
192
* xfrm policy, however it doesn't. The checking xfrm
193
* policy is placed in rawv6_rcv() because it is
194
* required for each socket.
195
*/
196
mh_filter_t *filter;
197
198
filter = rcu_dereference(mh_filter);
199
filtered = filter ? (*filter)(sk, skb) : 0;
200
break;
201
}
202
#endif
203
default:
204
filtered = 0;
205
break;
206
}
207
208
if (filtered < 0)
209
break;
210
if (filtered == 0) {
211
struct sk_buff *clone = skb_clone(skb, GFP_ATOMIC);
212
213
/* Not releasing hash table! */
214
if (clone) {
215
nf_reset(clone);
216
rawv6_rcv(sk, clone);
217
}
218
}
219
sk = __raw_v6_lookup(net, sk_next(sk), nexthdr, daddr, saddr,
220
IP6CB(skb)->iif);
221
}
222
out:
223
read_unlock(&raw_v6_hashinfo.lock);
224
return delivered;
225
}
226
227
int raw6_local_deliver(struct sk_buff *skb, int nexthdr)
228
{
229
struct sock *raw_sk;
230
231
raw_sk = sk_head(&raw_v6_hashinfo.ht[nexthdr & (MAX_INET_PROTOS - 1)]);
232
if (raw_sk && !ipv6_raw_deliver(skb, nexthdr))
233
raw_sk = NULL;
234
235
return raw_sk != NULL;
236
}
237
238
/* This cleans up af_inet6 a bit. -DaveM */
239
static int rawv6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
240
{
241
struct inet_sock *inet = inet_sk(sk);
242
struct ipv6_pinfo *np = inet6_sk(sk);
243
struct sockaddr_in6 *addr = (struct sockaddr_in6 *) uaddr;
244
__be32 v4addr = 0;
245
int addr_type;
246
int err;
247
248
if (addr_len < SIN6_LEN_RFC2133)
249
return -EINVAL;
250
addr_type = ipv6_addr_type(&addr->sin6_addr);
251
252
/* Raw sockets are IPv6 only */
253
if (addr_type == IPV6_ADDR_MAPPED)
254
return -EADDRNOTAVAIL;
255
256
lock_sock(sk);
257
258
err = -EINVAL;
259
if (sk->sk_state != TCP_CLOSE)
260
goto out;
261
262
rcu_read_lock();
263
/* Check if the address belongs to the host. */
264
if (addr_type != IPV6_ADDR_ANY) {
265
struct net_device *dev = NULL;
266
267
if (addr_type & IPV6_ADDR_LINKLOCAL) {
268
if (addr_len >= sizeof(struct sockaddr_in6) &&
269
addr->sin6_scope_id) {
270
/* Override any existing binding, if another
271
* one is supplied by user.
272
*/
273
sk->sk_bound_dev_if = addr->sin6_scope_id;
274
}
275
276
/* Binding to link-local address requires an interface */
277
if (!sk->sk_bound_dev_if)
278
goto out_unlock;
279
280
err = -ENODEV;
281
dev = dev_get_by_index_rcu(sock_net(sk),
282
sk->sk_bound_dev_if);
283
if (!dev)
284
goto out_unlock;
285
}
286
287
/* ipv4 addr of the socket is invalid. Only the
288
* unspecified and mapped address have a v4 equivalent.
289
*/
290
v4addr = LOOPBACK4_IPV6;
291
if (!(addr_type & IPV6_ADDR_MULTICAST)) {
292
err = -EADDRNOTAVAIL;
293
if (!ipv6_chk_addr(sock_net(sk), &addr->sin6_addr,
294
dev, 0)) {
295
goto out_unlock;
296
}
297
}
298
}
299
300
inet->inet_rcv_saddr = inet->inet_saddr = v4addr;
301
ipv6_addr_copy(&np->rcv_saddr, &addr->sin6_addr);
302
if (!(addr_type & IPV6_ADDR_MULTICAST))
303
ipv6_addr_copy(&np->saddr, &addr->sin6_addr);
304
err = 0;
305
out_unlock:
306
rcu_read_unlock();
307
out:
308
release_sock(sk);
309
return err;
310
}
311
312
static void rawv6_err(struct sock *sk, struct sk_buff *skb,
313
struct inet6_skb_parm *opt,
314
u8 type, u8 code, int offset, __be32 info)
315
{
316
struct inet_sock *inet = inet_sk(sk);
317
struct ipv6_pinfo *np = inet6_sk(sk);
318
int err;
319
int harderr;
320
321
/* Report error on raw socket, if:
322
1. User requested recverr.
323
2. Socket is connected (otherwise the error indication
324
is useless without recverr and error is hard.
325
*/
326
if (!np->recverr && sk->sk_state != TCP_ESTABLISHED)
327
return;
328
329
harderr = icmpv6_err_convert(type, code, &err);
330
if (type == ICMPV6_PKT_TOOBIG)
331
harderr = (np->pmtudisc == IPV6_PMTUDISC_DO);
332
333
if (np->recverr) {
334
u8 *payload = skb->data;
335
if (!inet->hdrincl)
336
payload += offset;
337
ipv6_icmp_error(sk, skb, err, 0, ntohl(info), payload);
338
}
339
340
if (np->recverr || harderr) {
341
sk->sk_err = err;
342
sk->sk_error_report(sk);
343
}
344
}
345
346
void raw6_icmp_error(struct sk_buff *skb, int nexthdr,
347
u8 type, u8 code, int inner_offset, __be32 info)
348
{
349
struct sock *sk;
350
int hash;
351
const struct in6_addr *saddr, *daddr;
352
struct net *net;
353
354
hash = nexthdr & (RAW_HTABLE_SIZE - 1);
355
356
read_lock(&raw_v6_hashinfo.lock);
357
sk = sk_head(&raw_v6_hashinfo.ht[hash]);
358
if (sk != NULL) {
359
/* Note: ipv6_hdr(skb) != skb->data */
360
const struct ipv6hdr *ip6h = (const struct ipv6hdr *)skb->data;
361
saddr = &ip6h->saddr;
362
daddr = &ip6h->daddr;
363
net = dev_net(skb->dev);
364
365
while ((sk = __raw_v6_lookup(net, sk, nexthdr, saddr, daddr,
366
IP6CB(skb)->iif))) {
367
rawv6_err(sk, skb, NULL, type, code,
368
inner_offset, info);
369
sk = sk_next(sk);
370
}
371
}
372
read_unlock(&raw_v6_hashinfo.lock);
373
}
374
375
static inline int rawv6_rcv_skb(struct sock * sk, struct sk_buff * skb)
376
{
377
if ((raw6_sk(sk)->checksum || rcu_dereference_raw(sk->sk_filter)) &&
378
skb_checksum_complete(skb)) {
379
atomic_inc(&sk->sk_drops);
380
kfree_skb(skb);
381
return NET_RX_DROP;
382
}
383
384
/* Charge it to the socket. */
385
if (ip_queue_rcv_skb(sk, skb) < 0) {
386
kfree_skb(skb);
387
return NET_RX_DROP;
388
}
389
390
return 0;
391
}
392
393
/*
394
* This is next to useless...
395
* if we demultiplex in network layer we don't need the extra call
396
* just to queue the skb...
397
* maybe we could have the network decide upon a hint if it
398
* should call raw_rcv for demultiplexing
399
*/
400
int rawv6_rcv(struct sock *sk, struct sk_buff *skb)
401
{
402
struct inet_sock *inet = inet_sk(sk);
403
struct raw6_sock *rp = raw6_sk(sk);
404
405
if (!xfrm6_policy_check(sk, XFRM_POLICY_IN, skb)) {
406
atomic_inc(&sk->sk_drops);
407
kfree_skb(skb);
408
return NET_RX_DROP;
409
}
410
411
if (!rp->checksum)
412
skb->ip_summed = CHECKSUM_UNNECESSARY;
413
414
if (skb->ip_summed == CHECKSUM_COMPLETE) {
415
skb_postpull_rcsum(skb, skb_network_header(skb),
416
skb_network_header_len(skb));
417
if (!csum_ipv6_magic(&ipv6_hdr(skb)->saddr,
418
&ipv6_hdr(skb)->daddr,
419
skb->len, inet->inet_num, skb->csum))
420
skb->ip_summed = CHECKSUM_UNNECESSARY;
421
}
422
if (!skb_csum_unnecessary(skb))
423
skb->csum = ~csum_unfold(csum_ipv6_magic(&ipv6_hdr(skb)->saddr,
424
&ipv6_hdr(skb)->daddr,
425
skb->len,
426
inet->inet_num, 0));
427
428
if (inet->hdrincl) {
429
if (skb_checksum_complete(skb)) {
430
atomic_inc(&sk->sk_drops);
431
kfree_skb(skb);
432
return NET_RX_DROP;
433
}
434
}
435
436
rawv6_rcv_skb(sk, skb);
437
return 0;
438
}
439
440
441
/*
442
* This should be easy, if there is something there
443
* we return it, otherwise we block.
444
*/
445
446
static int rawv6_recvmsg(struct kiocb *iocb, struct sock *sk,
447
struct msghdr *msg, size_t len,
448
int noblock, int flags, int *addr_len)
449
{
450
struct ipv6_pinfo *np = inet6_sk(sk);
451
struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)msg->msg_name;
452
struct sk_buff *skb;
453
size_t copied;
454
int err;
455
456
if (flags & MSG_OOB)
457
return -EOPNOTSUPP;
458
459
if (addr_len)
460
*addr_len=sizeof(*sin6);
461
462
if (flags & MSG_ERRQUEUE)
463
return ipv6_recv_error(sk, msg, len);
464
465
if (np->rxpmtu && np->rxopt.bits.rxpmtu)
466
return ipv6_recv_rxpmtu(sk, msg, len);
467
468
skb = skb_recv_datagram(sk, flags, noblock, &err);
469
if (!skb)
470
goto out;
471
472
copied = skb->len;
473
if (copied > len) {
474
copied = len;
475
msg->msg_flags |= MSG_TRUNC;
476
}
477
478
if (skb_csum_unnecessary(skb)) {
479
err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
480
} else if (msg->msg_flags&MSG_TRUNC) {
481
if (__skb_checksum_complete(skb))
482
goto csum_copy_err;
483
err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
484
} else {
485
err = skb_copy_and_csum_datagram_iovec(skb, 0, msg->msg_iov);
486
if (err == -EINVAL)
487
goto csum_copy_err;
488
}
489
if (err)
490
goto out_free;
491
492
/* Copy the address. */
493
if (sin6) {
494
sin6->sin6_family = AF_INET6;
495
sin6->sin6_port = 0;
496
ipv6_addr_copy(&sin6->sin6_addr, &ipv6_hdr(skb)->saddr);
497
sin6->sin6_flowinfo = 0;
498
sin6->sin6_scope_id = 0;
499
if (ipv6_addr_type(&sin6->sin6_addr) & IPV6_ADDR_LINKLOCAL)
500
sin6->sin6_scope_id = IP6CB(skb)->iif;
501
}
502
503
sock_recv_ts_and_drops(msg, sk, skb);
504
505
if (np->rxopt.all)
506
datagram_recv_ctl(sk, msg, skb);
507
508
err = copied;
509
if (flags & MSG_TRUNC)
510
err = skb->len;
511
512
out_free:
513
skb_free_datagram(sk, skb);
514
out:
515
return err;
516
517
csum_copy_err:
518
skb_kill_datagram(sk, skb, flags);
519
520
/* Error for blocking case is chosen to masquerade
521
as some normal condition.
522
*/
523
err = (flags&MSG_DONTWAIT) ? -EAGAIN : -EHOSTUNREACH;
524
goto out;
525
}
526
527
static int rawv6_push_pending_frames(struct sock *sk, struct flowi6 *fl6,
528
struct raw6_sock *rp)
529
{
530
struct sk_buff *skb;
531
int err = 0;
532
int offset;
533
int len;
534
int total_len;
535
__wsum tmp_csum;
536
__sum16 csum;
537
538
if (!rp->checksum)
539
goto send;
540
541
if ((skb = skb_peek(&sk->sk_write_queue)) == NULL)
542
goto out;
543
544
offset = rp->offset;
545
total_len = inet_sk(sk)->cork.base.length - (skb_network_header(skb) -
546
skb->data);
547
if (offset >= total_len - 1) {
548
err = -EINVAL;
549
ip6_flush_pending_frames(sk);
550
goto out;
551
}
552
553
/* should be check HW csum miyazawa */
554
if (skb_queue_len(&sk->sk_write_queue) == 1) {
555
/*
556
* Only one fragment on the socket.
557
*/
558
tmp_csum = skb->csum;
559
} else {
560
struct sk_buff *csum_skb = NULL;
561
tmp_csum = 0;
562
563
skb_queue_walk(&sk->sk_write_queue, skb) {
564
tmp_csum = csum_add(tmp_csum, skb->csum);
565
566
if (csum_skb)
567
continue;
568
569
len = skb->len - skb_transport_offset(skb);
570
if (offset >= len) {
571
offset -= len;
572
continue;
573
}
574
575
csum_skb = skb;
576
}
577
578
skb = csum_skb;
579
}
580
581
offset += skb_transport_offset(skb);
582
if (skb_copy_bits(skb, offset, &csum, 2))
583
BUG();
584
585
/* in case cksum was not initialized */
586
if (unlikely(csum))
587
tmp_csum = csum_sub(tmp_csum, csum_unfold(csum));
588
589
csum = csum_ipv6_magic(&fl6->saddr, &fl6->daddr,
590
total_len, fl6->flowi6_proto, tmp_csum);
591
592
if (csum == 0 && fl6->flowi6_proto == IPPROTO_UDP)
593
csum = CSUM_MANGLED_0;
594
595
if (skb_store_bits(skb, offset, &csum, 2))
596
BUG();
597
598
send:
599
err = ip6_push_pending_frames(sk);
600
out:
601
return err;
602
}
603
604
static int rawv6_send_hdrinc(struct sock *sk, void *from, int length,
605
struct flowi6 *fl6, struct dst_entry **dstp,
606
unsigned int flags)
607
{
608
struct ipv6_pinfo *np = inet6_sk(sk);
609
struct ipv6hdr *iph;
610
struct sk_buff *skb;
611
int err;
612
struct rt6_info *rt = (struct rt6_info *)*dstp;
613
614
if (length > rt->dst.dev->mtu) {
615
ipv6_local_error(sk, EMSGSIZE, fl6, rt->dst.dev->mtu);
616
return -EMSGSIZE;
617
}
618
if (flags&MSG_PROBE)
619
goto out;
620
621
skb = sock_alloc_send_skb(sk,
622
length + LL_ALLOCATED_SPACE(rt->dst.dev) + 15,
623
flags & MSG_DONTWAIT, &err);
624
if (skb == NULL)
625
goto error;
626
skb_reserve(skb, LL_RESERVED_SPACE(rt->dst.dev));
627
628
skb->priority = sk->sk_priority;
629
skb->mark = sk->sk_mark;
630
skb_dst_set(skb, &rt->dst);
631
*dstp = NULL;
632
633
skb_put(skb, length);
634
skb_reset_network_header(skb);
635
iph = ipv6_hdr(skb);
636
637
skb->ip_summed = CHECKSUM_NONE;
638
639
skb->transport_header = skb->network_header;
640
err = memcpy_fromiovecend((void *)iph, from, 0, length);
641
if (err)
642
goto error_fault;
643
644
IP6_UPD_PO_STATS(sock_net(sk), rt->rt6i_idev, IPSTATS_MIB_OUT, skb->len);
645
err = NF_HOOK(NFPROTO_IPV6, NF_INET_LOCAL_OUT, skb, NULL,
646
rt->dst.dev, dst_output);
647
if (err > 0)
648
err = net_xmit_errno(err);
649
if (err)
650
goto error;
651
out:
652
return 0;
653
654
error_fault:
655
err = -EFAULT;
656
kfree_skb(skb);
657
error:
658
IP6_INC_STATS(sock_net(sk), rt->rt6i_idev, IPSTATS_MIB_OUTDISCARDS);
659
if (err == -ENOBUFS && !np->recverr)
660
err = 0;
661
return err;
662
}
663
664
static int rawv6_probe_proto_opt(struct flowi6 *fl6, struct msghdr *msg)
665
{
666
struct iovec *iov;
667
u8 __user *type = NULL;
668
u8 __user *code = NULL;
669
u8 len = 0;
670
int probed = 0;
671
int i;
672
673
if (!msg->msg_iov)
674
return 0;
675
676
for (i = 0; i < msg->msg_iovlen; i++) {
677
iov = &msg->msg_iov[i];
678
if (!iov)
679
continue;
680
681
switch (fl6->flowi6_proto) {
682
case IPPROTO_ICMPV6:
683
/* check if one-byte field is readable or not. */
684
if (iov->iov_base && iov->iov_len < 1)
685
break;
686
687
if (!type) {
688
type = iov->iov_base;
689
/* check if code field is readable or not. */
690
if (iov->iov_len > 1)
691
code = type + 1;
692
} else if (!code)
693
code = iov->iov_base;
694
695
if (type && code) {
696
if (get_user(fl6->fl6_icmp_type, type) ||
697
get_user(fl6->fl6_icmp_code, code))
698
return -EFAULT;
699
probed = 1;
700
}
701
break;
702
case IPPROTO_MH:
703
if (iov->iov_base && iov->iov_len < 1)
704
break;
705
/* check if type field is readable or not. */
706
if (iov->iov_len > 2 - len) {
707
u8 __user *p = iov->iov_base;
708
if (get_user(fl6->fl6_mh_type, &p[2 - len]))
709
return -EFAULT;
710
probed = 1;
711
} else
712
len += iov->iov_len;
713
714
break;
715
default:
716
probed = 1;
717
break;
718
}
719
if (probed)
720
break;
721
}
722
return 0;
723
}
724
725
static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk,
726
struct msghdr *msg, size_t len)
727
{
728
struct ipv6_txoptions opt_space;
729
struct sockaddr_in6 * sin6 = (struct sockaddr_in6 *) msg->msg_name;
730
struct in6_addr *daddr, *final_p, final;
731
struct inet_sock *inet = inet_sk(sk);
732
struct ipv6_pinfo *np = inet6_sk(sk);
733
struct raw6_sock *rp = raw6_sk(sk);
734
struct ipv6_txoptions *opt = NULL;
735
struct ip6_flowlabel *flowlabel = NULL;
736
struct dst_entry *dst = NULL;
737
struct flowi6 fl6;
738
int addr_len = msg->msg_namelen;
739
int hlimit = -1;
740
int tclass = -1;
741
int dontfrag = -1;
742
u16 proto;
743
int err;
744
745
/* Rough check on arithmetic overflow,
746
better check is made in ip6_append_data().
747
*/
748
if (len > INT_MAX)
749
return -EMSGSIZE;
750
751
/* Mirror BSD error message compatibility */
752
if (msg->msg_flags & MSG_OOB)
753
return -EOPNOTSUPP;
754
755
/*
756
* Get and verify the address.
757
*/
758
memset(&fl6, 0, sizeof(fl6));
759
760
fl6.flowi6_mark = sk->sk_mark;
761
762
if (sin6) {
763
if (addr_len < SIN6_LEN_RFC2133)
764
return -EINVAL;
765
766
if (sin6->sin6_family && sin6->sin6_family != AF_INET6)
767
return -EAFNOSUPPORT;
768
769
/* port is the proto value [0..255] carried in nexthdr */
770
proto = ntohs(sin6->sin6_port);
771
772
if (!proto)
773
proto = inet->inet_num;
774
else if (proto != inet->inet_num)
775
return -EINVAL;
776
777
if (proto > 255)
778
return -EINVAL;
779
780
daddr = &sin6->sin6_addr;
781
if (np->sndflow) {
782
fl6.flowlabel = sin6->sin6_flowinfo&IPV6_FLOWINFO_MASK;
783
if (fl6.flowlabel&IPV6_FLOWLABEL_MASK) {
784
flowlabel = fl6_sock_lookup(sk, fl6.flowlabel);
785
if (flowlabel == NULL)
786
return -EINVAL;
787
daddr = &flowlabel->dst;
788
}
789
}
790
791
/*
792
* Otherwise it will be difficult to maintain
793
* sk->sk_dst_cache.
794
*/
795
if (sk->sk_state == TCP_ESTABLISHED &&
796
ipv6_addr_equal(daddr, &np->daddr))
797
daddr = &np->daddr;
798
799
if (addr_len >= sizeof(struct sockaddr_in6) &&
800
sin6->sin6_scope_id &&
801
ipv6_addr_type(daddr)&IPV6_ADDR_LINKLOCAL)
802
fl6.flowi6_oif = sin6->sin6_scope_id;
803
} else {
804
if (sk->sk_state != TCP_ESTABLISHED)
805
return -EDESTADDRREQ;
806
807
proto = inet->inet_num;
808
daddr = &np->daddr;
809
fl6.flowlabel = np->flow_label;
810
}
811
812
if (fl6.flowi6_oif == 0)
813
fl6.flowi6_oif = sk->sk_bound_dev_if;
814
815
if (msg->msg_controllen) {
816
opt = &opt_space;
817
memset(opt, 0, sizeof(struct ipv6_txoptions));
818
opt->tot_len = sizeof(struct ipv6_txoptions);
819
820
err = datagram_send_ctl(sock_net(sk), msg, &fl6, opt, &hlimit,
821
&tclass, &dontfrag);
822
if (err < 0) {
823
fl6_sock_release(flowlabel);
824
return err;
825
}
826
if ((fl6.flowlabel&IPV6_FLOWLABEL_MASK) && !flowlabel) {
827
flowlabel = fl6_sock_lookup(sk, fl6.flowlabel);
828
if (flowlabel == NULL)
829
return -EINVAL;
830
}
831
if (!(opt->opt_nflen|opt->opt_flen))
832
opt = NULL;
833
}
834
if (opt == NULL)
835
opt = np->opt;
836
if (flowlabel)
837
opt = fl6_merge_options(&opt_space, flowlabel, opt);
838
opt = ipv6_fixup_options(&opt_space, opt);
839
840
fl6.flowi6_proto = proto;
841
err = rawv6_probe_proto_opt(&fl6, msg);
842
if (err)
843
goto out;
844
845
if (!ipv6_addr_any(daddr))
846
ipv6_addr_copy(&fl6.daddr, daddr);
847
else
848
fl6.daddr.s6_addr[15] = 0x1; /* :: means loopback (BSD'ism) */
849
if (ipv6_addr_any(&fl6.saddr) && !ipv6_addr_any(&np->saddr))
850
ipv6_addr_copy(&fl6.saddr, &np->saddr);
851
852
final_p = fl6_update_dst(&fl6, opt, &final);
853
854
if (!fl6.flowi6_oif && ipv6_addr_is_multicast(&fl6.daddr))
855
fl6.flowi6_oif = np->mcast_oif;
856
security_sk_classify_flow(sk, flowi6_to_flowi(&fl6));
857
858
dst = ip6_dst_lookup_flow(sk, &fl6, final_p, true);
859
if (IS_ERR(dst)) {
860
err = PTR_ERR(dst);
861
goto out;
862
}
863
if (hlimit < 0) {
864
if (ipv6_addr_is_multicast(&fl6.daddr))
865
hlimit = np->mcast_hops;
866
else
867
hlimit = np->hop_limit;
868
if (hlimit < 0)
869
hlimit = ip6_dst_hoplimit(dst);
870
}
871
872
if (tclass < 0)
873
tclass = np->tclass;
874
875
if (dontfrag < 0)
876
dontfrag = np->dontfrag;
877
878
if (msg->msg_flags&MSG_CONFIRM)
879
goto do_confirm;
880
881
back_from_confirm:
882
if (inet->hdrincl)
883
err = rawv6_send_hdrinc(sk, msg->msg_iov, len, &fl6, &dst, msg->msg_flags);
884
else {
885
lock_sock(sk);
886
err = ip6_append_data(sk, ip_generic_getfrag, msg->msg_iov,
887
len, 0, hlimit, tclass, opt, &fl6, (struct rt6_info*)dst,
888
msg->msg_flags, dontfrag);
889
890
if (err)
891
ip6_flush_pending_frames(sk);
892
else if (!(msg->msg_flags & MSG_MORE))
893
err = rawv6_push_pending_frames(sk, &fl6, rp);
894
release_sock(sk);
895
}
896
done:
897
dst_release(dst);
898
out:
899
fl6_sock_release(flowlabel);
900
return err<0?err:len;
901
do_confirm:
902
dst_confirm(dst);
903
if (!(msg->msg_flags & MSG_PROBE) || len)
904
goto back_from_confirm;
905
err = 0;
906
goto done;
907
}
908
909
static int rawv6_seticmpfilter(struct sock *sk, int level, int optname,
910
char __user *optval, int optlen)
911
{
912
switch (optname) {
913
case ICMPV6_FILTER:
914
if (optlen > sizeof(struct icmp6_filter))
915
optlen = sizeof(struct icmp6_filter);
916
if (copy_from_user(&raw6_sk(sk)->filter, optval, optlen))
917
return -EFAULT;
918
return 0;
919
default:
920
return -ENOPROTOOPT;
921
}
922
923
return 0;
924
}
925
926
static int rawv6_geticmpfilter(struct sock *sk, int level, int optname,
927
char __user *optval, int __user *optlen)
928
{
929
int len;
930
931
switch (optname) {
932
case ICMPV6_FILTER:
933
if (get_user(len, optlen))
934
return -EFAULT;
935
if (len < 0)
936
return -EINVAL;
937
if (len > sizeof(struct icmp6_filter))
938
len = sizeof(struct icmp6_filter);
939
if (put_user(len, optlen))
940
return -EFAULT;
941
if (copy_to_user(optval, &raw6_sk(sk)->filter, len))
942
return -EFAULT;
943
return 0;
944
default:
945
return -ENOPROTOOPT;
946
}
947
948
return 0;
949
}
950
951
952
static int do_rawv6_setsockopt(struct sock *sk, int level, int optname,
953
char __user *optval, unsigned int optlen)
954
{
955
struct raw6_sock *rp = raw6_sk(sk);
956
int val;
957
958
if (get_user(val, (int __user *)optval))
959
return -EFAULT;
960
961
switch (optname) {
962
case IPV6_CHECKSUM:
963
if (inet_sk(sk)->inet_num == IPPROTO_ICMPV6 &&
964
level == IPPROTO_IPV6) {
965
/*
966
* RFC3542 tells that IPV6_CHECKSUM socket
967
* option in the IPPROTO_IPV6 level is not
968
* allowed on ICMPv6 sockets.
969
* If you want to set it, use IPPROTO_RAW
970
* level IPV6_CHECKSUM socket option
971
* (Linux extension).
972
*/
973
return -EINVAL;
974
}
975
976
/* You may get strange result with a positive odd offset;
977
RFC2292bis agrees with me. */
978
if (val > 0 && (val&1))
979
return -EINVAL;
980
if (val < 0) {
981
rp->checksum = 0;
982
} else {
983
rp->checksum = 1;
984
rp->offset = val;
985
}
986
987
return 0;
988
break;
989
990
default:
991
return -ENOPROTOOPT;
992
}
993
}
994
995
static int rawv6_setsockopt(struct sock *sk, int level, int optname,
996
char __user *optval, unsigned int optlen)
997
{
998
switch(level) {
999
case SOL_RAW:
1000
break;
1001
1002
case SOL_ICMPV6:
1003
if (inet_sk(sk)->inet_num != IPPROTO_ICMPV6)
1004
return -EOPNOTSUPP;
1005
return rawv6_seticmpfilter(sk, level, optname, optval,
1006
optlen);
1007
case SOL_IPV6:
1008
if (optname == IPV6_CHECKSUM)
1009
break;
1010
default:
1011
return ipv6_setsockopt(sk, level, optname, optval,
1012
optlen);
1013
}
1014
1015
return do_rawv6_setsockopt(sk, level, optname, optval, optlen);
1016
}
1017
1018
#ifdef CONFIG_COMPAT
1019
static int compat_rawv6_setsockopt(struct sock *sk, int level, int optname,
1020
char __user *optval, unsigned int optlen)
1021
{
1022
switch (level) {
1023
case SOL_RAW:
1024
break;
1025
case SOL_ICMPV6:
1026
if (inet_sk(sk)->inet_num != IPPROTO_ICMPV6)
1027
return -EOPNOTSUPP;
1028
return rawv6_seticmpfilter(sk, level, optname, optval, optlen);
1029
case SOL_IPV6:
1030
if (optname == IPV6_CHECKSUM)
1031
break;
1032
default:
1033
return compat_ipv6_setsockopt(sk, level, optname,
1034
optval, optlen);
1035
}
1036
return do_rawv6_setsockopt(sk, level, optname, optval, optlen);
1037
}
1038
#endif
1039
1040
static int do_rawv6_getsockopt(struct sock *sk, int level, int optname,
1041
char __user *optval, int __user *optlen)
1042
{
1043
struct raw6_sock *rp = raw6_sk(sk);
1044
int val, len;
1045
1046
if (get_user(len,optlen))
1047
return -EFAULT;
1048
1049
switch (optname) {
1050
case IPV6_CHECKSUM:
1051
/*
1052
* We allow getsockopt() for IPPROTO_IPV6-level
1053
* IPV6_CHECKSUM socket option on ICMPv6 sockets
1054
* since RFC3542 is silent about it.
1055
*/
1056
if (rp->checksum == 0)
1057
val = -1;
1058
else
1059
val = rp->offset;
1060
break;
1061
1062
default:
1063
return -ENOPROTOOPT;
1064
}
1065
1066
len = min_t(unsigned int, sizeof(int), len);
1067
1068
if (put_user(len, optlen))
1069
return -EFAULT;
1070
if (copy_to_user(optval,&val,len))
1071
return -EFAULT;
1072
return 0;
1073
}
1074
1075
static int rawv6_getsockopt(struct sock *sk, int level, int optname,
1076
char __user *optval, int __user *optlen)
1077
{
1078
switch(level) {
1079
case SOL_RAW:
1080
break;
1081
1082
case SOL_ICMPV6:
1083
if (inet_sk(sk)->inet_num != IPPROTO_ICMPV6)
1084
return -EOPNOTSUPP;
1085
return rawv6_geticmpfilter(sk, level, optname, optval,
1086
optlen);
1087
case SOL_IPV6:
1088
if (optname == IPV6_CHECKSUM)
1089
break;
1090
default:
1091
return ipv6_getsockopt(sk, level, optname, optval,
1092
optlen);
1093
}
1094
1095
return do_rawv6_getsockopt(sk, level, optname, optval, optlen);
1096
}
1097
1098
#ifdef CONFIG_COMPAT
1099
static int compat_rawv6_getsockopt(struct sock *sk, int level, int optname,
1100
char __user *optval, int __user *optlen)
1101
{
1102
switch (level) {
1103
case SOL_RAW:
1104
break;
1105
case SOL_ICMPV6:
1106
if (inet_sk(sk)->inet_num != IPPROTO_ICMPV6)
1107
return -EOPNOTSUPP;
1108
return rawv6_geticmpfilter(sk, level, optname, optval, optlen);
1109
case SOL_IPV6:
1110
if (optname == IPV6_CHECKSUM)
1111
break;
1112
default:
1113
return compat_ipv6_getsockopt(sk, level, optname,
1114
optval, optlen);
1115
}
1116
return do_rawv6_getsockopt(sk, level, optname, optval, optlen);
1117
}
1118
#endif
1119
1120
static int rawv6_ioctl(struct sock *sk, int cmd, unsigned long arg)
1121
{
1122
switch(cmd) {
1123
case SIOCOUTQ:
1124
{
1125
int amount = sk_wmem_alloc_get(sk);
1126
1127
return put_user(amount, (int __user *)arg);
1128
}
1129
case SIOCINQ:
1130
{
1131
struct sk_buff *skb;
1132
int amount = 0;
1133
1134
spin_lock_bh(&sk->sk_receive_queue.lock);
1135
skb = skb_peek(&sk->sk_receive_queue);
1136
if (skb != NULL)
1137
amount = skb->tail - skb->transport_header;
1138
spin_unlock_bh(&sk->sk_receive_queue.lock);
1139
return put_user(amount, (int __user *)arg);
1140
}
1141
1142
default:
1143
#ifdef CONFIG_IPV6_MROUTE
1144
return ip6mr_ioctl(sk, cmd, (void __user *)arg);
1145
#else
1146
return -ENOIOCTLCMD;
1147
#endif
1148
}
1149
}
1150
1151
#ifdef CONFIG_COMPAT
1152
static int compat_rawv6_ioctl(struct sock *sk, unsigned int cmd, unsigned long arg)
1153
{
1154
switch (cmd) {
1155
case SIOCOUTQ:
1156
case SIOCINQ:
1157
return -ENOIOCTLCMD;
1158
default:
1159
#ifdef CONFIG_IPV6_MROUTE
1160
return ip6mr_compat_ioctl(sk, cmd, compat_ptr(arg));
1161
#else
1162
return -ENOIOCTLCMD;
1163
#endif
1164
}
1165
}
1166
#endif
1167
1168
static void rawv6_close(struct sock *sk, long timeout)
1169
{
1170
if (inet_sk(sk)->inet_num == IPPROTO_RAW)
1171
ip6_ra_control(sk, -1);
1172
ip6mr_sk_done(sk);
1173
sk_common_release(sk);
1174
}
1175
1176
static void raw6_destroy(struct sock *sk)
1177
{
1178
lock_sock(sk);
1179
ip6_flush_pending_frames(sk);
1180
release_sock(sk);
1181
1182
inet6_destroy_sock(sk);
1183
}
1184
1185
static int rawv6_init_sk(struct sock *sk)
1186
{
1187
struct raw6_sock *rp = raw6_sk(sk);
1188
1189
switch (inet_sk(sk)->inet_num) {
1190
case IPPROTO_ICMPV6:
1191
rp->checksum = 1;
1192
rp->offset = 2;
1193
break;
1194
case IPPROTO_MH:
1195
rp->checksum = 1;
1196
rp->offset = 4;
1197
break;
1198
default:
1199
break;
1200
}
1201
return 0;
1202
}
1203
1204
struct proto rawv6_prot = {
1205
.name = "RAWv6",
1206
.owner = THIS_MODULE,
1207
.close = rawv6_close,
1208
.destroy = raw6_destroy,
1209
.connect = ip6_datagram_connect,
1210
.disconnect = udp_disconnect,
1211
.ioctl = rawv6_ioctl,
1212
.init = rawv6_init_sk,
1213
.setsockopt = rawv6_setsockopt,
1214
.getsockopt = rawv6_getsockopt,
1215
.sendmsg = rawv6_sendmsg,
1216
.recvmsg = rawv6_recvmsg,
1217
.bind = rawv6_bind,
1218
.backlog_rcv = rawv6_rcv_skb,
1219
.hash = raw_hash_sk,
1220
.unhash = raw_unhash_sk,
1221
.obj_size = sizeof(struct raw6_sock),
1222
.h.raw_hash = &raw_v6_hashinfo,
1223
#ifdef CONFIG_COMPAT
1224
.compat_setsockopt = compat_rawv6_setsockopt,
1225
.compat_getsockopt = compat_rawv6_getsockopt,
1226
.compat_ioctl = compat_rawv6_ioctl,
1227
#endif
1228
};
1229
1230
#ifdef CONFIG_PROC_FS
1231
static void raw6_sock_seq_show(struct seq_file *seq, struct sock *sp, int i)
1232
{
1233
struct ipv6_pinfo *np = inet6_sk(sp);
1234
const struct in6_addr *dest, *src;
1235
__u16 destp, srcp;
1236
1237
dest = &np->daddr;
1238
src = &np->rcv_saddr;
1239
destp = 0;
1240
srcp = inet_sk(sp)->inet_num;
1241
seq_printf(seq,
1242
"%4d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X "
1243
"%02X %08X:%08X %02X:%08lX %08X %5d %8d %lu %d %pK %d\n",
1244
i,
1245
src->s6_addr32[0], src->s6_addr32[1],
1246
src->s6_addr32[2], src->s6_addr32[3], srcp,
1247
dest->s6_addr32[0], dest->s6_addr32[1],
1248
dest->s6_addr32[2], dest->s6_addr32[3], destp,
1249
sp->sk_state,
1250
sk_wmem_alloc_get(sp),
1251
sk_rmem_alloc_get(sp),
1252
0, 0L, 0,
1253
sock_i_uid(sp), 0,
1254
sock_i_ino(sp),
1255
atomic_read(&sp->sk_refcnt), sp, atomic_read(&sp->sk_drops));
1256
}
1257
1258
static int raw6_seq_show(struct seq_file *seq, void *v)
1259
{
1260
if (v == SEQ_START_TOKEN)
1261
seq_printf(seq,
1262
" sl "
1263
"local_address "
1264
"remote_address "
1265
"st tx_queue rx_queue tr tm->when retrnsmt"
1266
" uid timeout inode ref pointer drops\n");
1267
else
1268
raw6_sock_seq_show(seq, v, raw_seq_private(seq)->bucket);
1269
return 0;
1270
}
1271
1272
static const struct seq_operations raw6_seq_ops = {
1273
.start = raw_seq_start,
1274
.next = raw_seq_next,
1275
.stop = raw_seq_stop,
1276
.show = raw6_seq_show,
1277
};
1278
1279
static int raw6_seq_open(struct inode *inode, struct file *file)
1280
{
1281
return raw_seq_open(inode, file, &raw_v6_hashinfo, &raw6_seq_ops);
1282
}
1283
1284
static const struct file_operations raw6_seq_fops = {
1285
.owner = THIS_MODULE,
1286
.open = raw6_seq_open,
1287
.read = seq_read,
1288
.llseek = seq_lseek,
1289
.release = seq_release_net,
1290
};
1291
1292
static int __net_init raw6_init_net(struct net *net)
1293
{
1294
if (!proc_net_fops_create(net, "raw6", S_IRUGO, &raw6_seq_fops))
1295
return -ENOMEM;
1296
1297
return 0;
1298
}
1299
1300
static void __net_exit raw6_exit_net(struct net *net)
1301
{
1302
proc_net_remove(net, "raw6");
1303
}
1304
1305
static struct pernet_operations raw6_net_ops = {
1306
.init = raw6_init_net,
1307
.exit = raw6_exit_net,
1308
};
1309
1310
int __init raw6_proc_init(void)
1311
{
1312
return register_pernet_subsys(&raw6_net_ops);
1313
}
1314
1315
void raw6_proc_exit(void)
1316
{
1317
unregister_pernet_subsys(&raw6_net_ops);
1318
}
1319
#endif /* CONFIG_PROC_FS */
1320
1321
/* Same as inet6_dgram_ops, sans udp_poll. */
1322
static const struct proto_ops inet6_sockraw_ops = {
1323
.family = PF_INET6,
1324
.owner = THIS_MODULE,
1325
.release = inet6_release,
1326
.bind = inet6_bind,
1327
.connect = inet_dgram_connect, /* ok */
1328
.socketpair = sock_no_socketpair, /* a do nothing */
1329
.accept = sock_no_accept, /* a do nothing */
1330
.getname = inet6_getname,
1331
.poll = datagram_poll, /* ok */
1332
.ioctl = inet6_ioctl, /* must change */
1333
.listen = sock_no_listen, /* ok */
1334
.shutdown = inet_shutdown, /* ok */
1335
.setsockopt = sock_common_setsockopt, /* ok */
1336
.getsockopt = sock_common_getsockopt, /* ok */
1337
.sendmsg = inet_sendmsg, /* ok */
1338
.recvmsg = sock_common_recvmsg, /* ok */
1339
.mmap = sock_no_mmap,
1340
.sendpage = sock_no_sendpage,
1341
#ifdef CONFIG_COMPAT
1342
.compat_setsockopt = compat_sock_common_setsockopt,
1343
.compat_getsockopt = compat_sock_common_getsockopt,
1344
#endif
1345
};
1346
1347
static struct inet_protosw rawv6_protosw = {
1348
.type = SOCK_RAW,
1349
.protocol = IPPROTO_IP, /* wild card */
1350
.prot = &rawv6_prot,
1351
.ops = &inet6_sockraw_ops,
1352
.no_check = UDP_CSUM_DEFAULT,
1353
.flags = INET_PROTOSW_REUSE,
1354
};
1355
1356
int __init rawv6_init(void)
1357
{
1358
int ret;
1359
1360
ret = inet6_register_protosw(&rawv6_protosw);
1361
if (ret)
1362
goto out;
1363
out:
1364
return ret;
1365
}
1366
1367
void rawv6_exit(void)
1368
{
1369
inet6_unregister_protosw(&rawv6_protosw);
1370
}
1371
1372