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()
372 sk->sk_bound_dev_if = addr->sin6_scope_id; in ping_check_bind_addr()
380 static void ping_set_saddr(struct sock *sk, struct sockaddr *saddr) in ping_set_saddr() argument
383 struct inet_sock *isk = inet_sk(sk); in ping_set_saddr()
389 struct ipv6_pinfo *np = inet6_sk(sk); in ping_set_saddr()
390 sk->sk_v6_rcv_saddr = np->saddr = addr->sin6_addr; in ping_set_saddr()
395 static void ping_clear_saddr(struct sock *sk, int dif) in ping_clear_saddr() argument
397 sk->sk_bound_dev_if = dif; in ping_clear_saddr()
398 if (sk->sk_family == AF_INET) { in ping_clear_saddr()
399 struct inet_sock *isk = inet_sk(sk); in ping_clear_saddr()
402 } else if (sk->sk_family == AF_INET6) { in ping_clear_saddr()
403 struct ipv6_pinfo *np = inet6_sk(sk); in ping_clear_saddr()
404 memset(&sk->sk_v6_rcv_saddr, 0, sizeof(sk->sk_v6_rcv_saddr)); in ping_clear_saddr()
414 int ping_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len) in ping_bind() argument
416 struct inet_sock *isk = inet_sk(sk); in ping_bind()
419 int dif = sk->sk_bound_dev_if; in ping_bind()
421 err = ping_check_bind_addr(sk, isk, uaddr, addr_len); in ping_bind()
425 lock_sock(sk); in ping_bind()
432 ping_set_saddr(sk, uaddr); in ping_bind()
434 if (ping_get_port(sk, snum) != 0) { in ping_bind()
435 ping_clear_saddr(sk, dif); in ping_bind()
441 (int)sk->sk_bound_dev_if); in ping_bind()
444 if (sk->sk_family == AF_INET && isk->inet_rcv_saddr) in ping_bind()
445 sk->sk_userlocks |= SOCK_BINDADDR_LOCK; in ping_bind()
447 if (sk->sk_family == AF_INET6 && !ipv6_addr_any(&sk->sk_v6_rcv_saddr)) in ping_bind()
448 sk->sk_userlocks |= SOCK_BINDADDR_LOCK; in ping_bind()
452 sk->sk_userlocks |= SOCK_BINDPORT_LOCK; in ping_bind()
458 if (sk->sk_family == AF_INET6) in ping_bind()
459 memset(&sk->sk_v6_daddr, 0, sizeof(sk->sk_v6_daddr)); in ping_bind()
462 sk_dst_reset(sk); in ping_bind()
464 release_sock(sk); in ping_bind()
493 struct sock *sk; in ping_err() local
520 sk = ping_lookup(net, skb, ntohs(icmph->un.echo.id)); in ping_err()
521 if (!sk) { in ping_err()
525 pr_debug("err on socket %p\n", sk); in ping_err()
529 inet_sock = inet_sk(sk); in ping_err()
549 ipv4_sk_update_pmtu(skb, sk, info); in ping_err()
565 ipv4_sk_redirect(skb, sk); in ping_err()
580 (family == AF_INET6 && !inet6_sk(sk)->recverr)) { in ping_err()
581 if (!harderr || sk->sk_state != TCP_ESTABLISHED) in ping_err()
585 ip_icmp_error(sk, skb, err, 0 /* no remote port */, in ping_err()
589 pingv6_ops.ipv6_icmp_error(sk, skb, err, 0, in ping_err()
594 sk->sk_err = err; in ping_err()
595 sk->sk_error_report(sk); in ping_err()
597 sock_put(sk); in ping_err()
643 static int ping_v4_push_pending_frames(struct sock *sk, struct pingfakehdr *pfh, in ping_v4_push_pending_frames() argument
646 struct sk_buff *skb = skb_peek(&sk->sk_write_queue); in ping_v4_push_pending_frames()
653 return ip_push_pending_frames(sk, fl4); in ping_v4_push_pending_frames()
697 static int ping_v4_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) in ping_v4_sendmsg() argument
699 struct net *net = sock_net(sk); in ping_v4_sendmsg()
701 struct inet_sock *inet = inet_sk(sk); in ping_v4_sendmsg()
732 if (sk->sk_state != TCP_ESTABLISHED) in ping_v4_sendmsg()
740 ipc.oif = sk->sk_bound_dev_if; in ping_v4_sendmsg()
745 sock_tx_timestamp(sk, &ipc.tx_flags); in ping_v4_sendmsg()
748 err = ip_cmsg_send(sock_net(sk), msg, &ipc, false); in ping_v4_sendmsg()
778 if (sock_flag(sk, SOCK_LOCALROUTE) || in ping_v4_sendmsg()
792 flowi4_init_output(&fl4, ipc.oif, sk->sk_mark, tos, in ping_v4_sendmsg()
793 RT_SCOPE_UNIVERSE, sk->sk_protocol, in ping_v4_sendmsg()
794 inet_sk_flowi_flags(sk), faddr, saddr, 0, 0); in ping_v4_sendmsg()
796 security_sk_classify_flow(sk, flowi4_to_flowi(&fl4)); in ping_v4_sendmsg()
797 rt = ip_route_output_flow(net, &fl4, sk); in ping_v4_sendmsg()
808 !sock_flag(sk, SOCK_BROADCAST)) in ping_v4_sendmsg()
818 lock_sock(sk); in ping_v4_sendmsg()
829 err = ip_append_data(sk, &fl4, ping_getfrag, &pfh, len, in ping_v4_sendmsg()
832 ip_flush_pending_frames(sk); in ping_v4_sendmsg()
834 err = ping_v4_push_pending_frames(sk, &pfh, &fl4); in ping_v4_sendmsg()
835 release_sock(sk); in ping_v4_sendmsg()
842 icmp_out_count(sock_net(sk), user_icmph.type); in ping_v4_sendmsg()
855 int ping_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int noblock, in ping_recvmsg() argument
858 struct inet_sock *isk = inet_sk(sk); in ping_recvmsg()
859 int family = sk->sk_family; in ping_recvmsg()
870 return inet_recv_error(sk, msg, len, addr_len); in ping_recvmsg()
872 skb = skb_recv_datagram(sk, flags, noblock, &err); in ping_recvmsg()
887 sock_recv_timestamp(msg, sk, skb); in ping_recvmsg()
906 struct ipv6_pinfo *np = inet6_sk(sk); in ping_recvmsg()
923 if (inet6_sk(sk)->rxopt.all) in ping_recvmsg()
924 pingv6_ops.ip6_datagram_recv_common_ctl(sk, msg, skb); in ping_recvmsg()
926 inet6_sk(sk)->rxopt.all) in ping_recvmsg()
927 pingv6_ops.ip6_datagram_recv_specific_ctl(sk, msg, skb); in ping_recvmsg()
938 skb_free_datagram(sk, skb); in ping_recvmsg()
945 int ping_queue_rcv_skb(struct sock *sk, struct sk_buff *skb) in ping_queue_rcv_skb() argument
948 inet_sk(sk), inet_sk(sk)->inet_num, skb); in ping_queue_rcv_skb()
949 if (sock_queue_rcv_skb(sk, skb) < 0) { in ping_queue_rcv_skb()
965 struct sock *sk; in ping_rcv() local
977 sk = ping_lookup(net, skb, ntohs(icmph->un.echo.id)); in ping_rcv()
978 if (sk) { in ping_rcv()
981 pr_debug("rcv on socket %p\n", sk); in ping_rcv()
983 ping_queue_rcv_skb(sk, skb2); in ping_rcv()
984 sock_put(sk); in ping_rcv()
1018 struct sock *sk; in ping_get_first() local
1032 sk_nulls_for_each(sk, node, hslot) { in ping_get_first()
1033 if (net_eq(sock_net(sk), net) && in ping_get_first()
1034 sk->sk_family == state->family) in ping_get_first()
1038 sk = NULL; in ping_get_first()
1040 return sk; in ping_get_first()
1043 static struct sock *ping_get_next(struct seq_file *seq, struct sock *sk) in ping_get_next() argument
1049 sk = sk_nulls_next(sk); in ping_get_next()
1050 } while (sk && (!net_eq(sock_net(sk), net))); in ping_get_next()
1052 if (!sk) in ping_get_next()
1054 return sk; in ping_get_next()
1059 struct sock *sk = ping_get_first(seq, 0); in ping_get_idx() local
1061 if (sk) in ping_get_idx()
1062 while (pos && (sk = ping_get_next(seq, sk)) != NULL) in ping_get_idx()
1064 return pos ? NULL : sk; in ping_get_idx()
1086 struct sock *sk; in ping_seq_next() local
1089 sk = ping_get_idx(seq, 0); in ping_seq_next()
1091 sk = ping_get_next(seq, v); in ping_seq_next()
1094 return sk; in ping_seq_next()