/* * This callback function is invoked when a new connection can be accepted on socket. * It looks up the parent (listening) socket for the newly established connection * and inserts it into the accept queue * which is processed in periodic function app_glue_periodic * Paramters: a pointer to struct sock * Returns: void * */ static void app_glue_sock_wakeup(struct sock *sk) { struct sock *sock; struct tcp_sock *tp; tp = tcp_sk(sk); sock = __inet_lookup_listener(&init_net/*sk->sk_net*/, &tcp_hashinfo, sk->sk_daddr, sk->sk_dport/*__be16 sport*/, sk->sk_rcv_saddr, ntohs(tp->inet_conn.icsk_inet.inet_sport),//sk->sk_num/*const unsigned short hnum*/, sk->sk_bound_dev_if); if(sock) { if(sock->sk_socket->accept_queue_present) { return; } sock_hold(sock); sock->sk_socket->accept_queue_present = 1; TAILQ_INSERT_TAIL(&accept_ready_socket_list_head,sock->sk_socket,accept_queue_entry); } else { struct tcp_sock *tp; tp = tcp_sk(sk); app_glue_sock_write_space(sk); //syslog(LOG_INFO,"%s %d %x %d %x %d %d \n",__FILE__,__LINE__,sk->sk_daddr,sk->sk_dport,sk->sk_rcv_saddr,sk->sk_num,tp->inet_conn.icsk_inet.inet_sport); } sock_reset_flag(sk,SOCK_USE_WRITE_QUEUE); sk->sk_data_ready = app_glue_sock_readable; sk->sk_write_space = app_glue_sock_write_space; sk->sk_error_report = app_glue_sock_error_report; }
struct sock * nf_tproxy_get_sock_v4(struct net *net, const u8 protocol, const __be32 saddr, const __be32 daddr, const __be16 sport, const __be16 dport, const struct net_device *in, bool listening_only) { struct sock *sk; switch (protocol) { case IPPROTO_TCP: if (listening_only) sk = __inet_lookup_listener(net, &tcp_hashinfo, daddr, ntohs(dport), in->ifindex); else sk = __inet_lookup(net, &tcp_hashinfo, saddr, sport, daddr, dport, in->ifindex); break; case IPPROTO_UDP: sk = udp4_lib_lookup(net, saddr, sport, daddr, dport, in->ifindex); break; default: WARN_ON(1); sk = NULL; } pr_debug("tproxy socket lookup: proto %u %08x:%u -> %08x:%u, listener only: %d, sock %p\n", protocol, ntohl(saddr), ntohs(sport), ntohl(daddr), ntohs(dport), listening_only, sk); return sk; }