Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 10 Nov 2011 11:28:12 GMT
From:      Mark Martinec <Mark.Martinec@ijs.si>
To:        freebsd-gnats-submit@FreeBSD.org
Subject:   standards/162434: getaddrinfo: addrinfo.ai_family is an address family, not a protocol family
Message-ID:  <201111101128.pAABSCbo094022@red.freebsd.org>
Resent-Message-ID: <201111101130.pAABUAki008111@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         162434
>Category:       standards
>Synopsis:       getaddrinfo: addrinfo.ai_family is an address family, not a protocol family
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-standards
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          doc-bug
>Submitter-Id:   current-users
>Arrival-Date:   Thu Nov 10 11:30:10 UTC 2011
>Closed-Date:
>Last-Modified:
>Originator:     Mark Martinec
>Release:        9.0-RC2
>Organization:
Jozef Stefan Institute
>Environment:
FreeBSD xxx.ijs.si 9.0-RC2 FreeBSD 9.0-RC2 ... amd64
>Description:
There is a discrepancy in the documentation of a field "ai_family"
in "struct addrinfo" between FreeBSD (checked 8.*, 9.0) and RFC 3493
("Basic Socket Interface Extensions for IPv6", February 2003).

The RFC 3493 claims the ai_family is an address family and
constants like AF_xxx should be used.  Looks like Linux also follows
this.  FreeBSD claims this is a protocol family and expects PF_xxx.

Luckily the AF_xxx and corresponding PF_xxx constants have the
same value, so (I hope) that only a documentation change is needed
(in GETADDRINFO(3) man page and in /usr/include/netdb.h, possibly
elsewhere).



Note the comment by the "ai_family" in the following declarations
of struct addrinfo:

RFC 3493:

struct addrinfo {
  int     ai_flags;     /* AI_PASSIVE, AI_CANONNAME,
                           AI_NUMERICHOST, .. */
  int     ai_family;    /* AF_xxx */
  int     ai_socktype;  /* SOCK_xxx */
  int     ai_protocol;  /* 0 or IPPROTO_xxx for IPv4 and IPv6 */
  socklen_t  ai_addrlen;   /* length of ai_addr */
  char   *ai_canonname; /* canonical name for nodename */
  struct sockaddr  *ai_addr; /* binary address */
  struct addrinfo  *ai_next; /* next structure in linked list */
};


FreeBSD 9.0  /usr/include/netdb.h :

struct addrinfo {
        int     ai_flags;       /* AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST */
        int     ai_family;      /* PF_xxx */
        int     ai_socktype;    /* SOCK_xxx */
        int     ai_protocol;    /* 0 or IPPROTO_xxx for IPv4 and IPv6 */
        socklen_t ai_addrlen;   /* length of ai_addr */
        char    *ai_canonname;  /* canonical name for hostname */
        struct  sockaddr *ai_addr;      /* binary address */
        struct  addrinfo *ai_next;      /* next structure in linked list */
};

The netdb.h should be changed:
-       int     ai_family;      /* PF_xxx */
+       int     ai_family;      /* AF_xxx */


Similarly in the GETADDRINFO(3) man page:

     struct addrinfo {
             int ai_flags;           /* input flags */
             int ai_family;          /* protocol family for socket */
             int ai_socktype;        /* socket type */
             int ai_protocol;        /* protocol for socket */
             socklen_t ai_addrlen;   /* length of socket-address */
             struct sockaddr *ai_addr; /* socket-address for socket */
             char *ai_canonname;     /* canonical name for service location */
             struct addrinfo *ai_next; /* pointer to next in list */
     };

-             int ai_family;          /* protocol family for socket */
+             int ai_family;          /* address family for socket */


-     ai_family      The protocol family that should be used.  When ai_family
-                    is set to PF_UNSPEC, it means the caller will accept any
-                    protocol family supported by the operating system.

+     ai_family      The address family that should be used.  When ai_family
+                    is set to AF_UNSPEC, it means the caller will accept any
+                    address family supported by the operating system.

[...]
     If hints is the null pointer, getaddrinfo() behaves as if the caller pro-
-     vided a struct addrinfo with ai_family set to PF_UNSPEC and all other
+     vided a struct addrinfo with ai_family set to AF_UNSPEC and all other
     elements set to zero or NULL.
[...]
-           hints.ai_family = PF_UNSPEC;
+           hints.ai_family = AF_UNSPEC;
[...]
-           hints.ai_family = PF_UNSPEC;
+           hints.ai_family = PF_UNSPEC;

>How-To-Repeat:
Inspect the text in:
$ man getaddrinfo
$ more /usr/include/netdb.h
>Fix:
Replace PF_ by AF_ in the documentation (comments and man page) for the
structure addrinfo, and adjust the GETADDRINFO(3) man page, as indicated
above.

Possibly the source code of getaddrinfo may need a similar adjustment.

>Release-Note:
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201111101128.pAABSCbo094022>