C 如何填写iov_iter结构以便与msghdr一起使用?

C 如何填写iov_iter结构以便与msghdr一起使用?,c,sockets,linux-kernel,C,Sockets,Linux Kernel,我正在尝试使用sock_sendmsg()从驱动程序发送UDP数据包 关于如何使用sock_sendmsg()和msghdr填写UDP数据包并传输它,有一些指南,但它们都适用于较旧的内核版本。在3.13和4.8之间的某个时间,结构msghdr从: struct msghdr { void * msg_name; /* Socket name */ int msg_namelen; /* Length of name */

我正在尝试使用sock_sendmsg()从驱动程序发送UDP数据包

关于如何使用sock_sendmsg()和msghdr填写UDP数据包并传输它,有一些指南,但它们都适用于较旧的内核版本。在3.13和4.8之间的某个时间,结构msghdr从:

struct msghdr {
    void    *   msg_name;   /* Socket name          */
    int     msg_namelen;    /* Length of name       */
    struct iovec *  msg_iov;    /* Data blocks          */
    __kernel_size_t msg_iovlen; /* Number of blocks     */
    void    *   msg_control;    /* Per protocol magic (eg BSD file descriptor passing) */
    __kernel_size_t msg_controllen; /* Length of cmsg list */
    unsigned int    msg_flags;
};
致:

不是将msg_iov设置为指向包含以下数据的iovec:

struct msghdr msg = {};
struct iovec iov = {}; 

iov.iov_base = data;
iov.iov_len = dataLen;
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
现在有一个iov_iter结构:

struct iov_iter {
    int type;
    size_t iov_offset;
    size_t count;
    union {
        const struct iovec *iov;
        const struct kvec *kvec;
        const struct bio_vec *bvec;
        struct pipe_inode_info *pipe;
    };
    union {
        unsigned long nr_segs;
        struct {
            int idx;
            int start_idx;
        };
    };
};

我如何用数据填写msghdr内部的iov_iter结构,以便将其传递给sock_sendmsg?

在玩了一些游戏并阅读了Ctx()发布的指南后,我找到了答案

unsigned long nr_segments = 1;
size_t count = 1;
struct msghdr msg = {};
struct iovec iov = {}; 

iov.iov_base = data;
iov.iov_len = dataLen;

iov_iter_init(&msg.msg_iter, READ, &iov, nr_segments, count);

以下是一些关于iov_iter接口的一般信息,可能会对您有所帮助:
unsigned long nr_segments = 1;
size_t count = 1;
struct msghdr msg = {};
struct iovec iov = {}; 

iov.iov_base = data;
iov.iov_len = dataLen;

iov_iter_init(&msg.msg_iter, READ, &iov, nr_segments, count);