Lines Matching refs:sk
82 int ping_get_port(struct sock *sk, unsigned short ident) in ping_get_port() argument
89 isk = inet_sk(sk); in ping_get_port()
98 hlist = ping_hashslot(&ping_table, sock_net(sk), in ping_get_port()
116 hlist = ping_hashslot(&ping_table, sock_net(sk), ident); in ping_get_port()
125 (sk2 != sk) && in ping_get_port()
126 (!sk2->sk_reuse || !sk->sk_reuse)) in ping_get_port()
133 if (sk_unhashed(sk)) { in ping_get_port()
135 sock_hold(sk); in ping_get_port()
136 hlist_nulls_add_head(&sk->sk_nulls_node, hlist); in ping_get_port()
137 sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1); in ping_get_port()
148 void ping_hash(struct sock *sk) in ping_hash() argument
150 pr_debug("ping_hash(sk->port=%u)\n", inet_sk(sk)->inet_num); in ping_hash()
154 void ping_unhash(struct sock *sk) in ping_unhash() argument
156 struct inet_sock *isk = inet_sk(sk); in ping_unhash()
158 if (sk_hashed(sk)) { in ping_unhash()
160 hlist_nulls_del(&sk->sk_nulls_node); in ping_unhash()
161 sk_nulls_node_init(&sk->sk_nulls_node); in ping_unhash()
162 sock_put(sk); in ping_unhash()
165 sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1); in ping_unhash()
174 struct sock *sk = NULL; in ping_lookup() local
191 ping_portaddr_for_each_entry(sk, hnode, hslot) { in ping_lookup()
192 isk = inet_sk(sk); in ping_lookup()
199 sk->sk_family == AF_INET) { in ping_lookup()
200 pr_debug("found: %p: num=%d, daddr=%pI4, dif=%d\n", sk, in ping_lookup()
202 sk->sk_bound_dev_if); in ping_lookup()
209 sk->sk_family == AF_INET6) { in ping_lookup()
211 pr_debug("found: %p: num=%d, daddr=%pI6c, dif=%d\n", sk, in ping_lookup()
213 &sk->sk_v6_rcv_saddr, in ping_lookup()
214 sk->sk_bound_dev_if); in ping_lookup()
216 if (!ipv6_addr_any(&sk->sk_v6_rcv_saddr) && in ping_lookup()
217 !ipv6_addr_equal(&sk->sk_v6_rcv_saddr, in ping_lookup()
225 if (sk->sk_bound_dev_if && sk->sk_bound_dev_if != dif) in ping_lookup()
228 sock_hold(sk); in ping_lookup()
232 sk = NULL; in ping_lookup()
236 return sk; in ping_lookup()
254 int ping_init_sock(struct sock *sk) in ping_init_sock() argument
256 struct net *net = sock_net(sk); in ping_init_sock()
263 if (sk->sk_family == AF_INET6) in ping_init_sock()
264 sk->sk_ipv6only = 1; in ping_init_sock()
291 void ping_close(struct sock *sk, long timeout) in ping_close() argument
294 inet_sk(sk), inet_sk(sk)->inet_num); in ping_close()
295 pr_debug("isk->refcnt = %d\n", sk->sk_refcnt.counter); in ping_close()
297 sk_common_release(sk); in ping_close()
302 static int ping_check_bind_addr(struct sock *sk, struct inet_sock *isk, in ping_check_bind_addr() argument
304 struct net *net = sock_net(sk); in ping_check_bind_addr()
305 if (sk->sk_family == AF_INET) { in ping_check_bind_addr()
318 sk, &addr->sin_addr.s_addr, ntohs(addr->sin_port)); in ping_check_bind_addr()
333 } else if (sk->sk_family == AF_INET6) { in ping_check_bind_addr()
345 sk, addr->sin6_addr.s6_addr, ntohs(addr->sin6_port)); in ping_check_bind_addr()
371 sk->sk_bound_dev_if = addr->sin6_scope_id; in ping_check_bind_addr()
379 static void ping_set_saddr(struct sock *sk, struct sockaddr *saddr) in ping_set_saddr() argument
382 struct inet_sock *isk = inet_sk(sk); in ping_set_saddr()
388 struct ipv6_pinfo *np = inet6_sk(sk); in ping_set_saddr()
389 sk->sk_v6_rcv_saddr = np->saddr = addr->sin6_addr; in ping_set_saddr()
394 static void ping_clear_saddr(struct sock *sk, int dif) in ping_clear_saddr() argument
396 sk->sk_bound_dev_if = dif; in ping_clear_saddr()
397 if (sk->sk_family == AF_INET) { in ping_clear_saddr()
398 struct inet_sock *isk = inet_sk(sk); in ping_clear_saddr()
401 } else if (sk->sk_family == AF_INET6) { in ping_clear_saddr()
402 struct ipv6_pinfo *np = inet6_sk(sk); in ping_clear_saddr()
403 memset(&sk->sk_v6_rcv_saddr, 0, sizeof(sk->sk_v6_rcv_saddr)); in ping_clear_saddr()
413 int ping_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len) in ping_bind() argument
415 struct inet_sock *isk = inet_sk(sk); in ping_bind()
418 int dif = sk->sk_bound_dev_if; in ping_bind()
420 err = ping_check_bind_addr(sk, isk, uaddr, addr_len); in ping_bind()
424 lock_sock(sk); in ping_bind()
431 ping_set_saddr(sk, uaddr); in ping_bind()
433 if (ping_get_port(sk, snum) != 0) { in ping_bind()
434 ping_clear_saddr(sk, dif); in ping_bind()
440 (int)sk->sk_bound_dev_if); in ping_bind()
443 if (sk->sk_family == AF_INET && isk->inet_rcv_saddr) in ping_bind()
444 sk->sk_userlocks |= SOCK_BINDADDR_LOCK; in ping_bind()
446 if (sk->sk_family == AF_INET6 && !ipv6_addr_any(&sk->sk_v6_rcv_saddr)) in ping_bind()
447 sk->sk_userlocks |= SOCK_BINDADDR_LOCK; in ping_bind()
451 sk->sk_userlocks |= SOCK_BINDPORT_LOCK; in ping_bind()
457 if (sk->sk_family == AF_INET6) in ping_bind()
458 memset(&sk->sk_v6_daddr, 0, sizeof(sk->sk_v6_daddr)); in ping_bind()
461 sk_dst_reset(sk); in ping_bind()
463 release_sock(sk); in ping_bind()
492 struct sock *sk; in ping_err() local
519 sk = ping_lookup(net, skb, ntohs(icmph->un.echo.id)); in ping_err()
520 if (!sk) { in ping_err()
524 pr_debug("err on socket %p\n", sk); in ping_err()
528 inet_sock = inet_sk(sk); in ping_err()
548 ipv4_sk_update_pmtu(skb, sk, info); in ping_err()
564 ipv4_sk_redirect(skb, sk); in ping_err()
579 (family == AF_INET6 && !inet6_sk(sk)->recverr)) { in ping_err()
580 if (!harderr || sk->sk_state != TCP_ESTABLISHED) in ping_err()
584 ip_icmp_error(sk, skb, err, 0 /* no remote port */, in ping_err()
588 pingv6_ops.ipv6_icmp_error(sk, skb, err, 0, in ping_err()
593 sk->sk_err = err; in ping_err()
594 sk->sk_error_report(sk); in ping_err()
596 sock_put(sk); in ping_err()
642 static int ping_v4_push_pending_frames(struct sock *sk, struct pingfakehdr *pfh, in ping_v4_push_pending_frames() argument
645 struct sk_buff *skb = skb_peek(&sk->sk_write_queue); in ping_v4_push_pending_frames()
652 return ip_push_pending_frames(sk, fl4); in ping_v4_push_pending_frames()
696 static int ping_v4_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) in ping_v4_sendmsg() argument
698 struct net *net = sock_net(sk); in ping_v4_sendmsg()
700 struct inet_sock *inet = inet_sk(sk); in ping_v4_sendmsg()
731 if (sk->sk_state != TCP_ESTABLISHED) in ping_v4_sendmsg()
739 ipc.oif = sk->sk_bound_dev_if; in ping_v4_sendmsg()
744 sock_tx_timestamp(sk, &ipc.tx_flags); in ping_v4_sendmsg()
747 err = ip_cmsg_send(sock_net(sk), msg, &ipc, false); in ping_v4_sendmsg()
777 if (sock_flag(sk, SOCK_LOCALROUTE) || in ping_v4_sendmsg()
791 flowi4_init_output(&fl4, ipc.oif, sk->sk_mark, tos, in ping_v4_sendmsg()
792 RT_SCOPE_UNIVERSE, sk->sk_protocol, in ping_v4_sendmsg()
793 inet_sk_flowi_flags(sk), faddr, saddr, 0, 0); in ping_v4_sendmsg()
795 security_sk_classify_flow(sk, flowi4_to_flowi(&fl4)); in ping_v4_sendmsg()
796 rt = ip_route_output_flow(net, &fl4, sk); in ping_v4_sendmsg()
807 !sock_flag(sk, SOCK_BROADCAST)) in ping_v4_sendmsg()
817 lock_sock(sk); in ping_v4_sendmsg()
828 err = ip_append_data(sk, &fl4, ping_getfrag, &pfh, len, in ping_v4_sendmsg()
831 ip_flush_pending_frames(sk); in ping_v4_sendmsg()
833 err = ping_v4_push_pending_frames(sk, &pfh, &fl4); in ping_v4_sendmsg()
834 release_sock(sk); in ping_v4_sendmsg()
841 icmp_out_count(sock_net(sk), user_icmph.type); in ping_v4_sendmsg()
854 int ping_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int noblock, in ping_recvmsg() argument
857 struct inet_sock *isk = inet_sk(sk); in ping_recvmsg()
858 int family = sk->sk_family; in ping_recvmsg()
869 return inet_recv_error(sk, msg, len, addr_len); in ping_recvmsg()
871 skb = skb_recv_datagram(sk, flags, noblock, &err); in ping_recvmsg()
886 sock_recv_timestamp(msg, sk, skb); in ping_recvmsg()
905 struct ipv6_pinfo *np = inet6_sk(sk); in ping_recvmsg()
922 if (inet6_sk(sk)->rxopt.all) in ping_recvmsg()
923 pingv6_ops.ip6_datagram_recv_common_ctl(sk, msg, skb); in ping_recvmsg()
925 inet6_sk(sk)->rxopt.all) in ping_recvmsg()
926 pingv6_ops.ip6_datagram_recv_specific_ctl(sk, msg, skb); in ping_recvmsg()
937 skb_free_datagram(sk, skb); in ping_recvmsg()
944 int ping_queue_rcv_skb(struct sock *sk, struct sk_buff *skb) in ping_queue_rcv_skb() argument
947 inet_sk(sk), inet_sk(sk)->inet_num, skb); in ping_queue_rcv_skb()
948 if (sock_queue_rcv_skb(sk, skb) < 0) { in ping_queue_rcv_skb()
964 struct sock *sk; in ping_rcv() local
976 sk = ping_lookup(net, skb, ntohs(icmph->un.echo.id)); in ping_rcv()
977 if (sk) { in ping_rcv()
980 pr_debug("rcv on socket %p\n", sk); in ping_rcv()
982 ping_queue_rcv_skb(sk, skb2); in ping_rcv()
983 sock_put(sk); in ping_rcv()
1017 struct sock *sk; in ping_get_first() local
1031 sk_nulls_for_each(sk, node, hslot) { in ping_get_first()
1032 if (net_eq(sock_net(sk), net) && in ping_get_first()
1033 sk->sk_family == state->family) in ping_get_first()
1037 sk = NULL; in ping_get_first()
1039 return sk; in ping_get_first()
1042 static struct sock *ping_get_next(struct seq_file *seq, struct sock *sk) in ping_get_next() argument
1048 sk = sk_nulls_next(sk); in ping_get_next()
1049 } while (sk && (!net_eq(sock_net(sk), net))); in ping_get_next()
1051 if (!sk) in ping_get_next()
1053 return sk; in ping_get_next()
1058 struct sock *sk = ping_get_first(seq, 0); in ping_get_idx() local
1060 if (sk) in ping_get_idx()
1061 while (pos && (sk = ping_get_next(seq, sk)) != NULL) in ping_get_idx()
1063 return pos ? NULL : sk; in ping_get_idx()
1085 struct sock *sk; in ping_seq_next() local
1088 sk = ping_get_idx(seq, 0); in ping_seq_next()
1090 sk = ping_get_next(seq, v); in ping_seq_next()
1093 return sk; in ping_seq_next()