summaryrefslogtreecommitdiffstats
path: root/sys/netinet/ip_mroute.c
diff options
context:
space:
mode:
authorwollman <wollman@FreeBSD.org>1994-09-14 21:21:29 +0000
committerwollman <wollman@FreeBSD.org>1994-09-14 21:21:29 +0000
commit9d1baa34829792cd51bc88cefeb65c196927168e (patch)
tree70544de248b4acec6c63ff68edff039de856950b /sys/netinet/ip_mroute.c
parentb95a84ec5205cccdbf604cc8b40fa49245c9a50f (diff)
downloadFreeBSD-src-9d1baa34829792cd51bc88cefeb65c196927168e.zip
FreeBSD-src-9d1baa34829792cd51bc88cefeb65c196927168e.tar.gz
Add code to make multicast routing be an LKM.
Diffstat (limited to 'sys/netinet/ip_mroute.c')
-rw-r--r--sys/netinet/ip_mroute.c125
1 files changed, 111 insertions, 14 deletions
diff --git a/sys/netinet/ip_mroute.c b/sys/netinet/ip_mroute.c
index 4b7a8ba..b6a97fa 100644
--- a/sys/netinet/ip_mroute.c
+++ b/sys/netinet/ip_mroute.c
@@ -48,15 +48,15 @@
#endif
#endif
-struct mrtstat mrtstat;
-
#ifndef MROUTING
/*
* Dummy routines and globals used when multicast routing is not compiled in.
*/
-struct socket *ip_mrouter = NULL;
u_int ip_mrtproto = 0;
+struct socket *ip_mrouter = NULL;
+struct mrtstat mrtstat;
+
int
_ip_mrouter_cmd(cmd, so, m)
@@ -116,8 +116,15 @@ int (*legal_vif_num)(int) = 0;
* Globals. All but ip_mrouter and ip_mrtproto could be static,
* except for netstat or debugging purposes.
*/
+#ifndef MROUTE_LKM
struct socket *ip_mrouter = NULL;
+struct mrtstat mrtstat;
+
int ip_mrtproto = IGMP_DVMRP; /* for netstat only */
+#else
+extern struct mrtstat mrtstat;
+extern int ip_mrtproto;
+#endif
#define NO_RTE_FOUND 0x1
#define RTE_FOUND 0x2
@@ -309,7 +316,7 @@ mfcfind(origin, mcastgrp)
* Handle DVMRP setsockopt commands to modify the multicast routing tables.
*/
int
-_ip_mrouter_cmd(cmd, so, m)
+X_ip_mrouter_cmd(cmd, so, m)
int cmd;
struct socket *so;
struct mbuf *m;
@@ -327,13 +334,15 @@ _ip_mrouter_cmd(cmd, so, m)
}
}
-int (*ip_mrouter_cmd)(int, struct socket *, struct mbuf *) = _ip_mrouter_cmd;
+#ifndef MROUTE_LKM
+int (*ip_mrouter_cmd)(int, struct socket *, struct mbuf *) = X_ip_mrouter_cmd;
+#endif
/*
* Handle ioctl commands to obtain information from the cache
*/
int
-_mrt_ioctl(cmd, data)
+X_mrt_ioctl(cmd, data)
int cmd;
caddr_t data;
{
@@ -356,7 +365,11 @@ _mrt_ioctl(cmd, data)
return error;
}
-int (*mrt_ioctl)(int, caddr_t, struct proc *) = _mrt_ioctl;
+#ifndef MROUTE_LKM
+int (*mrt_ioctl)(int, caddr_t, struct proc *) = X_mrt_ioctl;
+#else
+extern int (*mrt_ioctl)(int, caddr_t, struct proc *);
+#endif
/*
* returns the packet count for the source group provided
@@ -456,7 +469,7 @@ ip_mrouter_init(so)
* Disable multicast routing
*/
int
-_ip_mrouter_done()
+X_ip_mrouter_done()
{
vifi_t vifi;
int i;
@@ -536,7 +549,9 @@ _ip_mrouter_done()
return 0;
}
-int (*ip_mrouter_done)(void) = _ip_mrouter_done;
+#ifndef MROUTE_LKM
+int (*ip_mrouter_done)(void) = X_ip_mrouter_done;
+#endif
/*
* Add a vif to the vif table
@@ -898,7 +913,7 @@ del_mfc(mfccp)
#define TUNNEL_LEN 12 /* # bytes of IP option for tunnel encapsulation */
int
-_ip_mforward(ip, ifp, m, imo)
+X_ip_mforward(ip, ifp, m, imo)
register struct ip *ip;
struct ifnet *ifp;
struct mbuf *m;
@@ -1119,8 +1134,10 @@ _ip_mforward(ip, ifp, m, imo)
}
}
+#ifndef MROUTE_LKM
int (*ip_mforward)(struct ip *, struct ifnet *, struct mbuf *,
- struct ip_moptions *) = _ip_mforward;
+ struct ip_moptions *) = X_ip_mforward;
+#endif
/*
* Clean up the cache entry if upcall is not serviced
@@ -1257,7 +1274,7 @@ ip_mdq(m, ifp, tunnel_src, rt, imo)
* numvifs there,
*/
int
-_legal_vif_num(vif)
+X_legal_vif_num(vif)
int vif;
{ if (vif>=0 && vif<=numvifs)
return(1);
@@ -1265,7 +1282,9 @@ _legal_vif_num(vif)
return(0);
}
-int (*legal_vif_num)(int) = _legal_vif_num;
+#ifndef MROUTE_LKM
+int (*legal_vif_num)(int) = X_legal_vif_num;
+#endif
static void
phyint_send(ip, vifp, m)
@@ -1440,7 +1459,11 @@ encap_send(ip, vifp, m)
* ENCAP_PROTO and a local destination address).
*/
void
+#ifdef MROUTE_LKM
+X_multiencap_decap(m)
+#else
multiencap_decap(m)
+#endif
register struct mbuf *m;
{
struct ifnet *ifp = m->m_pkthdr.rcvif;
@@ -1811,6 +1834,80 @@ priority(vifp, ip)
/*
* End of token bucket filter modifications
*/
-#endif
+
+#ifdef MROUTE_LKM
+#include <sys/conf.h>
+#include <sys/exec.h>
+#include <sys/sysent.h>
+#include <sys/lkm.h>
+
+MOD_MISC("ip_mroute_mod")
+
+static int
+ip_mroute_mod_handle(struct lkm_table *lkmtp, int cmd)
+{
+ int i;
+ struct lkm_misc *args = lkmtp->private.lkm_misc;
+ int err = 0;
+
+ switch(cmd) {
+ static int (*old_ip_mrouter_cmd)();
+ static int (*old_ip_mrouter_done)();
+ static int (*old_ip_mforward)();
+ static int (*old_mrt_ioctl)();
+ static int (*old_proto4_input)();
+ static int (*old_legal_vif_num)();
+ extern u_char ip_protox[];
+ extern struct protosw inetsw[];
+
+ case LKM_E_LOAD:
+ if(lkmexists(lkmtp) || ip_mrtproto)
+ return(EEXIST);
+ old_ip_mrouter_cmd = ip_mrouter_cmd;
+ ip_mrouter_cmd = X_ip_mrouter_cmd;
+ old_ip_mrouter_done = ip_mrouter_done;
+ ip_mrouter_done = X_ip_mrouter_done;
+ old_ip_mforward = ip_mforward;
+ ip_mforward = X_ip_mforward;
+ old_mrt_ioctl = mrt_ioctl;
+ mrt_ioctl = X_mrt_ioctl;
+ old_proto4_input = inetsw[ip_protox[IPPROTO_ENCAP]].pr_input;
+ inetsw[ip_protox[IPPROTO_ENCAP]].pr_input = X_multiencap_decap;
+ old_legal_vif_num = legal_vif_num;
+ legal_vif_num = X_legal_vif_num;
+ ip_mrtproto = IGMP_DVMRP;
+
+ printf("\nIP multicast routing loaded\n");
+ break;
+
+ case LKM_E_UNLOAD:
+ if (ip_mrouter)
+ return EINVAL;
+
+ ip_mrouter_cmd = old_ip_mrouter_cmd;
+ ip_mrouter_done = old_ip_mrouter_done;
+ ip_mforward = old_ip_mforward;
+ mrt_ioctl = old_mrt_ioctl;
+ inetsw[ip_protox[IPPROTO_ENCAP]].pr_input = old_proto4_input;
+ legal_vif_num = old_legal_vif_num;
+ ip_mrtproto = 0;
+ break;
+
+ default:
+ err = EINVAL;
+ break;
+ }
+
+ return(err);
+}
+
+int
+ip_mroute_mod(struct lkm_table *lkmtp, int cmd, int ver) {
+ DISPATCH(lkmtp, cmd, ver, ip_mroute_mod_handle, ip_mroute_mod_handle,
+ nosys);
+}
+
+#endif /* MROUTE_LKM */
+#endif /* MROUTING */
OpenPOWER on IntegriCloud