Lines Matching refs:sk

41 static int llc_ui_wait_for_conn(struct sock *sk, long timeout);
42 static int llc_ui_wait_for_disc(struct sock *sk, long timeout);
43 static int llc_ui_wait_for_busy_core(struct sock *sk, long timeout);
95 static inline u8 llc_ui_header_len(struct sock *sk, struct sockaddr_llc *addr) in llc_ui_header_len() argument
101 else if (sk->sk_type == SOCK_STREAM) in llc_ui_header_len()
115 static int llc_ui_send_data(struct sock* sk, struct sk_buff *skb, int noblock) in llc_ui_send_data() argument
117 struct llc_sock* llc = llc_sk(sk); in llc_ui_send_data()
123 long timeout = sock_sndtimeo(sk, noblock); in llc_ui_send_data()
125 rc = llc_ui_wait_for_busy_core(sk, timeout); in llc_ui_send_data()
128 rc = llc_build_and_send_pkt(sk, skb); in llc_ui_send_data()
132 static void llc_ui_sk_init(struct socket *sock, struct sock *sk) in llc_ui_sk_init() argument
134 sock_graft(sk, sock); in llc_ui_sk_init()
135 sk->sk_type = sock->type; in llc_ui_sk_init()
160 struct sock *sk; in llc_ui_create() local
171 sk = llc_sk_alloc(net, PF_LLC, GFP_KERNEL, &llc_proto, kern); in llc_ui_create()
172 if (sk) { in llc_ui_create()
174 llc_ui_sk_init(sock, sk); in llc_ui_create()
188 struct sock *sk = sock->sk; in llc_ui_release() local
191 if (unlikely(sk == NULL)) in llc_ui_release()
193 sock_hold(sk); in llc_ui_release()
194 lock_sock(sk); in llc_ui_release()
195 llc = llc_sk(sk); in llc_ui_release()
198 if (!llc_send_disc(sk)) in llc_ui_release()
199 llc_ui_wait_for_disc(sk, sk->sk_rcvtimeo); in llc_ui_release()
200 if (!sock_flag(sk, SOCK_ZAPPED)) in llc_ui_release()
201 llc_sap_remove_socket(llc->sap, sk); in llc_ui_release()
202 release_sock(sk); in llc_ui_release()
205 sock_put(sk); in llc_ui_release()
206 llc_sk_free(sk); in llc_ui_release()
253 struct sock *sk = sock->sk; in llc_ui_autobind() local
254 struct llc_sock *llc = llc_sk(sk); in llc_ui_autobind()
258 if (!sock_flag(sk, SOCK_ZAPPED)) in llc_ui_autobind()
261 if (sk->sk_bound_dev_if) { in llc_ui_autobind()
262 llc->dev = dev_get_by_index(&init_net, sk->sk_bound_dev_if); in llc_ui_autobind()
282 llc_sap_add_socket(sap, sk); in llc_ui_autobind()
283 sock_reset_flag(sk, SOCK_ZAPPED); in llc_ui_autobind()
306 struct sock *sk = sock->sk; in llc_ui_bind() local
307 struct llc_sock *llc = llc_sk(sk); in llc_ui_bind()
312 if (unlikely(!sock_flag(sk, SOCK_ZAPPED) || addrlen != sizeof(*addr))) in llc_ui_bind()
319 if (sk->sk_bound_dev_if) { in llc_ui_bind()
320 llc->dev = dev_get_by_index_rcu(&init_net, sk->sk_bound_dev_if); in llc_ui_bind()
377 llc_sap_add_socket(sap, sk); in llc_ui_bind()
378 sock_reset_flag(sk, SOCK_ZAPPED); in llc_ui_bind()
399 struct sock *sk = sock->sk; in llc_ui_shutdown() local
402 lock_sock(sk); in llc_ui_shutdown()
403 if (unlikely(sk->sk_state != TCP_ESTABLISHED)) in llc_ui_shutdown()
408 rc = llc_send_disc(sk); in llc_ui_shutdown()
410 rc = llc_ui_wait_for_disc(sk, sk->sk_rcvtimeo); in llc_ui_shutdown()
412 sk->sk_state_change(sk); in llc_ui_shutdown()
414 release_sock(sk); in llc_ui_shutdown()
435 struct sock *sk = sock->sk; in llc_ui_connect() local
436 struct llc_sock *llc = llc_sk(sk); in llc_ui_connect()
440 lock_sock(sk); in llc_ui_connect()
446 if (unlikely(sk->sk_type != SOCK_STREAM)) in llc_ui_connect()
452 if (sock_flag(sk, SOCK_ZAPPED)) { in llc_ui_connect()
461 sk->sk_state = TCP_SYN_SENT; in llc_ui_connect()
463 rc = llc_establish_connection(sk, llc->dev->dev_addr, in llc_ui_connect()
468 sk->sk_state = TCP_CLOSE; in llc_ui_connect()
472 if (sk->sk_state == TCP_SYN_SENT) { in llc_ui_connect()
473 const long timeo = sock_sndtimeo(sk, flags & O_NONBLOCK); in llc_ui_connect()
475 if (!timeo || !llc_ui_wait_for_conn(sk, timeo)) in llc_ui_connect()
483 if (sk->sk_state == TCP_CLOSE) in llc_ui_connect()
489 release_sock(sk); in llc_ui_connect()
492 rc = sock_error(sk) ? : -ECONNABORTED; in llc_ui_connect()
507 struct sock *sk = sock->sk; in llc_ui_listen() local
510 lock_sock(sk); in llc_ui_listen()
514 if (unlikely(sk->sk_type != SOCK_STREAM)) in llc_ui_listen()
517 if (sock_flag(sk, SOCK_ZAPPED)) in llc_ui_listen()
522 sk->sk_max_ack_backlog = backlog; in llc_ui_listen()
523 if (sk->sk_state != TCP_LISTEN) { in llc_ui_listen()
524 sk->sk_ack_backlog = 0; in llc_ui_listen()
525 sk->sk_state = TCP_LISTEN; in llc_ui_listen()
527 sk->sk_socket->flags |= __SO_ACCEPTCON; in llc_ui_listen()
529 release_sock(sk); in llc_ui_listen()
533 static int llc_ui_wait_for_disc(struct sock *sk, long timeout) in llc_ui_wait_for_disc() argument
539 prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE); in llc_ui_wait_for_disc()
540 if (sk_wait_event(sk, &timeout, sk->sk_state == TCP_CLOSE)) in llc_ui_wait_for_disc()
550 finish_wait(sk_sleep(sk), &wait); in llc_ui_wait_for_disc()
554 static int llc_ui_wait_for_conn(struct sock *sk, long timeout) in llc_ui_wait_for_conn() argument
559 prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE); in llc_ui_wait_for_conn()
560 if (sk_wait_event(sk, &timeout, sk->sk_state != TCP_SYN_SENT)) in llc_ui_wait_for_conn()
565 finish_wait(sk_sleep(sk), &wait); in llc_ui_wait_for_conn()
569 static int llc_ui_wait_for_busy_core(struct sock *sk, long timeout) in llc_ui_wait_for_busy_core() argument
572 struct llc_sock *llc = llc_sk(sk); in llc_ui_wait_for_busy_core()
576 prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE); in llc_ui_wait_for_busy_core()
578 if (sk_wait_event(sk, &timeout, in llc_ui_wait_for_busy_core()
579 (sk->sk_shutdown & RCV_SHUTDOWN) || in llc_ui_wait_for_busy_core()
591 finish_wait(sk_sleep(sk), &wait); in llc_ui_wait_for_busy_core()
595 static int llc_wait_data(struct sock *sk, long timeo) in llc_wait_data() argument
603 rc = sock_error(sk); in llc_wait_data()
607 if (sk->sk_shutdown & RCV_SHUTDOWN) in llc_wait_data()
616 if (sk_wait_data(sk, &timeo, NULL)) in llc_wait_data()
624 struct llc_sock *llc = llc_sk(skb->sk); in llc_cmsg_rcv()
630 info.lpi_ifindex = llc_sk(skb->sk)->dev->ifindex; in llc_cmsg_rcv()
648 struct sock *sk = sock->sk, *newsk; in llc_ui_accept() local
654 llc_sk(sk)->laddr.lsap); in llc_ui_accept()
655 lock_sock(sk); in llc_ui_accept()
656 if (unlikely(sk->sk_type != SOCK_STREAM)) in llc_ui_accept()
660 sk->sk_state != TCP_LISTEN)) in llc_ui_accept()
663 if (skb_queue_empty(&sk->sk_receive_queue)) { in llc_ui_accept()
664 rc = llc_wait_data(sk, sk->sk_rcvtimeo); in llc_ui_accept()
669 llc_sk(sk)->laddr.lsap); in llc_ui_accept()
670 skb = skb_dequeue(&sk->sk_receive_queue); in llc_ui_accept()
672 if (!skb->sk) in llc_ui_accept()
675 newsk = skb->sk; in llc_ui_accept()
681 llc = llc_sk(sk); in llc_ui_accept()
687 sk->sk_state = TCP_LISTEN; in llc_ui_accept()
688 sk->sk_ack_backlog--; in llc_ui_accept()
690 llc_sk(sk)->addr.sllc_sap, newllc->daddr.lsap); in llc_ui_accept()
694 release_sock(sk); in llc_ui_accept()
714 struct sock *sk = sock->sk; in llc_ui_recvmsg() local
715 struct llc_sock *llc = llc_sk(sk); in llc_ui_recvmsg()
724 lock_sock(sk); in llc_ui_recvmsg()
726 if (unlikely(sk->sk_type == SOCK_STREAM && sk->sk_state == TCP_LISTEN)) in llc_ui_recvmsg()
729 timeo = sock_rcvtimeo(sk, nonblock); in llc_ui_recvmsg()
737 target = sock_rcvlowat(sk, flags & MSG_WAITALL, len); in llc_ui_recvmsg()
757 skb = skb_peek(&sk->sk_receive_queue); in llc_ui_recvmsg()
764 if (copied >= target && !sk->sk_backlog.tail) in llc_ui_recvmsg()
768 if (sk->sk_err || in llc_ui_recvmsg()
769 sk->sk_state == TCP_CLOSE || in llc_ui_recvmsg()
770 (sk->sk_shutdown & RCV_SHUTDOWN) || in llc_ui_recvmsg()
775 if (sock_flag(sk, SOCK_DONE)) in llc_ui_recvmsg()
778 if (sk->sk_err) { in llc_ui_recvmsg()
779 copied = sock_error(sk); in llc_ui_recvmsg()
782 if (sk->sk_shutdown & RCV_SHUTDOWN) in llc_ui_recvmsg()
785 if (sk->sk_type == SOCK_STREAM && sk->sk_state == TCP_CLOSE) { in llc_ui_recvmsg()
786 if (!sock_flag(sk, SOCK_DONE)) { in llc_ui_recvmsg()
803 release_sock(sk); in llc_ui_recvmsg()
804 lock_sock(sk); in llc_ui_recvmsg()
806 sk_wait_data(sk, &timeo, NULL); in llc_ui_recvmsg()
837 if (sk->sk_type != SOCK_STREAM) in llc_ui_recvmsg()
841 spin_lock_irqsave(&sk->sk_receive_queue.lock, cpu_flags); in llc_ui_recvmsg()
842 sk_eat_skb(sk, skb); in llc_ui_recvmsg()
843 spin_unlock_irqrestore(&sk->sk_receive_queue.lock, cpu_flags); in llc_ui_recvmsg()
853 release_sock(sk); in llc_ui_recvmsg()
860 if (llc_sk(sk)->cmsg_flags) in llc_ui_recvmsg()
864 spin_lock_irqsave(&sk->sk_receive_queue.lock, cpu_flags); in llc_ui_recvmsg()
865 sk_eat_skb(sk, skb); in llc_ui_recvmsg()
866 spin_unlock_irqrestore(&sk->sk_receive_queue.lock, cpu_flags); in llc_ui_recvmsg()
884 struct sock *sk = sock->sk; in llc_ui_sendmsg() local
885 struct llc_sock *llc = llc_sk(sk); in llc_ui_sendmsg()
895 lock_sock(sk); in llc_ui_sendmsg()
905 if (sock_flag(sk, SOCK_ZAPPED)) { in llc_ui_sendmsg()
911 hdrlen = llc->dev->hard_header_len + llc_ui_header_len(sk, addr); in llc_ui_sendmsg()
916 release_sock(sk); in llc_ui_sendmsg()
917 skb = sock_alloc_send_skb(sk, size, noblock, &rc); in llc_ui_sendmsg()
918 lock_sock(sk); in llc_ui_sendmsg()
927 if (sk->sk_type == SOCK_DGRAM || addr->sllc_ua) { in llc_ui_sendmsg()
943 if (!(sk->sk_type == SOCK_STREAM && !addr->sllc_ua)) in llc_ui_sendmsg()
945 rc = llc_ui_send_data(sk, skb, noblock); in llc_ui_sendmsg()
953 release_sock(sk); in llc_ui_sendmsg()
970 struct sock *sk = sock->sk; in llc_ui_getname() local
971 struct llc_sock *llc = llc_sk(sk); in llc_ui_getname()
975 lock_sock(sk); in llc_ui_getname()
976 if (sock_flag(sk, SOCK_ZAPPED)) in llc_ui_getname()
981 if (sk->sk_state != TCP_ESTABLISHED) in llc_ui_getname()
1003 release_sock(sk); in llc_ui_getname()
1034 struct sock *sk = sock->sk; in llc_ui_setsockopt() local
1035 struct llc_sock *llc = llc_sk(sk); in llc_ui_setsockopt()
1039 lock_sock(sk); in llc_ui_setsockopt()
1099 release_sock(sk); in llc_ui_setsockopt()
1116 struct sock *sk = sock->sk; in llc_ui_getsockopt() local
1117 struct llc_sock *llc = llc_sk(sk); in llc_ui_getsockopt()
1120 lock_sock(sk); in llc_ui_getsockopt()
1157 release_sock(sk); in llc_ui_getsockopt()