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