summaryrefslogtreecommitdiffstats
path: root/sys/kern/uipc_sockbuf.c
diff options
context:
space:
mode:
authorandre <andre@FreeBSD.org>2004-10-19 15:13:30 +0000
committerandre <andre@FreeBSD.org>2004-10-19 15:13:30 +0000
commit504a86a63b9be990f6de8ffdb3813215380bf163 (patch)
tree6ed86bab8d6cc91fa056f60041d4ca61c1f4270e /sys/kern/uipc_sockbuf.c
parent23afa2eef1039011de5f37f016a491ec611e7039 (diff)
downloadFreeBSD-src-504a86a63b9be990f6de8ffdb3813215380bf163.zip
FreeBSD-src-504a86a63b9be990f6de8ffdb3813215380bf163.tar.gz
Support for dynamically loadable and unloadable protocols within existing protocol
families. The protosw[] array of any particular protocol family ("domain") is of fixed size defined at compile time. This made it impossible to dynamically add or remove any protocols to or from it. We work around this by introducing so called SPACER's which are embedded into the protosw[] array at compile time. The SPACER's have a special protocol number (32767) to indicate the fact that they are SPACER's but are otherwise NULL. Only as many protocols can be dynamically loaded as SPACER's are provided in the protosw[] structure. The pr_usrreqs structure is treated more special and contains pointers to dummy functions only returning EOPNOTSUPP. This is needed because the use of those functions pointers is usually not checked within the kernel because until now it was assumed to be a valid function pointer. Instead of fixing all potential callers we just return a proper error code. Two new functions provide a clean API to register and unregister a protocol. The register function expects a pointer to a valid and complete struct protosw including a pointer to struct pru_usrreqs provided by the caller. Upon successful registration the pr_init() function will be called to finish initialization of the protocol. The unregister function restores the SPACER in place of the protocol again. It is the responseability of the caller to ensure proper closing of all sockets and freeing of memory allocation by the unloading protocol. sys/protosw.h o Define generic PROTO_SPACER to be 32767 o Prototypes for all pru_*_notsupp() functions o Prototypes for pf_proto_[un]register() functions kern/uipc_domain.c o Global struct pr_usrreqs nousrreqs containing valid pointers to the pru_*_notsupp() functions o New functions pf_proto_[un]register() kern/uipc_socket2.c o New functions bodies for all pru_*_notsupp() functions
Diffstat (limited to 'sys/kern/uipc_sockbuf.c')
-rw-r--r--sys/kern/uipc_sockbuf.c79
1 files changed, 78 insertions, 1 deletions
diff --git a/sys/kern/uipc_sockbuf.c b/sys/kern/uipc_sockbuf.c
index 02b68d8..eff3c6f 100644
--- a/sys/kern/uipc_sockbuf.c
+++ b/sys/kern/uipc_sockbuf.c
@@ -1277,12 +1277,30 @@ sbcreatecontrol(p, size, type, level)
* supported by a protocol. Fill in as needed.
*/
int
+pru_abort_notsupp(struct socket *so)
+{
+ return EOPNOTSUPP;
+}
+
+int
pru_accept_notsupp(struct socket *so, struct sockaddr **nam)
{
return EOPNOTSUPP;
}
int
+pru_attach_notsupp(struct socket *so, int proto, struct thread *td)
+{
+ return EOPNOTSUPP;
+}
+
+int
+pru_bind_notsupp(struct socket *so, struct sockaddr *nam, struct thread *td)
+{
+ return EOPNOTSUPP;
+}
+
+int
pru_connect_notsupp(struct socket *so, struct sockaddr *nam, struct thread *td)
{
return EOPNOTSUPP;
@@ -1296,7 +1314,19 @@ pru_connect2_notsupp(struct socket *so1, struct socket *so2)
int
pru_control_notsupp(struct socket *so, u_long cmd, caddr_t data,
- struct ifnet *ifp, struct thread *td)
+ struct ifnet *ifp, struct thread *td)
+{
+ return EOPNOTSUPP;
+}
+
+int
+pru_detach_notsupp(struct socket *so)
+{
+ return EOPNOTSUPP;
+}
+
+int
+pru_disconnect_notsupp(struct socket *so)
{
return EOPNOTSUPP;
}
@@ -1308,6 +1338,12 @@ pru_listen_notsupp(struct socket *so, struct thread *td)
}
int
+pru_peeraddr_notsupp(struct socket *so, struct sockaddr **nam)
+{
+ return EOPNOTSUPP;
+}
+
+int
pru_rcvd_notsupp(struct socket *so, int flags)
{
return EOPNOTSUPP;
@@ -1319,6 +1355,13 @@ pru_rcvoob_notsupp(struct socket *so, struct mbuf *m, int flags)
return EOPNOTSUPP;
}
+int
+pru_send_notsupp(struct socket *so, int flags, struct mbuf *m,
+ struct sockaddr *addr, struct mbuf *control, struct thread *td)
+{
+ return EOPNOTSUPP;
+}
+
/*
* This isn't really a ``null'' operation, but it's the default one
* and doesn't do anything destructive.
@@ -1330,6 +1373,40 @@ pru_sense_null(struct socket *so, struct stat *sb)
return 0;
}
+int
+pru_shutdown_notsupp(struct socket *so)
+{
+ return EOPNOTSUPP;
+}
+
+int
+pru_sockaddr_notsupp(struct socket *so, struct sockaddr **nam)
+{
+ return EOPNOTSUPP;
+}
+
+int
+pru_sosend_notsupp(struct socket *so, struct sockaddr *addr, struct uio *uio,
+ struct mbuf *top, struct mbuf *control, int flags, struct thread *td)
+{
+ return EOPNOTSUPP;
+}
+
+int
+pru_soreceive_notsupp(struct socket *so, struct sockaddr **paddr,
+ struct uio *uio, struct mbuf **mp0, struct mbuf **controlp,
+ int *flagsp)
+{
+ return EOPNOTSUPP;
+}
+
+int
+pru_sopoll_notsupp(struct socket *so, int events, struct ucred *cred,
+ struct thread *td)
+{
+ return EOPNOTSUPP;
+}
+
/*
* For protocol types that don't keep cached copies of labels in their
* pcbs, provide a null sosetlabel that does a NOOP.
OpenPOWER on IntegriCloud