本人新手上路,想通过加日志的办法追踪一下socket发送数据的流程,
使用的是linux 5.4.100版本内核, ubuntu64位18.04版本 ,在协议栈
socket.c的sock_sendmsg函数中加入了一句strncpy或者使用strncmp系统直接崩溃起不来。
代码如下:
int sock_sendmsg(struct socket *sock, struct msghdr *msg)
{
int err;
char content[16] = {0};
strncpy(content, msg->msg_iter.kvec->iov_base, 9);
err = security_socket_sendmsg(sock, msg,
msg_data_left(msg));
return err ?: sock_sendmsg_nosec(sock, msg);
}
或者
if(!strncmp((char *)msg->msg_iter.kvec->iov_base, "mytest", strlen("mytest"))) {
printk("<=============okokok===================>");
}
编译和安装语句:
sudo rm arch/x86_64/boot/bzImage
sudo make -j4 bzImage
sudo make install
sudo update-grub
编译和安装内核有警告无错误,
然后sudo reboot
我尝试只修改此处又是是OK的,代码如下:
int kernel_sendmsg(struct socket *sock, struct msghdr *msg,
struct kvec *vec, size_t num, size_t size)
{
printk("<======%s======>\n", vec->iov_base);
iov_iter_kvec(&msg->msg_iter, WRITE, vec, num, size);
return sock_sendmsg(sock, msg);
}
这里可以正常在日志中显示。
突然想到TCP协议中的端口号,把这个给忘了,让自己蹉跎的2天!在此做个笔记。
代码如下:
int sock_sendmsg(struct socket *sock, struct msghdr *msg)
{
int err = security_socket_sendmsg(sock, msg,
msg_data_left(msg));
if (sock->sk->sk_dport == htons(9000)) {
printk("<====%s======>msg=%s\n", __FUNCTION__, msg->msg_iter.kvec->iov_base);
}
return err ?: sock_sendmsg_nosec(sock, msg);
}
EXPORT_SYMBOL(sock_sendmsg);
/**
* kernel_sendmsg - send a message through @sock (kernel-space)
* @sock: socket
* @msg: message header
* @vec: kernel vec
* @num: vec array length
* @size: total message data size
*
* Builds the message data with @vec and sends it through @sock.
* Returns the number of bytes sent, or an error code.
*/
int kernel_sendmsg(struct socket *sock, struct msghdr *msg,
struct kvec *vec, size_t num, size_t size)
{
iov_iter_kvec(&msg->msg_iter, WRITE, vec, num, size);
printk("============%s===============\n", __FUNCTION__);
if (sock->sk->sk_dport == htons(9000)) {
printk("<====%s======>msg=%s\n", __FUNCTION__, msg->msg_iter.kvec->iov_base);
}
return sock_sendmsg(sock, msg);
}
那就直接打印,别用拷贝了。
不知道你这个问题是否已经解决, 如果还没有解决的话: