Looks good by me.

> On 29 Aug 2022, at 14:15, Alexander Bluhm <[email protected]> wrote:
> 
> Anyone?
> 
> On Sat, Aug 20, 2022 at 03:24:28PM +0200, Alexander Bluhm wrote:
>> Hi,
>> 
>> Can we rename the the function in_pcbhashlookup() to in_pcblookup()?
>> Then we have in_pcblookup() and in_pcblookup_listen() as public PCB
>> interface.  Using a hash table is only an implementation detail.
>> 
>> For internal use I would like to introduce in_pcbhash_insert() and
>> in_pcbhash_lookup() to avoid code duplication.
>> 
>> Routing domain is unsigned, change the type to u_int.
>> 
>> If the diff is too large for review, I can split these parts.
>> 
>> ok?
>> 
>> bluhm
>> 
>> Index: net/pf.c
>> ===================================================================
>> RCS file: /data/mirror/openbsd/cvs/src/sys/net/pf.c,v
>> retrieving revision 1.1137
>> diff -u -p -r1.1137 pf.c
>> --- net/pf.c 8 Aug 2022 12:06:30 -0000       1.1137
>> +++ net/pf.c 19 Aug 2022 16:22:47 -0000
>> @@ -3348,7 +3348,7 @@ pf_socket_lookup(struct pf_pdesc *pd)
>>               * Fails when rtable is changed while evaluating the ruleset
>>               * The socket looked up will not match the one hit in the end.
>>               */
>> -            inp = in_pcbhashlookup(tb, saddr->v4, sport, daddr->v4, dport,
>> +            inp = in_pcblookup(tb, saddr->v4, sport, daddr->v4, dport,
>>                  pd->rdomain);
>>              if (inp == NULL) {
>>                      inp = in_pcblookup_listen(tb, daddr->v4, dport,
>> @@ -3359,7 +3359,7 @@ pf_socket_lookup(struct pf_pdesc *pd)
>>              break;
>> #ifdef INET6
>>      case AF_INET6:
>> -            inp = in6_pcbhashlookup(tb, &saddr->v6, sport, &daddr->v6,
>> +            inp = in6_pcblookup(tb, &saddr->v6, sport, &daddr->v6,
>>                  dport, pd->rdomain);
>>              if (inp == NULL) {
>>                      inp = in6_pcblookup_listen(tb, &daddr->v6, dport,
>> Index: netinet/in_pcb.c
>> ===================================================================
>> RCS file: /data/mirror/openbsd/cvs/src/sys/netinet/in_pcb.c,v
>> retrieving revision 1.270
>> diff -u -p -r1.270 in_pcb.c
>> --- netinet/in_pcb.c 8 Aug 2022 12:06:30 -0000       1.270
>> +++ netinet/in_pcb.c 19 Aug 2022 20:41:23 -0000
>> @@ -120,14 +120,16 @@ struct baddynamicports baddynamicports;
>> struct baddynamicports rootonlyports;
>> struct pool inpcb_pool;
>> 
>> -void        in_pcbrehash_locked(struct inpcb *);
>> +void        in_pcbhash_insert(struct inpcb *);
>> +struct inpcb *in_pcbhash_lookup(struct inpcbtable *, u_int,
>> +    const struct in_addr *, u_short, const struct in_addr *, u_short);
>> int  in_pcbresize(struct inpcbtable *, int);
>> 
>> #define      INPCBHASH_LOADFACTOR(_x)        (((_x) * 3) / 4)
>> 
>> -struct inpcbhead *in_pcbhash(struct inpcbtable *, int,
>> +struct inpcbhead *in_pcbhash(struct inpcbtable *, u_int,
>>     const struct in_addr *, u_short, const struct in_addr *, u_short);
>> -struct inpcbhead *in_pcblhash(struct inpcbtable *, int, u_short);
>> +struct inpcbhead *in_pcblhash(struct inpcbtable *, u_int, u_short);
>> 
>> /*
>>  * in_pcb is used for inet and inet6.  in6_pcb only contains special
>> @@ -141,12 +143,12 @@ in_init(void)
>> }
>> 
>> struct inpcbhead *
>> -in_pcbhash(struct inpcbtable *table, int rdom,
>> +in_pcbhash(struct inpcbtable *table, u_int rdomain,
>>     const struct in_addr *faddr, u_short fport,
>>     const struct in_addr *laddr, u_short lport)
>> {
>>      SIPHASH_CTX ctx;
>> -    u_int32_t nrdom = htonl(rdom);
>> +    u_int32_t nrdom = htonl(rdomain);
>> 
>>      SipHash24_Init(&ctx, &table->inpt_key);
>>      SipHash24_Update(&ctx, &nrdom, sizeof(nrdom));
>> @@ -159,10 +161,10 @@ in_pcbhash(struct inpcbtable *table, int
>> }
>> 
>> struct inpcbhead *
>> -in_pcblhash(struct inpcbtable *table, int rdom, u_short lport)
>> +in_pcblhash(struct inpcbtable *table, u_int rdomain, u_short lport)
>> {
>>      SIPHASH_CTX ctx;
>> -    u_int32_t nrdom = htonl(rdom);
>> +    u_int32_t nrdom = htonl(rdomain);
>> 
>>      SipHash24_Init(&ctx, &table->inpt_lkey);
>>      SipHash24_Update(&ctx, &nrdom, sizeof(nrdom));
>> @@ -226,9 +228,6 @@ int
>> in_pcballoc(struct socket *so, struct inpcbtable *table)
>> {
>>      struct inpcb *inp;
>> -    struct inpcbhead *head;
>> -
>> -    NET_ASSERT_LOCKED();
>> 
>>      inp = pool_get(&inpcb_pool, PR_NOWAIT|PR_ZERO);
>>      if (inp == NULL)
>> @@ -257,19 +256,7 @@ in_pcballoc(struct socket *so, struct in
>>      if (table->inpt_count++ > INPCBHASH_LOADFACTOR(table->inpt_size))
>>              (void)in_pcbresize(table, table->inpt_size * 2);
>>      TAILQ_INSERT_HEAD(&table->inpt_queue, inp, inp_queue);
>> -    head = in_pcblhash(table, inp->inp_rtableid, inp->inp_lport);
>> -    LIST_INSERT_HEAD(head, inp, inp_lhash);
>> -#ifdef INET6
>> -    if (sotopf(so) == PF_INET6)
>> -            head = in6_pcbhash(table, rtable_l2(inp->inp_rtableid),
>> -                &inp->inp_faddr6, inp->inp_fport,
>> -                &inp->inp_laddr6, inp->inp_lport);
>> -    else
>> -#endif /* INET6 */
>> -            head = in_pcbhash(table, rtable_l2(inp->inp_rtableid),
>> -                &inp->inp_faddr, inp->inp_fport,
>> -                &inp->inp_laddr, inp->inp_lport);
>> -    LIST_INSERT_HEAD(head, inp, inp_hash);
>> +    in_pcbhash_insert(inp);
>>      mtx_leave(&table->inpt_mtx);
>> 
>>      so->so_pcb = inp;
>> @@ -511,7 +498,7 @@ in_pcbconnect(struct inpcb *inp, struct
>>      if (error)
>>              return (error);
>> 
>> -    t = in_pcbhashlookup(inp->inp_table, sin->sin_addr, sin->sin_port,
>> +    t = in_pcblookup(inp->inp_table, sin->sin_addr, sin->sin_port,
>>          ina, inp->inp_lport, inp->inp_rtableid);
>>      if (t != NULL) {
>>              in_pcbunref(t);
>> @@ -525,7 +512,7 @@ in_pcbconnect(struct inpcb *inp, struct
>>                      error = in_pcbbind(inp, NULL, curproc);
>>                      if (error)
>>                              return (error);
>> -                    t = in_pcbhashlookup(inp->inp_table, sin->sin_addr,
>> +                    t = in_pcblookup(inp->inp_table, sin->sin_addr,
>>                          sin->sin_port, ina, inp->inp_lport,
>>                          inp->inp_rtableid);
>>                      if (t != NULL) {
>> @@ -580,8 +567,6 @@ in_pcbdetach(struct inpcb *inp)
>>      struct socket *so = inp->inp_socket;
>>      struct inpcbtable *table = inp->inp_table;
>> 
>> -    NET_ASSERT_LOCKED();
>> -
>>      so->so_pcb = NULL;
>>      /*
>>       * As long as the NET_LOCK() is the default lock for Internet
>> @@ -1026,12 +1011,14 @@ in_pcbrehash(struct inpcb *inp)
>>      struct inpcbtable *table = inp->inp_table;
>> 
>>      mtx_enter(&table->inpt_mtx);
>> -    in_pcbrehash_locked(inp);
>> +    LIST_REMOVE(inp, inp_lhash);
>> +    LIST_REMOVE(inp, inp_hash);
>> +    in_pcbhash_insert(inp);
>>      mtx_leave(&table->inpt_mtx);
>> }
>> 
>> void
>> -in_pcbrehash_locked(struct inpcb *inp)
>> +in_pcbhash_insert(struct inpcb *inp)
>> {
>>      struct inpcbtable *table = inp->inp_table;
>>      struct inpcbhead *head;
>> @@ -1039,10 +1026,8 @@ in_pcbrehash_locked(struct inpcb *inp)
>>      NET_ASSERT_LOCKED();
>>      MUTEX_ASSERT_LOCKED(&table->inpt_mtx);
>> 
>> -    LIST_REMOVE(inp, inp_lhash);
>>      head = in_pcblhash(table, inp->inp_rtableid, inp->inp_lport);
>>      LIST_INSERT_HEAD(head, inp, inp_lhash);
>> -    LIST_REMOVE(inp, inp_hash);
>> #ifdef INET6
>>      if (inp->inp_flags & INP_IPV6)
>>              head = in6_pcbhash(table, rtable_l2(inp->inp_rtableid),
>> @@ -1056,6 +1041,44 @@ in_pcbrehash_locked(struct inpcb *inp)
>>      LIST_INSERT_HEAD(head, inp, inp_hash);
>> }
>> 
>> +struct inpcb *
>> +in_pcbhash_lookup(struct inpcbtable *table, u_int rdomain,
>> +    const struct in_addr *faddr, u_short fport,
>> +    const struct in_addr *laddr, u_short lport)
>> +{
>> +    struct inpcbhead *head;
>> +    struct inpcb *inp;
>> +
>> +    NET_ASSERT_LOCKED();
>> +    MUTEX_ASSERT_LOCKED(&table->inpt_mtx);
>> +
>> +    head = in_pcbhash(table, rdomain, faddr, fport, laddr, lport);
>> +    LIST_FOREACH(inp, head, inp_hash) {
>> +#ifdef INET6
>> +            if (ISSET(inp->inp_flags, INP_IPV6))
>> +                    continue;
>> +#endif
>> +            if (inp->inp_fport == fport && inp->inp_lport == lport &&
>> +                inp->inp_faddr.s_addr == faddr->s_addr &&
>> +                inp->inp_laddr.s_addr == laddr->s_addr &&
>> +                rtable_l2(inp->inp_rtableid) == rdomain) {
>> +                    break;
>> +            }
>> +    }
>> +    if (inp != NULL) {
>> +            /*
>> +             * Move this PCB to the head of hash chain so that
>> +             * repeated accesses are quicker.  This is analogous to
>> +             * the historic single-entry PCB cache.
>> +             */
>> +            if (inp != LIST_FIRST(head)) {
>> +                    LIST_REMOVE(inp, inp_hash);
>> +                    LIST_INSERT_HEAD(head, inp, inp_hash);
>> +            }
>> +    }
>> +    return (inp);
>> +}
>> +
>> int
>> in_pcbresize(struct inpcbtable *table, int hashsize)
>> {
>> @@ -1087,7 +1110,9 @@ in_pcbresize(struct inpcbtable *table, i
>>      arc4random_buf(&table->inpt_lkey, sizeof(table->inpt_lkey));
>> 
>>      TAILQ_FOREACH(inp, &table->inpt_queue, inp_queue) {
>> -            in_pcbrehash_locked(inp);
>> +            LIST_REMOVE(inp, inp_lhash);
>> +            LIST_REMOVE(inp, inp_hash);
>> +            in_pcbhash_insert(inp);
>>      }
>>      hashfree(ohashtbl, osize, M_PCB);
>>      hashfree(olhashtbl, osize, M_PCB);
>> @@ -1100,7 +1125,7 @@ int    in_pcbnotifymiss = 0;
>> #endif
>> 
>> /*
>> - * The in(6)_pcbhashlookup functions are used to locate connected sockets
>> + * The in(6)_pcblookup functions are used to locate connected sockets
>>  * quickly:
>>  *     faddr.fport <-> laddr.lport
>>  * No wildcard matching is done so that listening sockets are not found.
>> @@ -1109,38 +1134,15 @@ int  in_pcbnotifymiss = 0;
>>  * After those two lookups no other are necessary.
>>  */
>> struct inpcb *
>> -in_pcbhashlookup(struct inpcbtable *table, struct in_addr faddr,
>> -    u_int fport_arg, struct in_addr laddr, u_int lport_arg, u_int rtable)
>> +in_pcblookup(struct inpcbtable *table, struct in_addr faddr,
>> +    u_int fport, struct in_addr laddr, u_int lport, u_int rtable)
>> {
>> -    struct inpcbhead *head;
>>      struct inpcb *inp;
>> -    u_int16_t fport = fport_arg, lport = lport_arg;
>>      u_int rdomain;
>> 
>>      rdomain = rtable_l2(rtable);
>>      mtx_enter(&table->inpt_mtx);
>> -    head = in_pcbhash(table, rdomain, &faddr, fport, &laddr, lport);
>> -    LIST_FOREACH(inp, head, inp_hash) {
>> -#ifdef INET6
>> -            if (inp->inp_flags & INP_IPV6)
>> -                    continue;       /*XXX*/
>> -#endif
>> -            if (inp->inp_faddr.s_addr == faddr.s_addr &&
>> -                inp->inp_fport == fport && inp->inp_lport == lport &&
>> -                inp->inp_laddr.s_addr == laddr.s_addr &&
>> -                rtable_l2(inp->inp_rtableid) == rdomain) {
>> -                    /*
>> -                     * Move this PCB to the head of hash chain so that
>> -                     * repeated accesses are quicker.  This is analogous to
>> -                     * the historic single-entry PCB cache.
>> -                     */
>> -                    if (inp != LIST_FIRST(head)) {
>> -                            LIST_REMOVE(inp, inp_hash);
>> -                            LIST_INSERT_HEAD(head, inp, inp_hash);
>> -                    }
>> -                    break;
>> -            }
>> -    }
>> +    inp = in_pcbhash_lookup(table, rdomain, &faddr, fport, &laddr, lport);
>>      in_pcbref(inp);
>>      mtx_leave(&table->inpt_mtx);
>> #ifdef DIAGNOSTIC
>> @@ -1164,7 +1166,6 @@ struct inpcb *
>> in_pcblookup_listen(struct inpcbtable *table, struct in_addr laddr,
>>     u_int lport_arg, struct mbuf *m, u_int rtable)
>> {
>> -    struct inpcbhead *head;
>>      const struct in_addr *key1, *key2;
>>      struct inpcb *inp;
>>      u_int16_t lport = lport_arg;
>> @@ -1205,41 +1206,10 @@ in_pcblookup_listen(struct inpcbtable *t
>> 
>>      rdomain = rtable_l2(rtable);
>>      mtx_enter(&table->inpt_mtx);
>> -    head = in_pcbhash(table, rdomain, &zeroin_addr, 0, key1, lport);
>> -    LIST_FOREACH(inp, head, inp_hash) {
>> -#ifdef INET6
>> -            if (inp->inp_flags & INP_IPV6)
>> -                    continue;       /*XXX*/
>> -#endif
>> -            if (inp->inp_lport == lport && inp->inp_fport == 0 &&
>> -                inp->inp_laddr.s_addr == key1->s_addr &&
>> -                inp->inp_faddr.s_addr == INADDR_ANY &&
>> -                rtable_l2(inp->inp_rtableid) == rdomain)
>> -                    break;
>> -    }
>> +    inp = in_pcbhash_lookup(table, rdomain, &zeroin_addr, 0, key1, lport);
>>      if (inp == NULL && key1->s_addr != key2->s_addr) {
>> -            head = in_pcbhash(table, rdomain,
>> +            inp = in_pcbhash_lookup(table, rdomain,
>>                  &zeroin_addr, 0, key2, lport);
>> -            LIST_FOREACH(inp, head, inp_hash) {
>> -#ifdef INET6
>> -                    if (inp->inp_flags & INP_IPV6)
>> -                            continue;       /*XXX*/
>> -#endif
>> -                    if (inp->inp_lport == lport && inp->inp_fport == 0 &&
>> -                        inp->inp_laddr.s_addr == key2->s_addr &&
>> -                        inp->inp_faddr.s_addr == INADDR_ANY &&
>> -                        rtable_l2(inp->inp_rtableid) == rdomain)
>> -                            break;
>> -            }
>> -    }
>> -    /*
>> -     * Move this PCB to the head of hash chain so that
>> -     * repeated accesses are quicker.  This is analogous to
>> -     * the historic single-entry PCB cache.
>> -     */
>> -    if (inp != NULL && inp != LIST_FIRST(head)) {
>> -            LIST_REMOVE(inp, inp_hash);
>> -            LIST_INSERT_HEAD(head, inp, inp_hash);
>>      }
>>      in_pcbref(inp);
>>      mtx_leave(&table->inpt_mtx);
>> Index: netinet/in_pcb.h
>> ===================================================================
>> RCS file: /data/mirror/openbsd/cvs/src/sys/netinet/in_pcb.h,v
>> retrieving revision 1.129
>> diff -u -p -r1.129 in_pcb.h
>> --- netinet/in_pcb.h 15 May 2022 09:12:20 -0000      1.129
>> +++ netinet/in_pcb.h 19 Aug 2022 18:24:10 -0000
>> @@ -283,17 +283,17 @@ struct inpcb *
>> void  in_pcbunref(struct inpcb *);
>> void  in_pcbdisconnect(struct inpcb *);
>> struct inpcb *
>> -     in_pcbhashlookup(struct inpcbtable *, struct in_addr,
>> +     in_pcblookup(struct inpcbtable *, struct in_addr,
>>                             u_int, struct in_addr, u_int, u_int);
>> struct inpcb *
>>       in_pcblookup_listen(struct inpcbtable *, struct in_addr, u_int,
>>          struct mbuf *, u_int);
>> #ifdef INET6
>> struct inpcbhead *
>> -     in6_pcbhash(struct inpcbtable *, int, const struct in6_addr *,
>> +     in6_pcbhash(struct inpcbtable *, u_int, const struct in6_addr *,
>>          u_short, const struct in6_addr *, u_short);
>> struct inpcb *
>> -     in6_pcbhashlookup(struct inpcbtable *, const struct in6_addr *,
>> +     in6_pcblookup(struct inpcbtable *, const struct in6_addr *,
>>                             u_int, const struct in6_addr *, u_int, u_int);
>> struct inpcb *
>>       in6_pcblookup_listen(struct inpcbtable *, struct in6_addr *, u_int,
>> Index: netinet/tcp_input.c
>> ===================================================================
>> RCS file: /data/mirror/openbsd/cvs/src/sys/netinet/tcp_input.c,v
>> retrieving revision 1.377
>> diff -u -p -r1.377 tcp_input.c
>> --- netinet/tcp_input.c      11 Aug 2022 09:13:21 -0000      1.377
>> +++ netinet/tcp_input.c      19 Aug 2022 16:22:58 -0000
>> @@ -531,13 +531,13 @@ findpcb:
>>              switch (af) {
>> #ifdef INET6
>>              case AF_INET6:
>> -                    inp = in6_pcbhashlookup(&tcbtable, &ip6->ip6_src,
>> +                    inp = in6_pcblookup(&tcbtable, &ip6->ip6_src,
>>                          th->th_sport, &ip6->ip6_dst, th->th_dport,
>>                          m->m_pkthdr.ph_rtableid);
>>                      break;
>> #endif
>>              case AF_INET:
>> -                    inp = in_pcbhashlookup(&tcbtable, ip->ip_src,
>> +                    inp = in_pcblookup(&tcbtable, ip->ip_src,
>>                          th->th_sport, ip->ip_dst, th->th_dport,
>>                          m->m_pkthdr.ph_rtableid);
>>                      break;
>> Index: netinet/tcp_subr.c
>> ===================================================================
>> RCS file: /data/mirror/openbsd/cvs/src/sys/netinet/tcp_subr.c,v
>> retrieving revision 1.185
>> diff -u -p -r1.185 tcp_subr.c
>> --- netinet/tcp_subr.c       8 Aug 2022 12:06:30 -0000       1.185
>> +++ netinet/tcp_subr.c       19 Aug 2022 16:23:06 -0000
>> @@ -661,7 +661,7 @@ tcp6_ctlinput(int cmd, struct sockaddr *
>>               * corresponding to the address in the ICMPv6 message
>>               * payload.
>>               */
>> -            inp = in6_pcbhashlookup(&tcbtable, &sa6->sin6_addr,
>> +            inp = in6_pcblookup(&tcbtable, &sa6->sin6_addr,
>>                  th.th_dport, &sa6_src->sin6_addr, th.th_sport, rdomain);
>>              if (cmd == PRC_MSGSIZE) {
>>                      /*
>> @@ -733,7 +733,7 @@ tcp_ctlinput(int cmd, struct sockaddr *s
>>               */
>>              th = (struct tcphdr *)((caddr_t)ip + (ip->ip_hl << 2));
>>              seq = ntohl(th->th_seq);
>> -            inp = in_pcbhashlookup(&tcbtable,
>> +            inp = in_pcblookup(&tcbtable,
>>                  ip->ip_dst, th->th_dport, ip->ip_src, th->th_sport,
>>                  rdomain);
>>              if (inp && (tp = intotcpcb(inp)) &&
>> @@ -798,7 +798,7 @@ tcp_ctlinput(int cmd, struct sockaddr *s
>> 
>>      if (ip) {
>>              th = (struct tcphdr *)((caddr_t)ip + (ip->ip_hl << 2));
>> -            inp = in_pcbhashlookup(&tcbtable,
>> +            inp = in_pcblookup(&tcbtable,
>>                  ip->ip_dst, th->th_dport, ip->ip_src, th->th_sport,
>>                  rdomain);
>>              if (inp) {
>> Index: netinet/tcp_usrreq.c
>> ===================================================================
>> RCS file: /data/mirror/openbsd/cvs/src/sys/netinet/tcp_usrreq.c,v
>> retrieving revision 1.188
>> diff -u -p -r1.188 tcp_usrreq.c
>> --- netinet/tcp_usrreq.c     15 Aug 2022 14:44:18 -0000      1.188
>> +++ netinet/tcp_usrreq.c     19 Aug 2022 16:23:10 -0000
>> @@ -915,12 +915,12 @@ tcp_ident(void *oldp, size_t *oldlenp, v
>>      switch (tir.faddr.ss_family) {
>> #ifdef INET6
>>      case AF_INET6:
>> -            inp = in6_pcbhashlookup(&tcbtable, &f6,
>> +            inp = in6_pcblookup(&tcbtable, &f6,
>>                  fin6->sin6_port, &l6, lin6->sin6_port, tir.rdomain);
>>              break;
>> #endif
>>      case AF_INET:
>> -            inp = in_pcbhashlookup(&tcbtable, fin->sin_addr,
>> +            inp = in_pcblookup(&tcbtable, fin->sin_addr,
>>                  fin->sin_port, lin->sin_addr, lin->sin_port, tir.rdomain);
>>              break;
>>      default:
>> Index: netinet/udp_usrreq.c
>> ===================================================================
>> RCS file: /data/mirror/openbsd/cvs/src/sys/netinet/udp_usrreq.c,v
>> retrieving revision 1.282
>> diff -u -p -r1.282 udp_usrreq.c
>> --- netinet/udp_usrreq.c     15 Aug 2022 09:11:39 -0000      1.282
>> +++ netinet/udp_usrreq.c     19 Aug 2022 16:23:20 -0000
>> @@ -478,12 +478,12 @@ udp_input(struct mbuf **mp, int *offp, i
>>      if (inp == NULL) {
>> #ifdef INET6
>>              if (ip6)
>> -                    inp = in6_pcbhashlookup(&udbtable, &ip6->ip6_src,
>> +                    inp = in6_pcblookup(&udbtable, &ip6->ip6_src,
>>                          uh->uh_sport, &ip6->ip6_dst, uh->uh_dport,
>>                          m->m_pkthdr.ph_rtableid);
>>              else
>> #endif /* INET6 */
>> -            inp = in_pcbhashlookup(&udbtable, ip->ip_src, uh->uh_sport,
>> +            inp = in_pcblookup(&udbtable, ip->ip_src, uh->uh_sport,
>>                  ip->ip_dst, uh->uh_dport, m->m_pkthdr.ph_rtableid);
>>      }
>>      if (inp == NULL) {
>> @@ -774,7 +774,7 @@ udp6_ctlinput(int cmd, struct sockaddr *
>>                       * corresponding to the address in the ICMPv6 message
>>                       * payload.
>>                       */
>> -                    inp = in6_pcbhashlookup(&udbtable, &sa6.sin6_addr,
>> +                    inp = in6_pcblookup(&udbtable, &sa6.sin6_addr,
>>                          uh.uh_dport, &sa6_src.sin6_addr, uh.uh_sport,
>>                          rdomain);
>> #if 0
>> @@ -860,7 +860,7 @@ udp_ctlinput(int cmd, struct sockaddr *s
>>                      return;
>>              }
>> #endif
>> -            inp = in_pcbhashlookup(&udbtable,
>> +            inp = in_pcblookup(&udbtable,
>>                  ip->ip_dst, uhp->uh_dport, ip->ip_src, uhp->uh_sport,
>>                  rdomain);
>>              if (inp && inp->inp_socket != NULL)
>> Index: netinet6/in6_pcb.c
>> ===================================================================
>> RCS file: /data/mirror/openbsd/cvs/src/sys/netinet6/in6_pcb.c,v
>> retrieving revision 1.119
>> diff -u -p -r1.119 in6_pcb.c
>> --- netinet6/in6_pcb.c       8 Aug 2022 12:06:31 -0000       1.119
>> +++ netinet6/in6_pcb.c       19 Aug 2022 20:16:23 -0000
>> @@ -126,13 +126,16 @@
>> 
>> const struct in6_addr zeroin6_addr;
>> 
>> +struct inpcb *in6_pcbhash_lookup(struct inpcbtable *, u_int,
>> +    const struct in6_addr *, u_short, const struct in6_addr *, u_short);
>> +
>> struct inpcbhead *
>> -in6_pcbhash(struct inpcbtable *table, int rdom,
>> +in6_pcbhash(struct inpcbtable *table, u_int rdomain,
>>     const struct in6_addr *faddr, u_short fport,
>>     const struct in6_addr *laddr, u_short lport)
>> {
>>      SIPHASH_CTX ctx;
>> -    u_int32_t nrdom = htonl(rdom);
>> +    u_int32_t nrdom = htonl(rdomain);
>> 
>>      SipHash24_Init(&ctx, &table->inpt_key);
>>      SipHash24_Update(&ctx, &nrdom, sizeof(nrdom));
>> @@ -280,7 +283,7 @@ in6_pcbconnect(struct inpcb *inp, struct
>> 
>>      inp->inp_ipv6.ip6_hlim = (u_int8_t)in6_selecthlim(inp);
>> 
>> -    t = in6_pcbhashlookup(inp->inp_table, &sin6->sin6_addr, sin6->sin6_port,
>> +    t = in6_pcblookup(inp->inp_table, &sin6->sin6_addr, sin6->sin6_port,
>>          IN6_IS_ADDR_UNSPECIFIED(&inp->inp_laddr6) ? in6a : &inp->inp_laddr6,
>>          inp->inp_lport, inp->inp_rtableid);
>>      if (t != NULL) {
>> @@ -295,7 +298,7 @@ in6_pcbconnect(struct inpcb *inp, struct
>>                      error = in_pcbbind(inp, NULL, curproc);
>>                      if (error)
>>                              return (error);
>> -                    t = in6_pcbhashlookup(inp->inp_table, &sin6->sin6_addr,
>> +                    t = in6_pcblookup(inp->inp_table, &sin6->sin6_addr,
>>                          sin6->sin6_port, in6a, inp->inp_lport,
>>                          inp->inp_rtableid);
>>                      if (t != NULL) {
>> @@ -516,37 +519,51 @@ in6_pcbnotify(struct inpcbtable *table,
>> }
>> 
>> struct inpcb *
>> -in6_pcbhashlookup(struct inpcbtable *table, const struct in6_addr *faddr,
>> -    u_int fport_arg, const struct in6_addr *laddr, u_int lport_arg,
>> -    u_int rtable)
>> +in6_pcbhash_lookup(struct inpcbtable *table, u_int rdomain,
>> +    const struct in6_addr *faddr, u_short fport,
>> +    const struct in6_addr *laddr, u_short lport)
>> {
>>      struct inpcbhead *head;
>>      struct inpcb *inp;
>> -    u_int16_t fport = fport_arg, lport = lport_arg;
>> -    u_int rdomain;
>> 
>> -    rdomain = rtable_l2(rtable);
>> -    mtx_enter(&table->inpt_mtx);
>> +    NET_ASSERT_LOCKED();
>> +    MUTEX_ASSERT_LOCKED(&table->inpt_mtx);
>> +
>>      head = in6_pcbhash(table, rdomain, faddr, fport, laddr, lport);
>>      LIST_FOREACH(inp, head, inp_hash) {
>> -            if (!(inp->inp_flags & INP_IPV6))
>> +            if (!ISSET(inp->inp_flags, INP_IPV6))
>>                      continue;
>> -            if (IN6_ARE_ADDR_EQUAL(&inp->inp_faddr6, faddr) &&
>> -                inp->inp_fport == fport && inp->inp_lport == lport &&
>> +            if (inp->inp_fport == fport && inp->inp_lport == lport &&
>> +                IN6_ARE_ADDR_EQUAL(&inp->inp_faddr6, faddr) &&
>>                  IN6_ARE_ADDR_EQUAL(&inp->inp_laddr6, laddr) &&
>>                  rtable_l2(inp->inp_rtableid) == rdomain) {
>> -                    /*
>> -                     * Move this PCB to the head of hash chain so that
>> -                     * repeated accesses are quicker.  This is analogous to
>> -                     * the historic single-entry PCB cache.
>> -                     */
>> -                    if (inp != LIST_FIRST(head)) {
>> -                            LIST_REMOVE(inp, inp_hash);
>> -                            LIST_INSERT_HEAD(head, inp, inp_hash);
>> -                    }
>>                      break;
>>              }
>>      }
>> +    if (inp != NULL) {
>> +            /*
>> +             * Move this PCB to the head of hash chain so that
>> +             * repeated accesses are quicker.  This is analogous to
>> +             * the historic single-entry PCB cache.
>> +             */
>> +            if (inp != LIST_FIRST(head)) {
>> +                    LIST_REMOVE(inp, inp_hash);
>> +                    LIST_INSERT_HEAD(head, inp, inp_hash);
>> +            }
>> +    }
>> +    return (inp);
>> +}
>> +
>> +struct inpcb *
>> +in6_pcblookup(struct inpcbtable *table, const struct in6_addr *faddr,
>> +    u_int fport, const struct in6_addr *laddr, u_int lport, u_int rtable)
>> +{
>> +    struct inpcb *inp;
>> +    u_int rdomain;
>> +
>> +    rdomain = rtable_l2(rtable);
>> +    mtx_enter(&table->inpt_mtx);
>> +    inp = in6_pcbhash_lookup(table, rdomain, faddr, fport, laddr, lport);
>>      in_pcbref(inp);
>>      mtx_leave(&table->inpt_mtx);
>> #ifdef DIAGNOSTIC
>> @@ -560,12 +577,10 @@ in6_pcbhashlookup(struct inpcbtable *tab
>> 
>> struct inpcb *
>> in6_pcblookup_listen(struct inpcbtable *table, struct in6_addr *laddr,
>> -    u_int lport_arg, struct mbuf *m, u_int rtable)
>> +    u_int lport, struct mbuf *m, u_int rtable)
>> {
>> -    struct inpcbhead *head;
>>      const struct in6_addr *key1, *key2;
>>      struct inpcb *inp;
>> -    u_int16_t lport = lport_arg;
>>      u_int rdomain;
>> 
>>      key1 = laddr;
>> @@ -600,37 +615,10 @@ in6_pcblookup_listen(struct inpcbtable *
>> 
>>      rdomain = rtable_l2(rtable);
>>      mtx_enter(&table->inpt_mtx);
>> -    head = in6_pcbhash(table, rdomain, &zeroin6_addr, 0, key1, lport);
>> -    LIST_FOREACH(inp, head, inp_hash) {
>> -            if (!(inp->inp_flags & INP_IPV6))
>> -                    continue;
>> -            if (inp->inp_lport == lport && inp->inp_fport == 0 &&
>> -                IN6_ARE_ADDR_EQUAL(&inp->inp_laddr6, key1) &&
>> -                IN6_IS_ADDR_UNSPECIFIED(&inp->inp_faddr6) &&
>> -                rtable_l2(inp->inp_rtableid) == rdomain)
>> -                    break;
>> -    }
>> +    inp = in6_pcbhash_lookup(table, rdomain, &zeroin6_addr, 0, key1, lport);
>>      if (inp == NULL && ! IN6_ARE_ADDR_EQUAL(key1, key2)) {
>> -            head = in6_pcbhash(table, rdomain,
>> +            inp = in6_pcbhash_lookup(table, rdomain,
>>                  &zeroin6_addr, 0, key2, lport);
>> -            LIST_FOREACH(inp, head, inp_hash) {
>> -                    if (!(inp->inp_flags & INP_IPV6))
>> -                            continue;
>> -                    if (inp->inp_lport == lport && inp->inp_fport == 0 &&
>> -                        IN6_ARE_ADDR_EQUAL(&inp->inp_laddr6, key2) &&
>> -                        IN6_IS_ADDR_UNSPECIFIED(&inp->inp_faddr6) &&
>> -                        rtable_l2(inp->inp_rtableid) == rdomain)
>> -                            break;
>> -            }
>> -    }
>> -    /*
>> -     * Move this PCB to the head of hash chain so that
>> -     * repeated accesses are quicker.  This is analogous to
>> -     * the historic single-entry PCB cache.
>> -     */
>> -    if (inp != NULL && inp != LIST_FIRST(head)) {
>> -            LIST_REMOVE(inp, inp_hash);
>> -            LIST_INSERT_HEAD(head, inp, inp_hash);
>>      }
>>      in_pcbref(inp);
>>      mtx_leave(&table->inpt_mtx);
>> Index: netinet6/raw_ip6.c
>> ===================================================================
>> RCS file: /data/mirror/openbsd/cvs/src/sys/netinet6/raw_ip6.c,v
>> retrieving revision 1.150
>> diff -u -p -r1.150 raw_ip6.c
>> --- netinet6/raw_ip6.c       15 Aug 2022 09:11:39 -0000      1.150
>> +++ netinet6/raw_ip6.c       19 Aug 2022 16:23:25 -0000
>> @@ -319,7 +319,7 @@ rip6_ctlinput(int cmd, struct sockaddr *
>>               * XXX chase extension headers, or pass final nxt value
>>               * from icmp6_notify_error()
>>               */
>> -            in6p = in6_pcbhashlookup(&rawin6pcbtable, &sa6->sin6_addr, 0,
>> +            in6p = in6_pcblookup(&rawin6pcbtable, &sa6->sin6_addr, 0,
>>                  &sa6_src->sin6_addr, 0, rdomain);
>> 
>>              if (in6p && in6p->inp_ipv6.ip6_nxt &&
> 

Reply via email to