summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorstsp <stsp@openbsd.org>2013-11-20 08:21:33 +0000
committerstsp <stsp@openbsd.org>2013-11-20 08:21:33 +0000
commit36e4eeabd12a9babdc2d66ca102e93909e17ef54 (patch)
tree5ac8e352e0995985cc3b932e03df72a820c3216b
parentgive this a real chance to compile (diff)
downloadwireguard-openbsd-36e4eeabd12a9babdc2d66ca102e93909e17ef54.tar.xz
wireguard-openbsd-36e4eeabd12a9babdc2d66ca102e93909e17ef54.zip
Convert sppp(4) to taskq; ok mikeb@ mpi@
-rw-r--r--sys/net/if_sppp.h17
-rw-r--r--sys/net/if_spppsubr.c108
2 files changed, 60 insertions, 65 deletions
diff --git a/sys/net/if_sppp.h b/sys/net/if_sppp.h
index adc9c0a6e6c..8dd9594f552 100644
--- a/sys/net/if_sppp.h
+++ b/sys/net/if_sppp.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_sppp.h,v 1.19 2013/11/14 16:52:33 stsp Exp $ */
+/* $OpenBSD: if_sppp.h,v 1.20 2013/11/20 08:21:33 stsp Exp $ */
/* $NetBSD: if_sppp.h,v 1.2.2.1 1999/04/04 06:57:39 explorer Exp $ */
/*
@@ -93,6 +93,12 @@ struct spppreq {
#ifdef _KERNEL
#include <sys/timeout.h>
+#include <sys/task.h>
+
+#ifdef INET6
+#include <netinet/in.h>
+#include <netinet6/in6_var.h>
+#endif
#define IDX_LCP 0 /* idx into state table */
@@ -124,8 +130,13 @@ struct sipcp {
#define IPV6CP_MYIFID_SEEN 2 /* have seen my suggested ifid */
u_int32_t saved_hisaddr; /* if hisaddr (IPv4) is dynamic, save
* original one here, in network byte order */
- u_int32_t req_hisaddr; /* remote address requested */
- u_int32_t req_myaddr; /* local address requested */
+ u_int32_t req_hisaddr; /* remote address requested (IPv4) */
+ u_int32_t req_myaddr; /* local address requested (IPv4) */
+#ifdef INET6
+ struct in6_aliasreq req_ifid; /* local ifid requested (IPv6) */
+#endif
+ struct task set_addr_task; /* set address from process context */
+ struct task clear_addr_task; /* clear address from process context */
};
struct sauth {
diff --git a/sys/net/if_spppsubr.c b/sys/net/if_spppsubr.c
index 6ef78b29b12..671caae53b2 100644
--- a/sys/net/if_spppsubr.c
+++ b/sys/net/if_spppsubr.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_spppsubr.c,v 1.112 2013/11/14 16:52:33 stsp Exp $ */
+/* $OpenBSD: if_spppsubr.c,v 1.113 2013/11/20 08:21:33 stsp Exp $ */
/*
* Synchronous PPP/Cisco link level subroutines.
* Keepalive protocol implemented in both Cisco and PPP modes.
@@ -46,7 +46,6 @@
#include <sys/syslog.h>
#include <sys/malloc.h>
#include <sys/mbuf.h>
-#include <sys/workq.h>
#include <sys/timeout.h>
#include <crypto/md5.h>
@@ -72,10 +71,6 @@
#include <net/if_sppp.h>
-#ifdef INET6
-#include <netinet6/in6_var.h>
-#endif
-
# define UNTIMEOUT(fun, arg, handle) \
timeout_del(&(handle))
@@ -291,6 +286,7 @@ HIDE void sppp_lcp_check_and_close(struct sppp *sp);
HIDE int sppp_ncp_check(struct sppp *sp);
HIDE void sppp_ipcp_init(struct sppp *sp);
+HIDE void sppp_ipcp_destroy(struct sppp *sp);
HIDE void sppp_ipcp_up(struct sppp *sp);
HIDE void sppp_ipcp_down(struct sppp *sp);
HIDE void sppp_ipcp_open(struct sppp *sp);
@@ -306,6 +302,7 @@ HIDE void sppp_ipcp_tlf(struct sppp *sp);
HIDE void sppp_ipcp_scr(struct sppp *sp);
HIDE void sppp_ipv6cp_init(struct sppp *sp);
+HIDE void sppp_ipv6cp_destroy(struct sppp *sp);
HIDE void sppp_ipv6cp_up(struct sppp *sp);
HIDE void sppp_ipv6cp_down(struct sppp *sp);
HIDE void sppp_ipv6cp_open(struct sppp *sp);
@@ -902,6 +899,9 @@ sppp_detach(struct ifnet *ifp)
struct sppp **q, *p, *sp = (struct sppp*) ifp;
int i;
+ sppp_ipcp_destroy(sp);
+ sppp_ipv6cp_destroy(sp);
+
/* Remove the entry from the keepalive list. */
for (q = &spppq; (p = *q); q = &p->pp_next)
if (p == sp) {
@@ -2637,6 +2637,15 @@ sppp_ipcp_init(struct sppp *sp)
sp->ipcp.flags = 0;
sp->state[IDX_IPCP] = STATE_INITIAL;
sp->fail_counter[IDX_IPCP] = 0;
+ task_set(&sp->ipcp.set_addr_task, sppp_set_ip_addrs, sp, NULL);
+ task_set(&sp->ipcp.clear_addr_task, sppp_clear_ip_addrs, sp, NULL);
+}
+
+HIDE void
+sppp_ipcp_destroy(struct sppp *sp)
+{
+ task_del(systq, &sp->ipcp.set_addr_task);
+ task_del(systq, &sp->ipcp.clear_addr_task);
}
HIDE void
@@ -2955,38 +2964,11 @@ sppp_ipcp_RCN_nak(struct sppp *sp, struct lcp_header *h, int len)
addlog("\n");
}
-struct sppp_set_ip_addrs_args {
- struct sppp *sp;
- u_int32_t myaddr;
- u_int32_t hisaddr;
-};
-
HIDE void
sppp_ipcp_tlu(struct sppp *sp)
{
- struct ifnet *ifp = &sp->pp_if;
- struct sppp_set_ip_addrs_args *args;
-
- args = malloc(sizeof(*args), M_TEMP, M_NOWAIT);
- if (args == NULL)
- return;
-
- args->sp = sp;
-
- /* we are up. Set addresses and notify anyone interested */
- sppp_get_ip_addrs(sp, &args->myaddr, &args->hisaddr, 0);
- if ((sp->ipcp.flags & IPCP_MYADDR_DYN) &&
- (sp->ipcp.flags & IPCP_MYADDR_SEEN))
- args->myaddr = sp->ipcp.req_myaddr;
- if ((sp->ipcp.flags & IPCP_HISADDR_DYN) &&
- (sp->ipcp.flags & IPCP_HISADDR_SEEN))
- args->hisaddr = sp->ipcp.req_hisaddr;
-
- if (workq_add_task(NULL, 0, sppp_set_ip_addrs, args, NULL)) {
- free(args, M_TEMP);
- printf("%s: workq_add_task failed, cannot set "
- "addresses\n", ifp->if_xname);
- }
+ if (sp->ipcp.req_myaddr != 0 || sp->ipcp.req_hisaddr != 0)
+ task_add(systq, &sp->ipcp.set_addr_task);
}
HIDE void
@@ -3043,15 +3025,9 @@ sppp_ipcp_tls(struct sppp *sp)
HIDE void
sppp_ipcp_tlf(struct sppp *sp)
{
- struct ifnet *ifp = &sp->pp_if;
-
if (sp->ipcp.flags & (IPCP_MYADDR_DYN|IPCP_HISADDR_DYN))
/* Some address was dynamic, clear it again. */
- if (workq_add_task(NULL, 0,
- sppp_clear_ip_addrs, (void *)sp, NULL)) {
- printf("%s: workq_add_task failed, cannot clear "
- "addresses\n", ifp->if_xname);
- }
+ task_add(systq, &sp->ipcp.clear_addr_task);
/* we no longer need LCP */
sp->lcp.protos &= ~(1 << IDX_IPCP);
@@ -3110,6 +3086,14 @@ sppp_ipv6cp_init(struct sppp *sp)
sp->ipv6cp.flags = 0;
sp->state[IDX_IPV6CP] = STATE_INITIAL;
sp->fail_counter[IDX_IPV6CP] = 0;
+ task_set(&sp->ipv6cp.set_addr_task, sppp_update_ip6_addr, sp,
+ &sp->ipv6cp.req_ifid);
+}
+
+HIDE void
+sppp_ipv6cp_destroy(struct sppp *sp)
+{
+ task_del(systq, &sp->ipv6cp.set_addr_task);
}
HIDE void
@@ -3498,6 +3482,11 @@ sppp_ipv6cp_init(struct sppp *sp)
}
HIDE void
+sppp_ipv6cp_destroy(struct sppp *sp)
+{
+}
+
+HIDE void
sppp_ipv6cp_up(struct sppp *sp)
{
}
@@ -4587,16 +4576,15 @@ sppp_update_gw(struct ifnet *ifp)
}
/*
- * Work queue task adding addresses from process context.
+ * Task adding addresses from process context.
* If an address is 0, leave it the way it is.
*/
HIDE void
sppp_set_ip_addrs(void *arg1, void *arg2)
{
- struct sppp_set_ip_addrs_args *args = arg1;
- struct sppp *sp = args->sp;
- u_int32_t myaddr = args->myaddr;
- u_int32_t hisaddr = args->hisaddr;
+ struct sppp *sp = arg1;
+ u_int32_t myaddr;
+ u_int32_t hisaddr;
struct ifnet *ifp = &sp->pp_if;
int debug = ifp->if_flags & IFF_DEBUG;
struct ifaddr *ifa;
@@ -4604,8 +4592,13 @@ sppp_set_ip_addrs(void *arg1, void *arg2)
struct sockaddr_in *dest;
int s;
- /* Arguments are now on local stack so free temporary storage. */
- free(args, M_TEMP);
+ sppp_get_ip_addrs(sp, &myaddr, &hisaddr, NULL);
+ if ((sp->ipcp.flags & IPCP_MYADDR_DYN) &&
+ (sp->ipcp.flags & IPCP_MYADDR_SEEN))
+ myaddr = sp->ipcp.req_myaddr;
+ if ((sp->ipcp.flags & IPCP_HISADDR_DYN) &&
+ (sp->ipcp.flags & IPCP_HISADDR_SEEN))
+ hisaddr = sp->ipcp.req_hisaddr;
s = splsoftnet();
@@ -4656,7 +4649,7 @@ sppp_set_ip_addrs(void *arg1, void *arg2)
}
/*
- * Work queue task clearing addresses from process context.
+ * Task clearing addresses from process context.
* Clear IP addresses.
*/
HIDE void
@@ -4772,7 +4765,6 @@ sppp_update_ip6_addr(void *arg1, void *arg2)
if (ia == NULL) {
/* IPv6 disabled? */
splx(s);
- free(ifra, M_TEMP);
return;
}
@@ -4791,7 +4783,6 @@ sppp_update_ip6_addr(void *arg1, void *arg2)
SPP_ARGS(ifp), error);
}
splx(s);
- free(ifra, M_TEMP);
}
/*
@@ -4802,12 +4793,9 @@ sppp_set_ip6_addr(struct sppp *sp, const struct in6_addr *src,
const struct in6_addr *dst)
{
struct ifnet *ifp = &sp->pp_if;
- struct in6_aliasreq *ifra;
-
- ifra = malloc(sizeof(*ifra), M_TEMP, M_NOWAIT|M_ZERO);
- if (ifra == NULL)
- return;
+ struct in6_aliasreq *ifra = &sp->ipv6cp.req_ifid;
+ bzero(ifra, sizeof(*ifra));
bcopy(ifp->if_xname, ifra->ifra_name, sizeof(ifra->ifra_name));
ifra->ifra_addr.sin6_len = sizeof(struct sockaddr_in6);
@@ -4831,11 +4819,7 @@ sppp_set_ip6_addr(struct sppp *sp, const struct in6_addr *src,
/* DAD is redundant after an IPv6CP exchange. */
ifra->ifra_flags |= IN6_IFF_NODAD;
- if (workq_add_task(NULL, 0, sppp_update_ip6_addr, sp, ifra)) {
- free(ifra, M_TEMP);
- printf("%s: workq_add_task failed, cannot set IPv6 "
- "addresses\n", ifp->if_xname);
- }
+ task_add(systq, &sp->ipv6cp.set_addr_task);
}
/*