tech-net archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: Setting sin/sin6 port to 0 before ifa_ifwithaddr()



On Tue, Apr 14, 2009 at 12:43:48PM +0300, Elad Efrat wrote:
> Hey
>
> The netinet and netinet6 both have code like the following:
>
>     254  sin6->sin6_port = 0;         /* yech... */
>     255  if ((in6p->in6p_flags & IN6P_FAITH) == 0 &&
>     256      (ia = ifa_ifwithaddr((struct sockaddr *)sin6)) == 0)
>     257          return (EADDRNOTAVAIL);
>
> because at some point in the past ifa_ifwithaddr() used to do a
> simple byte compare, including the port.
>
> Perhaps we can get rid of it? Please see attached diff.
>
> Thanks,
>
> -e.

> Index: netinet/in_pcb.c
> ===================================================================
> RCS file: /usr/cvs/src/sys/netinet/in_pcb.c,v
> retrieving revision 1.130
> diff -u -p -r1.130 in_pcb.c
> --- netinet/in_pcb.c  18 Mar 2009 16:00:22 -0000      1.130
> +++ netinet/in_pcb.c  13 Apr 2009 15:44:39 -0000
> @@ -262,7 +262,6 @@ in_pcbbind(void *v, struct mbuf *nam, st
>               if (so->so_options & SO_REUSEADDR)
>                       reuseport = SO_REUSEADDR|SO_REUSEPORT;
>       } else if (!in_nullhost(sin->sin_addr)) {
> -             sin->sin_port = 0;              /* yech... */
>               INADDR_TO_IA(sin->sin_addr, ia);
>               /* check for broadcast addresses */
>               if (ia == NULL)
> Index: netinet6/in6_pcb.c
> ===================================================================
> RCS file: /usr/cvs/src/sys/netinet6/in6_pcb.c,v
> retrieving revision 1.101
> diff -u -p -r1.101 in6_pcb.c
> --- netinet6/in6_pcb.c        18 Mar 2009 17:06:52 -0000      1.101
> +++ netinet6/in6_pcb.c        13 Apr 2009 15:41:42 -0000
> @@ -251,7 +251,6 @@ in6_pcbbind(void *v, struct mbuf *nam, s
>               } else if (!IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) {
>                       struct ifaddr *ia = NULL;
>  
> -                     sin6->sin6_port = 0;            /* yech... */
>                       if ((in6p->in6p_flags & IN6P_FAITH) == 0 &&
>                           (ia = ifa_ifwithaddr((struct sockaddr *)sin6)) == 0)
>                               return (EADDRNOTAVAIL);

The part above looks ok.

> Index: netinet/in_proto.c
> ===================================================================
> RCS file: /usr/cvs/src/sys/netinet/in_proto.c,v
> retrieving revision 1.97
> diff -u -p -r1.97 in_proto.c
> --- netinet/in_proto.c        28 Feb 2009 18:31:12 -0000      1.97
> +++ netinet/in_proto.c        13 Apr 2009 16:02:32 -0000
> @@ -464,6 +464,7 @@ struct domain inetdomain = {
>       .dom_mowner = MOWNER_INIT("",""),
>       .dom_sa_cmpofs = offsetof(struct sockaddr_in, sin_addr),
>       .dom_sa_cmplen = sizeof(struct in_addr),
> +     .dom_sockaddr_cmp = sockaddr_in_cmp,
>       .dom_sa_any = (const struct sockaddr *)&in_any,
>       .dom_sockaddr_const_addr = sockaddr_in_const_addr,
>       .dom_sockaddr_addr = sockaddr_in_addr,

> Index: netinet6/in6_proto.c
> ===================================================================
> RCS file: /usr/cvs/src/sys/netinet6/in6_proto.c,v
> retrieving revision 1.84
> diff -u -p -r1.84 in6_proto.c
> --- netinet6/in6_proto.c      23 Mar 2009 18:43:20 -0000      1.84
> +++ netinet6/in6_proto.c      13 Apr 2009 16:02:21 -0000
> @@ -416,6 +416,7 @@ struct domain inet6domain = {
>       .dom_mowner = MOWNER_INIT("",""),
>       .dom_sa_cmpofs = offsetof(struct sockaddr_in6, sin6_addr),
>       .dom_sa_cmplen = sizeof(struct in6_addr),
> +     .dom_sockaddr_cmp = sockaddr_in6_cmp,
>       .dom_sa_any = (const struct sockaddr *)&in6_any,
>       .dom_rtcache = LIST_HEAD_INITIALIZER(inet6domain.dom_rtcache)
>  };

I don't think that that is necessary for your purposes.  Also,
calling the comparison routine through a function pointer may have an
undesirable performance impact on some architectures (ARM?).

Dave

-- 
David Young             OJC Technologies
dyoung%ojctech.com@localhost      Urbana, IL * (217) 278-3933


Home | Main Index | Thread Index | Old Index