在协议栈使用strncmp

本人新手上路,想通过加日志的办法追踪一下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
编译和安装内核有警告无错误,

img

img

然后sudo reboot

img

img


在网上找了一些方法也不管用,求指点。

我尝试只修改此处又是是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);
}

那就直接打印,别用拷贝了。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^