+ int err;
+ struct sock * sk;
+ struct inet_sock * isk;
+ struct swift_sock * ssk;
+
+ log_debug("swift_connect\n");
+
+ if (unlikely(sock == NULL)) {
+ log_error("Sock is NULL\n");
+ err = -EINVAL;
+ goto out;
+ }
+ sk = sock->sk;
+
+ if (unlikely(sk == NULL)) {
+ log_error("Sock->sk is NULL\n");
+ err = -EINVAL;
+ goto out;
+ }
+
+ isk = inet_sk(sk);
+ ssk = swift_sk(sk);
+
+ if (unlikely(ssk->src != 0)) {
+ log_error("ssk->src is not NULL\n");
+ err = -EINVAL;
+ goto out;
+ }
+
+ if (likely(addr)) {
+ struct sockaddr_swift * swift_addr = (struct sockaddr_swift *) addr;
+
+ if (unlikely(addr_len < sizeof(*swift_addr) || swift_addr->sin_family != AF_INET)) {
+ log_error("Invalid size or address family\n");
+ err = -EINVAL;
+ goto out;
+ }
+ ssk->dst = ntohs(swift_addr->sin_port);
+ if (unlikely(ssk->dst == 0 || ssk->dst >= MAX_SWIFT_PORT)) {
+ log_error("Invalid value for destination port(%u)\n", ssk->dst);
+ err = -EINVAL;
+ goto out;
+ }
+
+ isk->inet_daddr = swift_addr->sin_addr.s_addr;
+ log_debug("Received from user space destination port=%u and address=%u\n", ssk->dst, isk->inet_daddr);
+ } else {
+ log_error("Invalid swift_addr (NULL)\n");
+ err = -EINVAL;
+ goto out;
+ }
+
+ ssk->src = get_next_free_port();
+ if (unlikely(ssk->src == 0)) {
+ log_error("No free ports\n");
+ err = -ENOMEM;
+ goto out;
+ }
+
+ swift_hash(ssk->src, ssk);
+