[kitten] push by BrianK...@gmail.com - sendmsg/recvmsg fixed to send/receive UDP iovecs. Currently these work... on 2013-07-09 16:06 GMT

2 views
Skip to first unread message

kit...@googlecode.com

unread,
Jul 9, 2013, 12:07:06 PM7/9/13
to kitten-...@googlegroups.com
Revision: 7a1429105775
Branch: default
Author: Brian Kocoloski <bko...@sandia.gov>
Date: Tue Jul 9 09:06:43 2013
Log: sendmsg/recvmsg fixed to send/receive UDP iovecs. Currently these
work
by copying everything into a separate kernel buffer before invoking
lwip, so performance is not likely to be particularly good
http://code.google.com/p/kitten/source/detail?r=7a1429105775

Modified:
/kernel/netdev.c

=======================================
--- /kernel/netdev.c Mon Jul 8 14:58:49 2013
+++ /kernel/netdev.c Tue Jul 9 09:06:43 2013
@@ -532,6 +532,7 @@
struct iovec * vec;
struct sockaddr * dest;
uint8_t kbuf[msg->msg_namelen];
+ char * databuf;

if (copy_from_user(&kbuf, msg->msg_name, msg->msg_namelen)) {
printk("%s: bad user address %p\n", __func__, (void*) msg->msg_name);
@@ -547,8 +548,16 @@
total = 0;
for (i = 0; i < msg->msg_iovlen; i++) {
vec = &(msg->msg_iov[i]);
- written = lwip_sendto(lwip_from_fd(sockfd), vec->iov_base,
vec->iov_len, flags,
+ databuf = kmem_alloc(vec->iov_len);
+
+ if (copy_from_user(databuf, vec->iov_base, vec->iov_len)) {
+ kmem_free(databuf);
+ return -EFAULT;
+ }
+
+ written = lwip_sendto(lwip_from_fd(sockfd), databuf, vec->iov_len,
flags,
dest, msg->msg_namelen);
+ kmem_free(databuf);

switch (written) {
case -1:
@@ -608,12 +617,22 @@
int i;
ssize_t read, total;
struct iovec * vec;
+ char * databuf;
+ uint8_t kbuf[sizeof(struct sockaddr)];

total = 0;
for (i = 0; i < msg->msg_iovlen; i++) {
vec = &(msg->msg_iov[i]);
- read = lwip_recvfrom(lwip_from_fd(sockfd), vec->iov_base,
vec->iov_len, flags,
- msg->msg_name, &(msg->msg_namelen));
+ databuf = kmem_alloc(vec->iov_len);
+
+ read = lwip_recvfrom(lwip_from_fd(sockfd), databuf, vec->iov_len,
flags,
+ (struct sockaddr *)kbuf, &(msg->msg_namelen));
+
+ if (copy_to_user(vec->iov_base, databuf, vec->iov_len)) {
+ kmem_free(databuf);
+ return -EFAULT;
+ }
+ kmem_free(databuf);

switch (read) {
case -1:
@@ -625,6 +644,15 @@
break;
}
}
+
+ if (translate_sockaddr_to_linux(kbuf, sizeof(struct sockaddr)) < 0) {
+ printk( "%s: bad user address %p translation\n", __func__, (void*) kbuf);
+ return -EFAULT;
+ }
+
+ if (copy_to_user(msg->msg_name, kbuf, msg->msg_namelen)) {
+ return -EFAULT;
+ }

return total;
}
Reply all
Reply to author
Forward
0 new messages