X-Git-Url: http://p2p-next.cs.pub.ro/gitweb/?a=blobdiff_plain;f=src%2Fkernel%2Fswift.c;h=270b43b78a44ccb357040ec477f2af8083db9299;hb=ade3730ffddebf5ecb6505a718d36d7d6f543db3;hp=1df2d58a3f03f8a21dc7583bf0a87db94d0ac3a0;hpb=9207b82a02db5c13c890b5d31d66f62600a4886e;p=swifty.git diff --git a/src/kernel/swift.c b/src/kernel/swift.c index 1df2d58..270b43b 100644 --- a/src/kernel/swift.c +++ b/src/kernel/swift.c @@ -110,6 +110,7 @@ static int swift_bind(struct socket *sock, struct sockaddr *addr, int addr_len) } ssk = swift_sk(sock->sk); + sock->sk->sk_rcvbuf = 10 * 1024 * 1024; ssk->src = port; swift_hash(port, ssk); @@ -269,6 +270,7 @@ static int swift_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr for (i = 0; i < dests; i++) { struct swift_dest *dest = &swift_addr->dests[i]; struct iovec *iov = &msg->msg_iov[i]; + char *payload; dport = dest->port; if (unlikely(dport == 0 || dport >= MAX_SWIFT_PORT)) { @@ -301,7 +303,8 @@ static int swift_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr shdr->src = sport; shdr->len = ntohs(len + sizeof(struct swifthdr)); - log_debug("payload=%p\n", skb_put(skb, len)); + payload = skb_put(skb, len); + log_debug("payload=%p\n", payload); err = skb_copy_datagram_from_iovec(skb, sizeof(struct swifthdr), iov, 0, len); if (unlikely(err)) { @@ -330,6 +333,7 @@ static int swift_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr #endif } + skb->local_df = 1; err = ip_queue_xmit(skb); if (likely(!err)) log_debug("Sent %u bytes on wire\n", len); @@ -352,41 +356,60 @@ static int swift_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr struct sockaddr_swift *swift_addr; struct sock * sk = sock->sk; int err, copied; + int i; + struct sockaddr_swift *ret_addr = (struct sockaddr_swift *) msg->msg_name; log_debug("Trying to receive sock=%p sk=%p flags=%d\n", sock, sk, flags); skb = skb_recv_datagram(sk, flags, flags & MSG_DONTWAIT, &err); if (unlikely(!skb)) { - log_error("skb_recv_datagram\n"); + log_error("skb_recv_datagram failed with %d\n", err); goto out; } - log_debug("Received skb %p\n", skb); + for (i = 0; i < msg->msg_iovlen; i++) { + log_debug("Received skb %p\n", skb); - swift_addr = (struct sockaddr_swift *) skb->cb; - msg->msg_namelen = sizeof(struct sockaddr_swift); + swift_addr = (struct sockaddr_swift *) skb->cb; - copied = skb->len; - if (copied > len) { - copied = len; - msg->msg_flags |= MSG_TRUNC; - } + copied = skb->len; + if (copied > msg->msg_iov[i].iov_len) { + copied = msg->msg_iov[i].iov_len; + msg->msg_flags |= MSG_TRUNC; + } - err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied); - if (unlikely(err)) { - log_error("skb_copy_datagram_iovec\n"); - goto out_free; - } + err = skb_copy_datagram_iovec(skb, 0, &msg->msg_iov[i], copied); + if (unlikely(err)) { + log_error("skb_copy_datagram_iovec\n"); + goto out_free; + } + log_debug("Received %d bytes\n", copied); - sock_recv_ts_and_drops(msg, sk, skb); + sock_recv_ts_and_drops(msg, sk, skb); - if (msg->msg_name) - memcpy(msg->msg_name, swift_addr, msg->msg_namelen); - - err = copied; + if (ret_addr) { + memcpy(&ret_addr->dests[i], &mptp_addr->dests[0], sizeof(ret_addr->dests[i])); + ret_addr->dests[i].bytes = copied; + } + + err = copied; out_free: - skb_free_datagram(sk, skb); + skb_free_datagram(sk, skb); + + if (i == msg->msg_iovlen - 1) + break; + + skb = skb_recv_datagram(sk, flags, 1, &err); + if (likely(err == -EAGAIN)) { + log_debug("No more skbs in the queue, returning...\n"); + err = copied; + break; + } + } + + ret_addr->count = i + 1; + msg->msg_namelen = sizeof(struct sockaddr_swift) + (i + 1) * sizeof(struct swift_dest); out: return err; @@ -400,6 +423,7 @@ static int swift_rcv(struct sk_buff *skb) uint8_t src, dst; struct sockaddr_swift * swift_addr; int err; + int addr_size = sizeof(struct sockaddr_swift) + sizeof(struct swift_dest); if (unlikely(!pskb_may_pull(skb, sizeof(struct swifthdr)))) { log_error("Insufficient space for header\n"); @@ -439,7 +463,7 @@ static int swift_rcv(struct sk_buff *skb) goto drop; } - BUILD_BUG_ON(sizeof(struct sockaddr_swift) > sizeof(skb->cb)); + BUG_ON(addr_size > sizeof(skb->cb)); swift_addr = (struct sockaddr_swift *) skb->cb; swift_addr->dests[0].port = shdr->src; @@ -449,7 +473,7 @@ static int swift_rcv(struct sk_buff *skb) err = ip_queue_rcv_skb((struct sock *) &ssk->sock, skb); if (unlikely(err)) { - log_error("ip_queu_rcv_skb\n"); + log_error("ip_queue_rcv_skb failed with %d\n", err); consume_skb(skb); } return NET_RX_SUCCESS;