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に渡すことができますか?
iov_iterインターフェイスに関する一般的な情報は、次のとおりです。https://lwn.net/Articles/625077/ – Ctx