2017-11-15 11 views
0

sock_sendmsg()を使用してドライバからUDPパケットを送信しようとしています。msghdrで使用するiov_iter構造体はどのように記入しますか?

sock_sendmsg()とmsghdrを使用してUDPパケットを記入して送信する方法については、いくつかのガイドがありますが、すべて古いカーネルバージョン用です。

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; 
}; 

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

代わりのデータとIOVECを指すようにmsg_iovを設定:

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

iov.iov_base = data; 
iov.iov_len = dataLen; 
msg.msg_iov = &iov; 
msg.msg_iovlen = 1; 

ありいつか3.13と4.8の間で、構造体のmsghdrから変更しました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に渡すことができますか?

+1

iov_iterインターフェイスに関する一般的な情報は、次のとおりです。https://lwn.net/Articles/625077/ – Ctx

答えて

0

Ctx(lwn.net/Articles/625077)によって投稿されたガイドを読んで読んだ後、私はそれを理解しました。

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); 
関連する問題