Subject: Re: Is there any function similar to inet_ntoa() in Kernel or NetFilter ?

From: Harvey Harrison <[email-masked]>
Date: Mon, 24 Nov 2008 22:01:50 -0800

On Mon, 2008-11-24 at 21:03 -0500, Chuck Lever wrote:
> On Nov 21, 2008, at Nov 21, 2008, 6:08 PM, Julius Volz wrote:
> > On Thu, Nov 20, 2008 at 10:34 AM, Roar Bjørgum Rotvik <[email-masked] 
> > > wrote:
> >> Kunsheng Chen wrote:
> >>> I am doing a project similar to iptable using netfilter, currently  
> >>> I want
> >>> to convert a IP address from 'long int' back to dotted address.
> >>>
> >>> I don't know whether there is some functions inside kernel or  
> >>> netfilter
> >>> that could make that like using inet_ntoa() in <arpa/inet.h>
> >>
> >> How about NIPQUAD and NIPQUAD_FMT (for IPv4):
> >> http://lxr.linux.no/linux+v2.6.27.6/include/linux/kernel.h#L324
> >> http://lxr.linux.no/linux+v2.6.27.6/include/linux/kernel.h#L319
> >
> > In the latest tree, there are now "%pI4" and "%pI6" format options  
> > for printk.
> >
> > For example:
> >
> > printk(KERN_DEBUG "Address: %pI4\n", &v4_addr);
> 
> I've been watching this with some interest.  Is this API stable now?
> 
> Is there a way to pass a pointer to a sockaddr and get printk() to  
> figure out whether it's is an AF_INET or AF_INET6 address, and display  
> it appropriately?

Nope, they're fixed-format currently.  They are pretty simple format
specifiers at this point.  I'm not sure if adding more dynamic behavior
is a good idea.

> 
> Does it handle IPv6 scope IDs correctly?

Define correctly? ;-)

> 
> Does it convert IPv6 mapped IPv4 addresses to dotted quad automatically?
> 

Nope.

Quick summary:
%pI4 prints 4 decimal separated decimal numbers

%pI6 prints 8 16-bit hex numbers colon-separated 
%pi6 omits the colons.

Harvey