Lines Matching refs:sk

72 static struct sock *__raw_v6_lookup(struct net *net, struct sock *sk,  in __raw_v6_lookup()  argument
78 sk_for_each_from(sk) in __raw_v6_lookup()
79 if (inet_sk(sk)->inet_num == num) { in __raw_v6_lookup()
81 if (!net_eq(sock_net(sk), net)) in __raw_v6_lookup()
84 if (!ipv6_addr_any(&sk->sk_v6_daddr) && in __raw_v6_lookup()
85 !ipv6_addr_equal(&sk->sk_v6_daddr, rmt_addr)) in __raw_v6_lookup()
88 if (sk->sk_bound_dev_if && sk->sk_bound_dev_if != dif) in __raw_v6_lookup()
91 if (!ipv6_addr_any(&sk->sk_v6_rcv_saddr)) { in __raw_v6_lookup()
92 if (ipv6_addr_equal(&sk->sk_v6_rcv_saddr, loc_addr)) in __raw_v6_lookup()
95 inet6_mc_check(sk, loc_addr, rmt_addr)) in __raw_v6_lookup()
101 sk = NULL; in __raw_v6_lookup()
103 return sk; in __raw_v6_lookup()
110 static int icmpv6_filter(const struct sock *sk, const struct sk_buff *skb) in icmpv6_filter() argument
121 const __u32 *data = &raw6_sk(sk)->filter.data[0]; in icmpv6_filter()
162 struct sock *sk; in ipv6_raw_deliver() local
173 sk = sk_head(&raw_v6_hashinfo.ht[hash]); in ipv6_raw_deliver()
175 if (!sk) in ipv6_raw_deliver()
179 sk = __raw_v6_lookup(net, sk, nexthdr, daddr, saddr, inet6_iif(skb)); in ipv6_raw_deliver()
181 while (sk) { in ipv6_raw_deliver()
187 filtered = icmpv6_filter(sk, skb); in ipv6_raw_deliver()
202 filtered = filter ? (*filter)(sk, skb) : 0; in ipv6_raw_deliver()
219 rawv6_rcv(sk, clone); in ipv6_raw_deliver()
222 sk = __raw_v6_lookup(net, sk_next(sk), nexthdr, daddr, saddr, in ipv6_raw_deliver()
242 static int rawv6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len) in rawv6_bind() argument
244 struct inet_sock *inet = inet_sk(sk); in rawv6_bind()
245 struct ipv6_pinfo *np = inet6_sk(sk); in rawv6_bind()
263 lock_sock(sk); in rawv6_bind()
266 if (sk->sk_state != TCP_CLOSE) in rawv6_bind()
280 sk->sk_bound_dev_if = addr->sin6_scope_id; in rawv6_bind()
284 if (!sk->sk_bound_dev_if) in rawv6_bind()
288 dev = dev_get_by_index_rcu(sock_net(sk), in rawv6_bind()
289 sk->sk_bound_dev_if); in rawv6_bind()
299 !sock_net(sk)->ipv6.sysctl.ip_nonlocal_bind) { in rawv6_bind()
301 if (!ipv6_chk_addr(sock_net(sk), &addr->sin6_addr, in rawv6_bind()
309 sk->sk_v6_rcv_saddr = addr->sin6_addr; in rawv6_bind()
316 release_sock(sk); in rawv6_bind()
320 static void rawv6_err(struct sock *sk, struct sk_buff *skb, in rawv6_err() argument
324 struct inet_sock *inet = inet_sk(sk); in rawv6_err()
325 struct ipv6_pinfo *np = inet6_sk(sk); in rawv6_err()
334 if (!np->recverr && sk->sk_state != TCP_ESTABLISHED) in rawv6_err()
339 ip6_sk_update_pmtu(skb, sk, info); in rawv6_err()
343 ip6_sk_redirect(skb, sk); in rawv6_err()
350 ipv6_icmp_error(sk, skb, err, 0, ntohl(info), payload); in rawv6_err()
354 sk->sk_err = err; in rawv6_err()
355 sk->sk_error_report(sk); in rawv6_err()
362 struct sock *sk; in raw6_icmp_error() local
370 sk = sk_head(&raw_v6_hashinfo.ht[hash]); in raw6_icmp_error()
371 if (sk) { in raw6_icmp_error()
378 while ((sk = __raw_v6_lookup(net, sk, nexthdr, saddr, daddr, in raw6_icmp_error()
380 rawv6_err(sk, skb, NULL, type, code, in raw6_icmp_error()
382 sk = sk_next(sk); in raw6_icmp_error()
388 static inline int rawv6_rcv_skb(struct sock *sk, struct sk_buff *skb) in rawv6_rcv_skb() argument
390 if ((raw6_sk(sk)->checksum || rcu_access_pointer(sk->sk_filter)) && in rawv6_rcv_skb()
392 atomic_inc(&sk->sk_drops); in rawv6_rcv_skb()
399 if (sock_queue_rcv_skb(sk, skb) < 0) { in rawv6_rcv_skb()
414 int rawv6_rcv(struct sock *sk, struct sk_buff *skb) in rawv6_rcv() argument
416 struct inet_sock *inet = inet_sk(sk); in rawv6_rcv()
417 struct raw6_sock *rp = raw6_sk(sk); in rawv6_rcv()
419 if (!xfrm6_policy_check(sk, XFRM_POLICY_IN, skb)) { in rawv6_rcv()
420 atomic_inc(&sk->sk_drops); in rawv6_rcv()
444 atomic_inc(&sk->sk_drops); in rawv6_rcv()
450 rawv6_rcv_skb(sk, skb); in rawv6_rcv()
460 static int rawv6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, in rawv6_recvmsg() argument
463 struct ipv6_pinfo *np = inet6_sk(sk); in rawv6_recvmsg()
473 return ipv6_recv_error(sk, msg, len, addr_len); in rawv6_recvmsg()
476 return ipv6_recv_rxpmtu(sk, msg, len, addr_len); in rawv6_recvmsg()
478 skb = skb_recv_datagram(sk, flags, noblock, &err); in rawv6_recvmsg()
513 sock_recv_ts_and_drops(msg, sk, skb); in rawv6_recvmsg()
516 ip6_datagram_recv_ctl(sk, msg, skb); in rawv6_recvmsg()
523 skb_free_datagram(sk, skb); in rawv6_recvmsg()
528 skb_kill_datagram(sk, skb, flags); in rawv6_recvmsg()
537 static int rawv6_push_pending_frames(struct sock *sk, struct flowi6 *fl6, in rawv6_push_pending_frames() argument
551 skb = skb_peek(&sk->sk_write_queue); in rawv6_push_pending_frames()
556 total_len = inet_sk(sk)->cork.base.length; in rawv6_push_pending_frames()
559 ip6_flush_pending_frames(sk); in rawv6_push_pending_frames()
564 if (skb_queue_len(&sk->sk_write_queue) == 1) { in rawv6_push_pending_frames()
573 skb_queue_walk(&sk->sk_write_queue, skb) { in rawv6_push_pending_frames()
607 err = ip6_push_pending_frames(sk); in rawv6_push_pending_frames()
612 static int rawv6_send_hdrinc(struct sock *sk, struct msghdr *msg, int length, in rawv6_send_hdrinc() argument
616 struct ipv6_pinfo *np = inet6_sk(sk); in rawv6_send_hdrinc()
617 struct net *net = sock_net(sk); in rawv6_send_hdrinc()
626 ipv6_local_error(sk, EMSGSIZE, fl6, rt->dst.dev->mtu); in rawv6_send_hdrinc()
632 skb = sock_alloc_send_skb(sk, in rawv6_send_hdrinc()
640 skb->priority = sk->sk_priority; in rawv6_send_hdrinc()
641 skb->mark = sk->sk_mark; in rawv6_send_hdrinc()
657 err = NF_HOOK(NFPROTO_IPV6, NF_INET_LOCAL_OUT, net, sk, skb, in rawv6_send_hdrinc()
734 static int rawv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) in rawv6_sendmsg() argument
740 struct inet_sock *inet = inet_sk(sk); in rawv6_sendmsg()
741 struct ipv6_pinfo *np = inet6_sk(sk); in rawv6_sendmsg()
742 struct raw6_sock *rp = raw6_sk(sk); in rawv6_sendmsg()
770 fl6.flowi6_mark = sk->sk_mark; in rawv6_sendmsg()
794 flowlabel = fl6_sock_lookup(sk, fl6.flowlabel); in rawv6_sendmsg()
804 if (sk->sk_state == TCP_ESTABLISHED && in rawv6_sendmsg()
805 ipv6_addr_equal(daddr, &sk->sk_v6_daddr)) in rawv6_sendmsg()
806 daddr = &sk->sk_v6_daddr; in rawv6_sendmsg()
813 if (sk->sk_state != TCP_ESTABLISHED) in rawv6_sendmsg()
817 daddr = &sk->sk_v6_daddr; in rawv6_sendmsg()
822 fl6.flowi6_oif = sk->sk_bound_dev_if; in rawv6_sendmsg()
829 err = ip6_datagram_send_ctl(sock_net(sk), sk, msg, &fl6, opt, in rawv6_sendmsg()
836 flowlabel = fl6_sock_lookup(sk, fl6.flowlabel); in rawv6_sendmsg()
871 security_sk_classify_flow(sk, flowi6_to_flowi(&fl6)); in rawv6_sendmsg()
876 dst = ip6_dst_lookup_flow(sk, &fl6, final_p); in rawv6_sendmsg()
895 err = rawv6_send_hdrinc(sk, msg, len, &fl6, &dst, msg->msg_flags); in rawv6_sendmsg()
897 lock_sock(sk); in rawv6_sendmsg()
898 err = ip6_append_data(sk, raw6_getfrag, &rfv, in rawv6_sendmsg()
903 ip6_flush_pending_frames(sk); in rawv6_sendmsg()
905 err = rawv6_push_pending_frames(sk, &fl6, rp); in rawv6_sendmsg()
906 release_sock(sk); in rawv6_sendmsg()
922 static int rawv6_seticmpfilter(struct sock *sk, int level, int optname, in rawv6_seticmpfilter() argument
929 if (copy_from_user(&raw6_sk(sk)->filter, optval, optlen)) in rawv6_seticmpfilter()
939 static int rawv6_geticmpfilter(struct sock *sk, int level, int optname, in rawv6_geticmpfilter() argument
954 if (copy_to_user(optval, &raw6_sk(sk)->filter, len)) in rawv6_geticmpfilter()
965 static int do_rawv6_setsockopt(struct sock *sk, int level, int optname, in do_rawv6_setsockopt() argument
968 struct raw6_sock *rp = raw6_sk(sk); in do_rawv6_setsockopt()
976 if (inet_sk(sk)->inet_num == IPPROTO_ICMPV6 && in do_rawv6_setsockopt()
1007 static int rawv6_setsockopt(struct sock *sk, int level, int optname, in rawv6_setsockopt() argument
1015 if (inet_sk(sk)->inet_num != IPPROTO_ICMPV6) in rawv6_setsockopt()
1017 return rawv6_seticmpfilter(sk, level, optname, optval, optlen); in rawv6_setsockopt()
1022 return ipv6_setsockopt(sk, level, optname, optval, optlen); in rawv6_setsockopt()
1025 return do_rawv6_setsockopt(sk, level, optname, optval, optlen); in rawv6_setsockopt()
1029 static int compat_rawv6_setsockopt(struct sock *sk, int level, int optname, in compat_rawv6_setsockopt() argument
1036 if (inet_sk(sk)->inet_num != IPPROTO_ICMPV6) in compat_rawv6_setsockopt()
1038 return rawv6_seticmpfilter(sk, level, optname, optval, optlen); in compat_rawv6_setsockopt()
1043 return compat_ipv6_setsockopt(sk, level, optname, in compat_rawv6_setsockopt()
1046 return do_rawv6_setsockopt(sk, level, optname, optval, optlen); in compat_rawv6_setsockopt()
1050 static int do_rawv6_getsockopt(struct sock *sk, int level, int optname, in do_rawv6_getsockopt() argument
1053 struct raw6_sock *rp = raw6_sk(sk); in do_rawv6_getsockopt()
1085 static int rawv6_getsockopt(struct sock *sk, int level, int optname, in rawv6_getsockopt() argument
1093 if (inet_sk(sk)->inet_num != IPPROTO_ICMPV6) in rawv6_getsockopt()
1095 return rawv6_geticmpfilter(sk, level, optname, optval, optlen); in rawv6_getsockopt()
1100 return ipv6_getsockopt(sk, level, optname, optval, optlen); in rawv6_getsockopt()
1103 return do_rawv6_getsockopt(sk, level, optname, optval, optlen); in rawv6_getsockopt()
1107 static int compat_rawv6_getsockopt(struct sock *sk, int level, int optname, in compat_rawv6_getsockopt() argument
1114 if (inet_sk(sk)->inet_num != IPPROTO_ICMPV6) in compat_rawv6_getsockopt()
1116 return rawv6_geticmpfilter(sk, level, optname, optval, optlen); in compat_rawv6_getsockopt()
1121 return compat_ipv6_getsockopt(sk, level, optname, in compat_rawv6_getsockopt()
1124 return do_rawv6_getsockopt(sk, level, optname, optval, optlen); in compat_rawv6_getsockopt()
1128 static int rawv6_ioctl(struct sock *sk, int cmd, unsigned long arg) in rawv6_ioctl() argument
1132 int amount = sk_wmem_alloc_get(sk); in rawv6_ioctl()
1140 spin_lock_bh(&sk->sk_receive_queue.lock); in rawv6_ioctl()
1141 skb = skb_peek(&sk->sk_receive_queue); in rawv6_ioctl()
1145 spin_unlock_bh(&sk->sk_receive_queue.lock); in rawv6_ioctl()
1151 return ip6mr_ioctl(sk, cmd, (void __user *)arg); in rawv6_ioctl()
1159 static int compat_rawv6_ioctl(struct sock *sk, unsigned int cmd, unsigned long arg) in compat_rawv6_ioctl() argument
1167 return ip6mr_compat_ioctl(sk, cmd, compat_ptr(arg)); in compat_rawv6_ioctl()
1175 static void rawv6_close(struct sock *sk, long timeout) in rawv6_close() argument
1177 if (inet_sk(sk)->inet_num == IPPROTO_RAW) in rawv6_close()
1178 ip6_ra_control(sk, -1); in rawv6_close()
1179 ip6mr_sk_done(sk); in rawv6_close()
1180 sk_common_release(sk); in rawv6_close()
1183 static void raw6_destroy(struct sock *sk) in raw6_destroy() argument
1185 lock_sock(sk); in raw6_destroy()
1186 ip6_flush_pending_frames(sk); in raw6_destroy()
1187 release_sock(sk); in raw6_destroy()
1189 inet6_destroy_sock(sk); in raw6_destroy()
1192 static int rawv6_init_sk(struct sock *sk) in rawv6_init_sk() argument
1194 struct raw6_sock *rp = raw6_sk(sk); in rawv6_init_sk()
1196 switch (inet_sk(sk)->inet_num) { in rawv6_init_sk()