Module Name: src
Committed By: tls
Date: Sun Aug 10 06:56:38 UTC 2014
Modified Files:
src/sys/netmpls [tls-earlyentropy]: mpls_proto.c
Log Message:
Rebase.
To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.6.2.1 src/sys/netmpls/mpls_proto.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/netmpls/mpls_proto.c
diff -u src/sys/netmpls/mpls_proto.c:1.6 src/sys/netmpls/mpls_proto.c:1.6.2.1
--- src/sys/netmpls/mpls_proto.c:1.6 Tue Feb 25 18:30:12 2014
+++ src/sys/netmpls/mpls_proto.c Sun Aug 10 06:56:38 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: mpls_proto.c,v 1.6 2014/02/25 18:30:12 pooka Exp $ */
+/* $NetBSD: mpls_proto.c,v 1.6.2.1 2014/08/10 06:56:38 tls Exp $ */
/*
* Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mpls_proto.c,v 1.6 2014/02/25 18:30:12 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mpls_proto.c,v 1.6.2.1 2014/08/10 06:56:38 tls Exp $");
#include "opt_inet.h"
#include "opt_mbuftrace.h"
@@ -49,8 +49,7 @@ __KERNEL_RCSID(0, "$NetBSD: mpls_proto.c
struct ifqueue mplsintrq;
-static int mpls_usrreq(struct socket *, int, struct mbuf *, struct mbuf *,
- struct mbuf *, struct lwp *);
+static int mpls_attach(struct socket *, int);
static void sysctl_net_mpls_setup(struct sysctllog **);
#ifdef MBUFTRACE
@@ -62,7 +61,7 @@ int mpls_mapttl_inet = 1;
int mpls_mapttl_inet6 = 1;
int mpls_icmp_respond = 0;
int mpls_forwarding = 0;
-int mpls_accept = 0;
+int mpls_frame_accept = 0;
int mpls_mapprec_inet = 1;
int mpls_mapclass_inet6 = 1;
int mpls_rfc4182 = 1;
@@ -78,63 +77,184 @@ void mpls_init(void)
sysctl_net_mpls_setup(NULL);
}
-DOMAIN_DEFINE(mplsdomain);
-
-const struct protosw mplssw[] = {
- { .pr_domain = &mplsdomain,
- .pr_init = mpls_init,
- },
- {
- .pr_type = SOCK_DGRAM,
- .pr_domain = &mplsdomain,
- .pr_flags = PR_ATOMIC | PR_ADDR,
- .pr_usrreq = mpls_usrreq,
- },
- {
- .pr_type = SOCK_RAW,
- .pr_domain = &mplsdomain,
- .pr_flags = PR_ATOMIC | PR_ADDR,
- .pr_usrreq = mpls_usrreq,
- },
-};
-
-struct domain mplsdomain = {
- .dom_family = PF_MPLS,
- .dom_name = "MPLS",
- .dom_init = NULL,
- .dom_externalize = NULL,
- .dom_dispose = NULL,
- .dom_protosw = mplssw,
- .dom_protoswNPROTOSW = &mplssw[__arraycount(mplssw)],
- .dom_rtattach = rt_inithead,
- .dom_rtoffset = offsetof(struct sockaddr_mpls, smpls_addr) << 3,
- .dom_maxrtkey = sizeof(union mpls_shim),
- .dom_ifattach = NULL,
- .dom_ifdetach = NULL,
- .dom_ifqueues = { &mplsintrq, NULL },
- .dom_link = { NULL },
- .dom_mowner = MOWNER_INIT("MPLS", ""),
- .dom_sa_cmpofs = offsetof(struct sockaddr_mpls, smpls_addr),
- .dom_sa_cmplen = sizeof(union mpls_shim),
- .dom_rtcache = LIST_HEAD_INITIALIZER(mplsdomain.dom_rtcache)
-};
-
static int
-mpls_usrreq(struct socket *so, int req, struct mbuf *m,
- struct mbuf *nam, struct mbuf *control, struct lwp *l)
+mpls_attach(struct socket *so, int proto)
{
int error = EOPNOTSUPP;
- if ((req == PRU_ATTACH) &&
- (so->so_snd.sb_hiwat == 0 || so->so_rcv.sb_hiwat == 0)) {
- int s = splsoftnet();
+ sosetlock(so);
+ if (so->so_snd.sb_hiwat == 0 || so->so_rcv.sb_hiwat == 0) {
error = soreserve(so, 8192, 8192);
- splx(s);
}
-
return error;
}
+static void
+mpls_detach(struct socket *so)
+{
+}
+
+static int
+mpls_accept(struct socket *so, struct mbuf *nam)
+{
+ KASSERT(solocked(so));
+
+ return EOPNOTSUPP;
+}
+
+static int
+mpls_bind(struct socket *so, struct mbuf *nam, struct lwp *l)
+{
+ KASSERT(solocked(so));
+
+ return EOPNOTSUPP;
+}
+
+static int
+mpls_listen(struct socket *so, struct lwp *l)
+{
+ KASSERT(solocked(so));
+
+ return EOPNOTSUPP;
+}
+
+static int
+mpls_connect(struct socket *so, struct mbuf *nam, struct lwp *l)
+{
+ KASSERT(solocked(so));
+
+ return EOPNOTSUPP;
+}
+
+static int
+mpls_connect2(struct socket *so, struct socket *so2)
+{
+ KASSERT(solocked(so));
+
+ return EOPNOTSUPP;
+}
+
+static int
+mpls_disconnect(struct socket *so)
+{
+ KASSERT(solocked(so));
+
+ return EOPNOTSUPP;
+}
+
+static int
+mpls_shutdown(struct socket *so)
+{
+ KASSERT(solocked(so));
+
+ return EOPNOTSUPP;
+}
+
+static int
+mpls_abort(struct socket *so)
+{
+ KASSERT(solocked(so));
+
+ return EOPNOTSUPP;
+}
+
+static int
+mpls_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
+{
+ return EOPNOTSUPP;
+}
+
+static int
+mpls_stat(struct socket *so, struct stat *ub)
+{
+ KASSERT(solocked(so));
+
+ return EOPNOTSUPP;
+}
+
+static int
+mpls_peeraddr(struct socket *so, struct mbuf *nam)
+{
+ KASSERT(solocked(so));
+
+ return EOPNOTSUPP;
+}
+
+static int
+mpls_sockaddr(struct socket *so, struct mbuf *nam)
+{
+ KASSERT(solocked(so));
+
+ return EOPNOTSUPP;
+}
+
+static int
+mpls_rcvd(struct socket *so, int flags, struct lwp *l)
+{
+ KASSERT(solocked(so));
+
+ return EOPNOTSUPP;
+}
+
+static int
+mpls_recvoob(struct socket *so, struct mbuf *m, int flags)
+{
+ KASSERT(solocked(so));
+
+ return EOPNOTSUPP;
+}
+
+static int
+mpls_send(struct socket *so, struct mbuf *m, struct mbuf *nam,
+ struct mbuf *control, struct lwp *l)
+{
+ KASSERT(solocked(so));
+
+ return EOPNOTSUPP;
+}
+
+static int
+mpls_sendoob(struct socket *so, struct mbuf *m, struct mbuf *control)
+{
+ KASSERT(solocked(so));
+
+ return EOPNOTSUPP;
+}
+
+static int
+mpls_purgeif(struct socket *so, struct ifnet *ifp)
+{
+
+ return EOPNOTSUPP;
+}
+
+static int
+mpls_usrreq(struct socket *so, int req, struct mbuf *m,
+ struct mbuf *nam, struct mbuf *control, struct lwp *l)
+{
+ KASSERT(req != PRU_ATTACH);
+ KASSERT(req != PRU_DETACH);
+ KASSERT(req != PRU_ACCEPT);
+ KASSERT(req != PRU_BIND);
+ KASSERT(req != PRU_LISTEN);
+ KASSERT(req != PRU_CONNECT);
+ KASSERT(req != PRU_CONNECT2);
+ KASSERT(req != PRU_DISCONNECT);
+ KASSERT(req != PRU_SHUTDOWN);
+ KASSERT(req != PRU_ABORT);
+ KASSERT(req != PRU_CONTROL);
+ KASSERT(req != PRU_SENSE);
+ KASSERT(req != PRU_PEERADDR);
+ KASSERT(req != PRU_SOCKADDR);
+ KASSERT(req != PRU_RCVD);
+ KASSERT(req != PRU_RCVOOB);
+ KASSERT(req != PRU_SEND);
+ KASSERT(req != PRU_SENDOOB);
+ KASSERT(req != PRU_PURGEIF);
+
+ return EOPNOTSUPP;
+}
+
/*
* Sysctl for MPLS variables.
*/
@@ -164,7 +284,7 @@ sysctl_net_mpls_setup(struct sysctllog *
CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
CTLTYPE_INT, "accept",
SYSCTL_DESCR("Accept MPLS Frames"),
- NULL, 0, &mpls_accept, 0,
+ NULL, 0, &mpls_frame_accept, 0,
CTL_NET, PF_MPLS, CTL_CREATE, CTL_EOL);
sysctl_createv(clog, 0, NULL, NULL,
CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
@@ -213,3 +333,89 @@ sysctl_net_mpls_setup(struct sysctllog *
CTL_NET, PF_MPLS, CTL_CREATE, CTL_EOL);
#endif
}
+
+DOMAIN_DEFINE(mplsdomain);
+
+PR_WRAP_USRREQS(mpls)
+#define mpls_attach mpls_attach_wrapper
+#define mpls_detach mpls_detach_wrapper
+#define mpls_accept mpls_accept_wrapper
+#define mpls_bind mpls_bind_wrapper
+#define mpls_listen mpls_listen_wrapper
+#define mpls_connect mpls_connect_wrapper
+#define mpls_connect2 mpls_connect2_wrapper
+#define mpls_disconnect mpls_disconnect_wrapper
+#define mpls_shutdown mpls_shutdown_wrapper
+#define mpls_abort mpls_abort_wrapper
+#define mpls_ioctl mpls_ioctl_wrapper
+#define mpls_stat mpls_stat_wrapper
+#define mpls_peeraddr mpls_peeraddr_wrapper
+#define mpls_sockaddr mpls_sockaddr_wrapper
+#define mpls_rcvd mpls_rcvd_wrapper
+#define mpls_recvoob mpls_recvoob_wrapper
+#define mpls_send mpls_send_wrapper
+#define mpls_sendoob mpls_sendoob_wrapper
+#define mpls_purgeif mpls_purgeif_wrapper
+#define mpls_usrreq mpls_usrreq_wrapper
+
+static const struct pr_usrreqs mpls_usrreqs = {
+ .pr_attach = mpls_attach,
+ .pr_detach = mpls_detach,
+ .pr_accept = mpls_accept,
+ .pr_bind = mpls_bind,
+ .pr_listen = mpls_listen,
+ .pr_connect = mpls_connect,
+ .pr_connect2 = mpls_connect2,
+ .pr_disconnect = mpls_disconnect,
+ .pr_shutdown = mpls_shutdown,
+ .pr_abort = mpls_abort,
+ .pr_ioctl = mpls_ioctl,
+ .pr_stat = mpls_stat,
+ .pr_peeraddr = mpls_peeraddr,
+ .pr_sockaddr = mpls_sockaddr,
+ .pr_rcvd = mpls_rcvd,
+ .pr_recvoob = mpls_recvoob,
+ .pr_send = mpls_send,
+ .pr_sendoob = mpls_sendoob,
+ .pr_purgeif = mpls_purgeif,
+ .pr_generic = mpls_usrreq,
+};
+
+const struct protosw mplssw[] = {
+ { .pr_domain = &mplsdomain,
+ .pr_init = mpls_init,
+ },
+ {
+ .pr_type = SOCK_DGRAM,
+ .pr_domain = &mplsdomain,
+ .pr_flags = PR_ATOMIC | PR_ADDR,
+ .pr_usrreqs = &mpls_usrreqs,
+ },
+ {
+ .pr_type = SOCK_RAW,
+ .pr_domain = &mplsdomain,
+ .pr_flags = PR_ATOMIC | PR_ADDR,
+ .pr_usrreqs = &mpls_usrreqs,
+ },
+};
+
+struct domain mplsdomain = {
+ .dom_family = PF_MPLS,
+ .dom_name = "MPLS",
+ .dom_init = NULL,
+ .dom_externalize = NULL,
+ .dom_dispose = NULL,
+ .dom_protosw = mplssw,
+ .dom_protoswNPROTOSW = &mplssw[__arraycount(mplssw)],
+ .dom_rtattach = rt_inithead,
+ .dom_rtoffset = offsetof(struct sockaddr_mpls, smpls_addr) << 3,
+ .dom_maxrtkey = sizeof(union mpls_shim),
+ .dom_ifattach = NULL,
+ .dom_ifdetach = NULL,
+ .dom_ifqueues = { &mplsintrq, NULL },
+ .dom_link = { NULL },
+ .dom_mowner = MOWNER_INIT("MPLS", ""),
+ .dom_sa_cmpofs = offsetof(struct sockaddr_mpls, smpls_addr),
+ .dom_sa_cmplen = sizeof(union mpls_shim),
+ .dom_rtcache = LIST_HEAD_INITIALIZER(mplsdomain.dom_rtcache)
+};