linux 内核printk格式化输出

参考: 如何获得正确的printk格式占位符 — The Linux Kernel documentation

内核printf 系列函数使用 %pISpfc 格式占位符,可以输入 (struct sockaddr_in *) 类型输出人类可读的结果。同时支持ipv4 和 ipv6

例子:

int net_connect_check(struct socket *sock, struct sockaddr *addr)
{
    if(IS_ERR_OR_NULL(sock) || IS_ERR_OR_NULL(addr))
	return -1;

    int allow = 1;

    u16     family = sock->sk->sk_family;

    unsigned short *snum = 0;

    u32     *ipaddress    = 0;
    int     address_match = 0;

    struct task_struct *pname = task_group_leader( current );

    if ( family == PF_INET || family == PF_INET6 )
    {
	struct sockaddr_in   *addr4 = NULL;
	struct sockaddr_in6  *addr6 = NULL;

	if ( family == PF_INET )
	{
	    addr4 = (struct sockaddr_in *)addr;
	    snum = &addr4->sin_port;
	    ipaddress = (u32 *)&addr4->sin_addr.s_addr;

	    printk("### v4 sockaddr in => (%pISpfc)\n " , addr4 ); //支持ipv4 

            address_match = is_match_name(*ipaddress, *snum, task_name(pname));
	}
	else 
	{
	    addr6 = (struct sockaddr_in6 *)addr;
	    snum  = &addr6->sin6_port;

	    printk("### ipv6 sockaddr in => (%pISpfc)\n" , addr6 ); //同时支持ipv6 
            address_match = is_match6_name(*ipaddress, *snum, task_name(pname));
	}
    }


    if ( address_match == 1)
    {
	    allow  = 0;
    }


    return allow;

}

 

以上代码格式化输出结果

### v4 sockaddr in => (192.168.1.1:22)
### v6 sockaddr in => ([::1]:632/0)