Lines Matching refs:sk
54 static inline struct l2tp_ip6_sock *l2tp_ip6_sk(const struct sock *sk) in l2tp_ip6_sk() argument
56 return (struct l2tp_ip6_sock *)sk; in l2tp_ip6_sk()
63 struct sock *sk; in __l2tp_ip6_bind_lookup() local
65 sk_for_each_bound(sk, &l2tp_ip6_bind_table) { in __l2tp_ip6_bind_lookup()
66 const struct in6_addr *addr = inet6_rcv_saddr(sk); in __l2tp_ip6_bind_lookup()
67 struct l2tp_ip6_sock *l2tp = l2tp_ip6_sk(sk); in __l2tp_ip6_bind_lookup()
73 net_eq(sock_net(sk), net) && in __l2tp_ip6_bind_lookup()
75 !(sk->sk_bound_dev_if && sk->sk_bound_dev_if != dif)) in __l2tp_ip6_bind_lookup()
79 sk = NULL; in __l2tp_ip6_bind_lookup()
81 return sk; in __l2tp_ip6_bind_lookup()
88 struct sock *sk = __l2tp_ip6_bind_lookup(net, laddr, dif, tunnel_id); in l2tp_ip6_bind_lookup() local
89 if (sk) in l2tp_ip6_bind_lookup()
90 sock_hold(sk); in l2tp_ip6_bind_lookup()
92 return sk; in l2tp_ip6_bind_lookup()
130 struct sock *sk; in l2tp_ip6_recv() local
190 sk = tunnel->sock; in l2tp_ip6_recv()
195 sk = __l2tp_ip6_bind_lookup(&init_net, &iph->daddr, in l2tp_ip6_recv()
200 if (sk == NULL) in l2tp_ip6_recv()
203 sock_hold(sk); in l2tp_ip6_recv()
205 if (!xfrm6_policy_check(sk, XFRM_POLICY_IN, skb)) in l2tp_ip6_recv()
210 return sk_receive_skb(sk, skb, 1); in l2tp_ip6_recv()
213 sock_put(sk); in l2tp_ip6_recv()
220 static int l2tp_ip6_open(struct sock *sk) in l2tp_ip6_open() argument
223 inet_sk(sk)->inet_num = IPPROTO_L2TP; in l2tp_ip6_open()
226 sk_add_node(sk, &l2tp_ip6_table); in l2tp_ip6_open()
232 static void l2tp_ip6_close(struct sock *sk, long timeout) in l2tp_ip6_close() argument
235 hlist_del_init(&sk->sk_bind_node); in l2tp_ip6_close()
236 sk_del_node_init(sk); in l2tp_ip6_close()
239 sk_common_release(sk); in l2tp_ip6_close()
242 static void l2tp_ip6_destroy_sock(struct sock *sk) in l2tp_ip6_destroy_sock() argument
244 struct l2tp_tunnel *tunnel = l2tp_sock_to_tunnel(sk); in l2tp_ip6_destroy_sock()
246 lock_sock(sk); in l2tp_ip6_destroy_sock()
247 ip6_flush_pending_frames(sk); in l2tp_ip6_destroy_sock()
248 release_sock(sk); in l2tp_ip6_destroy_sock()
252 sock_put(sk); in l2tp_ip6_destroy_sock()
255 inet6_destroy_sock(sk); in l2tp_ip6_destroy_sock()
258 static int l2tp_ip6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len) in l2tp_ip6_bind() argument
260 struct inet_sock *inet = inet_sk(sk); in l2tp_ip6_bind()
261 struct ipv6_pinfo *np = inet6_sk(sk); in l2tp_ip6_bind()
267 if (!sock_flag(sk, SOCK_ZAPPED)) in l2tp_ip6_bind()
287 sk->sk_bound_dev_if, addr->l2tp_conn_id)) in l2tp_ip6_bind()
291 lock_sock(sk); in l2tp_ip6_bind()
294 if (sk->sk_state != TCP_CLOSE) in l2tp_ip6_bind()
308 sk->sk_bound_dev_if = addr->l2tp_scope_id; in l2tp_ip6_bind()
313 if (!sk->sk_bound_dev_if) in l2tp_ip6_bind()
317 dev = dev_get_by_index_rcu(sock_net(sk), in l2tp_ip6_bind()
318 sk->sk_bound_dev_if); in l2tp_ip6_bind()
328 if (!ipv6_chk_addr(sock_net(sk), &addr->l2tp_addr, dev, 0)) in l2tp_ip6_bind()
334 sk->sk_v6_rcv_saddr = addr->l2tp_addr; in l2tp_ip6_bind()
337 l2tp_ip6_sk(sk)->conn_id = addr->l2tp_conn_id; in l2tp_ip6_bind()
340 sk_add_bind_node(sk, &l2tp_ip6_bind_table); in l2tp_ip6_bind()
341 sk_del_node_init(sk); in l2tp_ip6_bind()
344 sock_reset_flag(sk, SOCK_ZAPPED); in l2tp_ip6_bind()
345 release_sock(sk); in l2tp_ip6_bind()
351 release_sock(sk); in l2tp_ip6_bind()
359 static int l2tp_ip6_connect(struct sock *sk, struct sockaddr *uaddr, in l2tp_ip6_connect() argument
368 if (sock_flag(sk, SOCK_ZAPPED)) /* Must bind first - autobinding does not work */ in l2tp_ip6_connect()
387 rc = ip6_datagram_connect(sk, uaddr, addr_len); in l2tp_ip6_connect()
389 lock_sock(sk); in l2tp_ip6_connect()
391 l2tp_ip6_sk(sk)->peer_conn_id = lsa->l2tp_conn_id; in l2tp_ip6_connect()
394 hlist_del_init(&sk->sk_bind_node); in l2tp_ip6_connect()
395 sk_add_bind_node(sk, &l2tp_ip6_bind_table); in l2tp_ip6_connect()
398 release_sock(sk); in l2tp_ip6_connect()
403 static int l2tp_ip6_disconnect(struct sock *sk, int flags) in l2tp_ip6_disconnect() argument
405 if (sock_flag(sk, SOCK_ZAPPED)) in l2tp_ip6_disconnect()
408 return udp_disconnect(sk, flags); in l2tp_ip6_disconnect()
415 struct sock *sk = sock->sk; in l2tp_ip6_getname() local
416 struct ipv6_pinfo *np = inet6_sk(sk); in l2tp_ip6_getname()
417 struct l2tp_ip6_sock *lsk = l2tp_ip6_sk(sk); in l2tp_ip6_getname()
427 lsa->l2tp_addr = sk->sk_v6_daddr; in l2tp_ip6_getname()
431 if (ipv6_addr_any(&sk->sk_v6_rcv_saddr)) in l2tp_ip6_getname()
434 lsa->l2tp_addr = sk->sk_v6_rcv_saddr; in l2tp_ip6_getname()
439 lsa->l2tp_scope_id = sk->sk_bound_dev_if; in l2tp_ip6_getname()
444 static int l2tp_ip6_backlog_recv(struct sock *sk, struct sk_buff *skb) in l2tp_ip6_backlog_recv() argument
449 rc = sock_queue_rcv_skb(sk, skb); in l2tp_ip6_backlog_recv()
461 static int l2tp_ip6_push_pending_frames(struct sock *sk) in l2tp_ip6_push_pending_frames() argument
467 skb = skb_peek(&sk->sk_write_queue); in l2tp_ip6_push_pending_frames()
474 err = ip6_push_pending_frames(sk); in l2tp_ip6_push_pending_frames()
483 static int l2tp_ip6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) in l2tp_ip6_sendmsg() argument
488 struct ipv6_pinfo *np = inet6_sk(sk); in l2tp_ip6_sendmsg()
517 fl6.flowi6_mark = sk->sk_mark; in l2tp_ip6_sendmsg()
530 flowlabel = fl6_sock_lookup(sk, fl6.flowlabel); in l2tp_ip6_sendmsg()
540 if (sk->sk_state == TCP_ESTABLISHED && in l2tp_ip6_sendmsg()
541 ipv6_addr_equal(daddr, &sk->sk_v6_daddr)) in l2tp_ip6_sendmsg()
542 daddr = &sk->sk_v6_daddr; in l2tp_ip6_sendmsg()
549 if (sk->sk_state != TCP_ESTABLISHED) in l2tp_ip6_sendmsg()
552 daddr = &sk->sk_v6_daddr; in l2tp_ip6_sendmsg()
557 fl6.flowi6_oif = sk->sk_bound_dev_if; in l2tp_ip6_sendmsg()
564 err = ip6_datagram_send_ctl(sock_net(sk), sk, msg, &fl6, opt, in l2tp_ip6_sendmsg()
571 flowlabel = fl6_sock_lookup(sk, fl6.flowlabel); in l2tp_ip6_sendmsg()
587 fl6.flowi6_proto = sk->sk_protocol; in l2tp_ip6_sendmsg()
602 security_sk_classify_flow(sk, flowi6_to_flowi(&fl6)); in l2tp_ip6_sendmsg()
604 dst = ip6_dst_lookup_flow(sk, &fl6, final_p); in l2tp_ip6_sendmsg()
623 lock_sock(sk); in l2tp_ip6_sendmsg()
624 err = ip6_append_data(sk, ip_generic_getfrag, msg, in l2tp_ip6_sendmsg()
629 ip6_flush_pending_frames(sk); in l2tp_ip6_sendmsg()
631 err = l2tp_ip6_push_pending_frames(sk); in l2tp_ip6_sendmsg()
632 release_sock(sk); in l2tp_ip6_sendmsg()
649 static int l2tp_ip6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, in l2tp_ip6_recvmsg() argument
652 struct ipv6_pinfo *np = inet6_sk(sk); in l2tp_ip6_recvmsg()
665 return ipv6_recv_error(sk, msg, len, addr_len); in l2tp_ip6_recvmsg()
667 skb = skb_recv_datagram(sk, flags, noblock, &err); in l2tp_ip6_recvmsg()
681 sock_recv_timestamp(msg, sk, skb); in l2tp_ip6_recvmsg()
696 ip6_datagram_recv_ctl(sk, msg, skb); in l2tp_ip6_recvmsg()
701 skb_free_datagram(sk, skb); in l2tp_ip6_recvmsg()