mirror of
https://github.com/opnsense/src.git
synced 2026-04-25 16:18:54 -04:00
Move in6_pcbsetport() to in6_pcb.c
This function was originally carved out of in6_pcbbind(), which is in in6_pcb.c. This function also uses KPI private to the PCB database - in_pcb_lport().
This commit is contained in:
parent
744a64bd92
commit
147f018a72
2 changed files with 38 additions and 42 deletions
|
|
@ -114,6 +114,44 @@ __FBSDID("$FreeBSD$");
|
|||
#include <netinet6/in6_fib.h>
|
||||
#include <netinet6/scope6_var.h>
|
||||
|
||||
int
|
||||
in6_pcbsetport(struct in6_addr *laddr, struct inpcb *inp, struct ucred *cred)
|
||||
{
|
||||
struct socket *so = inp->inp_socket;
|
||||
u_int16_t lport = 0;
|
||||
int error, lookupflags = 0;
|
||||
#ifdef INVARIANTS
|
||||
struct inpcbinfo *pcbinfo = inp->inp_pcbinfo;
|
||||
#endif
|
||||
|
||||
INP_WLOCK_ASSERT(inp);
|
||||
INP_HASH_WLOCK_ASSERT(pcbinfo);
|
||||
|
||||
error = prison_local_ip6(cred, laddr,
|
||||
((inp->inp_flags & IN6P_IPV6_V6ONLY) != 0));
|
||||
if (error)
|
||||
return(error);
|
||||
|
||||
/* XXX: this is redundant when called from in6_pcbbind */
|
||||
if ((so->so_options & (SO_REUSEADDR|SO_REUSEPORT|SO_REUSEPORT_LB)) == 0)
|
||||
lookupflags = INPLOOKUP_WILDCARD;
|
||||
|
||||
inp->inp_flags |= INP_ANONPORT;
|
||||
|
||||
error = in_pcb_lport(inp, NULL, &lport, cred, lookupflags);
|
||||
if (error != 0)
|
||||
return (error);
|
||||
|
||||
inp->inp_lport = lport;
|
||||
if (in_pcbinshash(inp) != 0) {
|
||||
inp->in6p_laddr = in6addr_any;
|
||||
inp->inp_lport = 0;
|
||||
return (EAGAIN);
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
in6_pcbbind(struct inpcb *inp, struct sockaddr *nam,
|
||||
struct ucred *cred)
|
||||
|
|
|
|||
|
|
@ -926,48 +926,6 @@ in6_selecthlim(struct inpcb *inp, struct ifnet *ifp)
|
|||
return (V_ip6_defhlim);
|
||||
}
|
||||
|
||||
/*
|
||||
* XXX: this is borrowed from in6_pcbbind(). If possible, we should
|
||||
* share this function by all *bsd*...
|
||||
*/
|
||||
int
|
||||
in6_pcbsetport(struct in6_addr *laddr, struct inpcb *inp, struct ucred *cred)
|
||||
{
|
||||
struct socket *so = inp->inp_socket;
|
||||
u_int16_t lport = 0;
|
||||
int error, lookupflags = 0;
|
||||
#ifdef INVARIANTS
|
||||
struct inpcbinfo *pcbinfo = inp->inp_pcbinfo;
|
||||
#endif
|
||||
|
||||
INP_WLOCK_ASSERT(inp);
|
||||
INP_HASH_WLOCK_ASSERT(pcbinfo);
|
||||
|
||||
error = prison_local_ip6(cred, laddr,
|
||||
((inp->inp_flags & IN6P_IPV6_V6ONLY) != 0));
|
||||
if (error)
|
||||
return(error);
|
||||
|
||||
/* XXX: this is redundant when called from in6_pcbbind */
|
||||
if ((so->so_options & (SO_REUSEADDR|SO_REUSEPORT|SO_REUSEPORT_LB)) == 0)
|
||||
lookupflags = INPLOOKUP_WILDCARD;
|
||||
|
||||
inp->inp_flags |= INP_ANONPORT;
|
||||
|
||||
error = in_pcb_lport(inp, NULL, &lport, cred, lookupflags);
|
||||
if (error != 0)
|
||||
return (error);
|
||||
|
||||
inp->inp_lport = lport;
|
||||
if (in_pcbinshash(inp) != 0) {
|
||||
inp->in6p_laddr = in6addr_any;
|
||||
inp->inp_lport = 0;
|
||||
return (EAGAIN);
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
void
|
||||
addrsel_policy_init(void)
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in a new issue