sync with OpenBSD -current
This commit is contained in:
parent
18e54d401d
commit
9394581c89
58 changed files with 711 additions and 763 deletions
|
@ -1,4 +1,4 @@
|
|||
/* $OpenBSD: pipex.c,v 1.151 2023/12/01 20:30:22 mvs Exp $ */
|
||||
/* $OpenBSD: pipex.c,v 1.153 2024/01/23 17:57:21 mvs Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2009 Internet Initiative Japan Inc.
|
||||
|
@ -98,7 +98,6 @@ struct pipex_hash_head
|
|||
pipex_id_hashtable[PIPEX_HASH_SIZE]; /* [L] peer id hash */
|
||||
|
||||
struct radix_node_head *pipex_rd_head4 = NULL; /* [L] */
|
||||
struct radix_node_head *pipex_rd_head6 = NULL; /* [L] */
|
||||
struct timeout pipex_timer_ch; /* callout timer context */
|
||||
int pipex_prune = 1; /* [I] walk list every seconds */
|
||||
|
||||
|
@ -152,6 +151,8 @@ pipex_destroy_all_sessions(void *ownersc)
|
|||
|
||||
LIST_FOREACH_SAFE(session, &pipex_session_list, session_list,
|
||||
session_tmp) {
|
||||
if (session->flags & PIPEX_SFLAGS_ITERATOR)
|
||||
continue;
|
||||
if (session->ownersc == ownersc) {
|
||||
KASSERT((session->flags & PIPEX_SFLAGS_PPPX) == 0);
|
||||
pipex_unlink_session_locked(session);
|
||||
|
@ -437,11 +438,6 @@ pipex_link_session(struct pipex_session *session, struct ifnet *ifp,
|
|||
offsetof(struct sockaddr_in, sin_addr)))
|
||||
panic("rn_inithead() failed on pipex_link_session()");
|
||||
}
|
||||
if (pipex_rd_head6 == NULL) {
|
||||
if (!rn_inithead((void **)&pipex_rd_head6,
|
||||
offsetof(struct sockaddr_in6, sin6_addr)))
|
||||
panic("rn_inithead() failed on pipex_link_session()");
|
||||
}
|
||||
if (pipex_lookup_by_session_id_locked(session->protocol,
|
||||
session->session_id)) {
|
||||
error = EEXIST;
|
||||
|
@ -600,6 +596,8 @@ pipex_get_closed(struct pipex_session_list_req *req, void *ownersc)
|
|||
|
||||
LIST_FOREACH_SAFE(session, &pipex_close_wait_list, state_list,
|
||||
session_tmp) {
|
||||
if (session->flags & PIPEX_SFLAGS_ITERATOR)
|
||||
continue;
|
||||
if (session->ownersc != ownersc)
|
||||
continue;
|
||||
req->plr_ppp_id[req->plr_ppp_id_count++] = session->ppp_id;
|
||||
|
@ -736,6 +734,8 @@ pipex_timer(void *ignored_arg)
|
|||
/* walk through */
|
||||
LIST_FOREACH_SAFE(session, &pipex_session_list, session_list,
|
||||
session_tmp) {
|
||||
if (session->flags & PIPEX_SFLAGS_ITERATOR)
|
||||
continue;
|
||||
switch (session->state) {
|
||||
case PIPEX_STATE_OPENED:
|
||||
if (session->timeout_sec == 0)
|
||||
|
@ -775,6 +775,47 @@ pipex_timer(void *ignored_arg)
|
|||
/***********************************************************************
|
||||
* Common network I/O functions. (tunnel protocol independent)
|
||||
***********************************************************************/
|
||||
|
||||
struct pipex_session *
|
||||
pipex_iterator(struct pipex_session *session,
|
||||
struct pipex_session_iterator *iter, void *ownersc)
|
||||
{
|
||||
struct pipex_session *session_tmp;
|
||||
|
||||
mtx_enter(&pipex_list_mtx);
|
||||
|
||||
if (session)
|
||||
session_tmp = LIST_NEXT(session, session_list);
|
||||
else
|
||||
session_tmp = LIST_FIRST(&pipex_session_list);
|
||||
|
||||
while (session_tmp) {
|
||||
if (session_tmp->flags & PIPEX_SFLAGS_ITERATOR)
|
||||
goto next;
|
||||
if (session_tmp->ownersc != ownersc)
|
||||
goto next;
|
||||
break;
|
||||
next:
|
||||
session_tmp = LIST_NEXT(session_tmp, session_list);
|
||||
}
|
||||
|
||||
if (session)
|
||||
LIST_REMOVE(iter, session_list);
|
||||
|
||||
if (session_tmp) {
|
||||
LIST_INSERT_AFTER(session_tmp,
|
||||
(struct pipex_session *)&iter, session_list);
|
||||
refcnt_take(&session_tmp->pxs_refcnt);
|
||||
}
|
||||
|
||||
mtx_leave(&pipex_list_mtx);
|
||||
|
||||
if (session)
|
||||
pipex_rele_session(session);
|
||||
|
||||
return (session_tmp);
|
||||
}
|
||||
|
||||
void
|
||||
pipex_ip_output(struct mbuf *m0, struct pipex_session *session)
|
||||
{
|
||||
|
@ -809,23 +850,17 @@ pipex_ip_output(struct mbuf *m0, struct pipex_session *session)
|
|||
|
||||
pipex_ppp_output(m0, session, PPP_IP);
|
||||
} else {
|
||||
struct pipex_session_iterator iter = {
|
||||
.flags = PIPEX_SFLAGS_ITERATOR,
|
||||
};
|
||||
|
||||
struct pipex_session *session_tmp;
|
||||
struct mbuf *m;
|
||||
|
||||
m0->m_flags &= ~(M_BCAST|M_MCAST);
|
||||
|
||||
mtx_enter(&pipex_list_mtx);
|
||||
|
||||
session_tmp = LIST_FIRST(&pipex_session_list);
|
||||
while (session_tmp != NULL) {
|
||||
struct pipex_session *session_save = NULL;
|
||||
|
||||
if (session_tmp->ownersc != session->ownersc)
|
||||
goto next;
|
||||
|
||||
refcnt_take(&session_tmp->pxs_refcnt);
|
||||
mtx_leave(&pipex_list_mtx);
|
||||
|
||||
session_tmp = pipex_iterator(NULL, &iter, session->ownersc);
|
||||
while (session_tmp) {
|
||||
m = m_copym(m0, 0, M_COPYALL, M_NOWAIT);
|
||||
if (m != NULL)
|
||||
pipex_ppp_output(m, session_tmp, PPP_IP);
|
||||
|
@ -833,16 +868,10 @@ pipex_ip_output(struct mbuf *m0, struct pipex_session *session)
|
|||
counters_inc(session_tmp->stat_counters,
|
||||
pxc_oerrors);
|
||||
|
||||
mtx_enter(&pipex_list_mtx);
|
||||
session_save = session_tmp;
|
||||
next:
|
||||
session_tmp = LIST_NEXT(session_tmp, session_list);
|
||||
if (session_save != NULL)
|
||||
pipex_rele_session(session_save);
|
||||
session_tmp = pipex_iterator(session_tmp,
|
||||
&iter, session->ownersc);
|
||||
}
|
||||
|
||||
mtx_leave(&pipex_list_mtx);
|
||||
|
||||
m_freem(m0);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue