static int kclient_connect(int descidx) { int ret; struct sock *sk; kclient_desc_t *desc = *(kclient_desc + descidx / KCLIENT_NCONNECTS) + descidx % KCLIENT_NCONNECTS; ret = ss_sock_create(kclient_server_address.sa.sa_family, SOCK_STREAM, IPPROTO_TCP, &sk); if (ret) { SS_DBG("Unable to create kernel socket (%d)\n", ret); desc->flags |= KCLIENT_CONNECT_ERROR; atomic_inc(&kclient_connect_nerror); return ret; } ss_proto_init(&desc->proto, &kclient_hooks, descidx); rcu_assign_sk_user_data(sk, &desc->proto); ss_set_callbacks(sk); ret = ss_connect(sk, &kclient_server_address.sa, tfw_addr_sa_len(&kclient_server_address), 0); if (ret) { SS_DBG("Connect error on server socket sk %p (%d)\n", sk, ret); ss_release(sk); desc->flags |= KCLIENT_CONNECT_ERROR; atomic_inc(&kclient_connect_nerror); return ret; } desc->sk = sk; desc->flags |= KCLIENT_CONNECT_STARTED; atomic_inc(&kclient_connect_nattempt); return 0; }
static int tfw_bmb_connect(int tn, int cn) { int ret; struct sock *sk; TfwBmbConn *conn; conn = &bmb_task[tn].conn[cn]; ret = ss_sock_create(bmb_server_address.sa.sa_family, SOCK_STREAM, IPPROTO_TCP, &sk); if (ret) { TFW_ERR("Unable to create kernel socket (%d)\n", ret); return ret; } ss_proto_init(&conn->proto, &bmb_hooks, tn * nconns + cn); rcu_assign_sk_user_data(sk, &conn->proto); ss_set_callbacks(sk); ret = ss_connect(sk, &bmb_server_address.sa, tfw_addr_sa_len(&bmb_server_address), 0); if (ret) { TFW_ERR("Connect error on server socket sk %p (%d)\n", sk, ret); tfw_connection_unlink_from_sk(sk); ss_close(sk); return ret; } conn->sk = sk; bmb_task[tn].conn_attempt++; return 0; }
/** * Parse IP address, create a socket and bind it with the address, * but not yet start listening. */ static int add_listen_sock(TfwAddr *addr, int type) { int r; SsProto *proto; struct socket *s; if (listen_socks_n == ARRAY_SIZE(listen_socks)) { TFW_ERR("maximum number of listen sockets (%d) is reached\n", listen_socks_n); return -ENOBUFS; } r = sock_create_kern(addr->sa.sa_family, SOCK_STREAM, IPPROTO_TCP, &s); if (r) { TFW_ERR("can't create socket (err: %d)\n", r); return r; } inet_sk(s->sk)->freebind = 1; s->sk->sk_reuse = 1; r = s->ops->bind(s, &addr->sa, tfw_addr_sa_len(addr)); if (r) { TFW_ERR_ADDR("can't bind to", addr); sock_release(s); return r; } proto = &protos[listen_socks_n]; proto->type = type; BUG_ON(proto->listener); ss_tcp_set_listen(s, proto); TFW_DBG("created front-end socket: sk=%p\n", s->sk); BUG_ON(listen_socks[listen_socks_n]); listen_socks[listen_socks_n] = s; ++listen_socks_n; return 0; }