From d0aba434f02aa9d35ce03369b91b796b48a6fb24 Mon Sep 17 00:00:00 2001 From: Cornel Mercan Date: Sat, 4 Jun 2011 04:34:43 -0700 Subject: [PATCH] Implemented swift_connect function --- src/kernel/swift.c | 80 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 72 insertions(+), 8 deletions(-) diff --git a/src/kernel/swift.c b/src/kernel/swift.c index 80059f7..e32d657 100644 --- a/src/kernel/swift.c +++ b/src/kernel/swift.c @@ -15,7 +15,6 @@ struct swift_sock { /* swift socket speciffic data */ __be16 src; __be16 dst; - __be16 len; }; static struct swift_sock * sock_port_map[MAX_SWIFT_PORT]; @@ -129,8 +128,70 @@ out: static int swift_connect(struct socket *sock, struct sockaddr *addr, int addr_len, int flags) { + int err; + struct sock * sk; + struct inet_sock * isk; + struct swift_sock * ssk; + printk(KERN_DEBUG "swift_connect\n"); + + 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); + return 0; + +out: + return err; + } static int swift_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len) @@ -161,16 +222,19 @@ static int swift_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr goto out; } - err = -ENOMEM; - sport = get_next_free_port(); - if (sport == 0) { - printk(KERN_ERR "No free ports\n"); - goto out; - } - isk = inet_sk(sk); ssk = swift_sk(sk); + sport = ssk->src; + if (sport == 0) { + err = -ENOMEM; + sport = get_next_free_port(); + if (sport == 0) { + printk(KERN_ERR "No free ports\n"); + goto out; + } + } + if (msg->msg_name) { struct sockaddr_swift * swift_addr = (struct sockaddr_swift *) msg->msg_name; -- 2.20.1