msg没有在linux内核

时间:2016-05-15 09:16:50

标签: linux sockets kernel

我正在使用内核4.5.3,我正在努力实现新的第4层传输协议(本质上是一个新的套接字)。从用户空间应用程序,当我通过我的新套接字发送数据时,我在内核中收到它。在内核中我试图打开缓冲区并尝试验证是否一切正确。从用户空间发送的用户数据被linux内核的套接字层包装成struct msghdr结构(所以我这部分必须是无bug的)。我试图在新的套接字特定sendmsg fn的内核处理程序中打印这个结构。虽然我可以打印所有字段,但是当我打印实际的消息发送(char *)时,它打印为空白。

以下是我写过的转储:

static
void dump_msg_hdr(struct msghdr *msg){

    struct sockaddr_in *dest_addr = NULL;
    struct in_addr dest_ip;
    char ipv4[32], *usermsg = NULL;
    struct iovec *iov = NULL;

    memset(&dest_addr, 0, sizeof(struct sockaddr_in));
    memset(&dest_ip, 0, sizeof(struct in_addr));
    dest_addr = (struct sockaddr_in *)msg->msg_name;
    dest_ip = dest_addr->sin_addr;
    getDotDecimalIpV4(htonl(dest_ip.s_addr), ipv4);
    printk(KERN_INFO "Dest ip address = %s", ipv4);
    iov = msg->msg_iter.iov;
    usermsg = (char *)kmalloc(iov->iov_len, GFP_USER);
    memcpy(usermsg, iov->iov_base, iov->iov_len);
    printk(KERN_INFO "user msg = %s\n", usermsg);
    printk(KERN_INFO "msg->msg_iter.count (no of data bytes) = %d", msg->msg_iter.count);
    printk(KERN_INFO "iov_base = 0x%x, iov_len = %d\n", iov->iov_base, iov->iov_len);
    printk(KERN_INFO "msg->msg_iter.nr_segs (no of iovec segments) = %d", msg->msg_iter.nr_segs);
    kfree(usermsg);
}

输出

Dest ip address = 192.168.6.6
user msg = <blank>
sg->msg_iter.count (no of data bytes) = 27
iov_base = 0xbf95c153, iov_len = 27
msg->msg_iter.nr_segs (no of iovec segments) = 1

结构

struct iov_iter {
int type;
size_t iov_offset;
size_t count;
const struct iovec *iov; /* SIMPLIFIED - see below */
unsigned long nr_segs;
};

 47 struct msghdr {
 48         void            *msg_name;      /* ptr to socket address structure */
 49         int             msg_namelen;    /* size of socket address structure */
 50         struct iov_iter msg_iter;       /* data */
 51         void            *msg_control;   /* ancillary data */
 52         __kernel_size_t msg_controllen; /* ancillary data buffer length */
 53         unsigned int    msg_flags;      /* flags on received message */
 54         struct kiocb    *msg_iocb;      /* ptr to iocb for async requests */
 55 };

0 个答案:

没有答案