Shuffle some functions and variables around to make it possible for

multicast routing to be implemented as an LKM.  (There's still a bit of
work to do in this area.)
This commit is contained in:
Garrett Wollman 1994-09-14 03:10:15 +00:00
parent f86233fe54
commit 5e9ae478ac
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=2754
10 changed files with 66 additions and 56 deletions

View File

@ -68,11 +68,6 @@ kern/subr_xxx.c standard
kern/sys_generic.c standard
kern/sys_process.c standard
kern/sys_socket.c standard
kern/sysv_ipc.c optional sysvshm
kern/sysv_ipc.c optional sysvmsg
kern/sysv_ipc.c optional sysvsem
kern/sysv_msg.c optional sysvmsg
kern/sysv_sem.c optional sysvsem
kern/sysv_shm.c optional sysvshm
kern/tty.c standard
kern/tty_compat.c standard
@ -166,7 +161,7 @@ netinet/in_pcb.c optional inet
netinet/in_proto.c optional inet
netinet/ip_icmp.c optional inet
netinet/ip_input.c optional inet
netinet/ip_mroute.c optional inet mrouting
netinet/ip_mroute.c optional inet
netinet/ip_output.c optional inet
netinet/raw_ip.c optional inet
netinet/tcp_debug.c optional inet

View File

@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)route.c 8.2 (Berkeley) 11/15/93
* $Id: route.c,v 1.5 1994/09/07 19:50:42 se Exp $
* $Id: route.c,v 1.6 1994/09/08 00:17:22 wollman Exp $
*/
#include <sys/param.h>
@ -273,12 +273,9 @@ rtioctl(req, data, p)
caddr_t data;
struct proc *p;
{
#ifdef MROUTING
extern int (*mrt_ioctl)(int, caddr_t, struct proc *);
/* Multicast goop, grrr... */
return mrt_ioctl(req, data, p);
#else
return (EOPNOTSUPP);
#endif
}
struct ifaddr *

View File

@ -35,7 +35,7 @@
* SUCH DAMAGE.
*
* @(#)igmp.c 8.1 (Berkeley) 7/19/93
* $Id: igmp.c,v 1.3 1994/08/02 07:48:04 davidg Exp $
* $Id: igmp.c,v 1.4 1994/09/06 22:42:16 wollman Exp $
*/
/*
@ -607,11 +607,7 @@ igmp_sendpkt(inm, type)
* Request loopback of the report if we are acting as a multicast
* router, so that the process-level routing demon can hear it.
*/
#ifdef MROUTING
imo->imo_multicast_loop = (ip_mrouter != NULL);
#else
imo->imo_multicast_loop = 0;
#endif
ip_output(m, (struct mbuf *)0, (struct route *)0, 0, imo);

View File

@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)in_proto.c 8.1 (Berkeley) 6/10/93
* $Id: in_proto.c,v 1.3 1994/08/02 07:48:23 davidg Exp $
* $Id: in_proto.c,v 1.4 1994/09/06 22:42:19 wollman Exp $
*/
#include <sys/param.h>
@ -77,9 +77,7 @@
void eoninput(), eonctlinput(), eonprotoinit();
#endif /* EON */
#ifdef MROUTING
void multiencap_decap(struct mbuf *);
#endif
void multiencap_decap(struct mbuf *);
extern struct domain inetdomain;
@ -119,13 +117,11 @@
rip_usrreq,
0, 0, 0, 0,
},
#ifdef MROUTING
{ SOCK_RAW, &inetdomain, IPPROTO_ENCAP, PR_ATOMIC|PR_ADDR,
multiencap_decap, rip_output, 0, rip_ctloutput,
rip_usrreq,
0, 0, 0, 0,
},
#endif /* MROUTING */
#ifdef TPIP
{ SOCK_SEQPACKET,&inetdomain, IPPROTO_TP, PR_CONNREQUIRED|PR_WANTRCVD,
tpip_input, 0, tpip_ctlinput, tp_ctloutput,

View File

@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)ip_input.c 8.2 (Berkeley) 1/4/94
* $Id: ip_input.c,v 1.4 1994/08/18 22:35:30 wollman Exp $
* $Id: ip_input.c,v 1.5 1994/09/06 22:42:21 wollman Exp $
*/
#include <sys/param.h>
@ -282,7 +282,6 @@ next:
}
if (IN_MULTICAST(ntohl(ip->ip_dst.s_addr))) {
struct in_multi *inm;
#ifdef MROUTING
if (ip_mrouter) {
/*
* If we are acting as a multicast router, all
@ -313,7 +312,6 @@ next:
goto ours;
ipstat.ips_forward++;
}
#endif
/*
* See if we belong to the destination multicast group on the
* arrival interface.

View File

@ -48,6 +48,8 @@
#endif
#endif
struct mrtstat mrtstat;
#ifndef MROUTING
/*
* Dummy routines and globals used when multicast routing is not compiled in.
@ -57,7 +59,7 @@ struct socket *ip_mrouter = NULL;
u_int ip_mrtproto = 0;
int
ip_mrouter_cmd(cmd, so, m)
_ip_mrouter_cmd(cmd, so, m)
int cmd;
struct socket *so;
struct mbuf *m;
@ -65,20 +67,43 @@ ip_mrouter_cmd(cmd, so, m)
return(EOPNOTSUPP);
}
int (*ip_mrouter_cmd)(int, struct socket *, struct mbuf *) = _ip_mrouter_cmd;
int
ip_mrouter_done()
_ip_mrouter_done()
{
return(0);
}
int (*ip_mrouter_done)(void) = _ip_mrouter_done;
int
ip_mforward(ip, ifp, m)
_ip_mforward(ip, ifp, m, imo)
struct ip *ip;
struct ifnet *ifp;
struct mbuf *m;
struct ip_moptions *imo;
{
return(0);
}
int (*ip_mforward)(struct ip *, struct ifnet *, struct mbuf *,
struct ip_moptions *) = _ip_mforward;
int
_mrt_ioctl(int req, caddr_t data, struct proc *p)
{
return EOPNOTSUPP;
}
int (*mrt_ioctl)(int, caddr_t, struct proc *) = _mrt_ioctl;
void multiencap_decap(struct mbuf *m) { /* XXX must fixup manually */
rip_input(m);
}
int (*legal_vif_num)(int) = 0;
#else
#define INSIZ sizeof(struct in_addr)
@ -99,7 +124,6 @@ int ip_mrtproto = IGMP_DVMRP; /* for netstat only */
struct mbuf *mfctable[MFCTBLSIZ];
struct vif viftable[MAXVIFS];
struct mrtstat mrtstat;
u_int mrtdebug = 0; /* debug level */
u_int tbfdebug = 0; /* tbf debug level */
@ -129,7 +153,7 @@ struct ifnet multicast_decap_if[MAXVIFS];
/* prototype IP hdr for encapsulated packets */
struct ip multicast_encap_iphdr = {
#if defined(ultrix) || defined(i386)
#if BYTE_ORDER == LITTLE_ENDIAN
sizeof(struct ip) >> 2, IPVERSION,
#else
IPVERSION, sizeof(struct ip) >> 2,
@ -166,7 +190,7 @@ static int del_mfc(struct delmfcctl *);
static void cleanup_cache(void *);
static int ip_mdq(struct mbuf *, struct ifnet *, u_long, struct mfc *,
struct ip_moptions *);
int legal_vif_num(int);
extern int (*legal_vif_num)(int);
static void phyint_send(struct ip *, struct vif *, struct mbuf *);
static void srcrt_send(struct ip *, struct vif *, struct mbuf *);
static void encap_send(struct ip *, struct vif *, struct mbuf *);
@ -285,7 +309,7 @@ mfcfind(origin, mcastgrp)
* Handle DVMRP setsockopt commands to modify the multicast routing tables.
*/
int
ip_mrouter_cmd(cmd, so, m)
_ip_mrouter_cmd(cmd, so, m)
int cmd;
struct socket *so;
struct mbuf *m;
@ -303,12 +327,13 @@ ip_mrouter_cmd(cmd, so, m)
}
}
int (*ip_mrouter_cmd)(int, struct socket *, struct mbuf *) = _ip_mrouter_cmd;
/*
* Handle ioctl commands to obtain information from the cache
*/
int
mrt_ioctl(cmd, data)
_mrt_ioctl(cmd, data)
int cmd;
caddr_t data;
{
@ -331,6 +356,8 @@ mrt_ioctl(cmd, data)
return error;
}
int (*mrt_ioctl)(int, caddr_t, struct proc *) = _mrt_ioctl;
/*
* returns the packet count for the source group provided
*/
@ -429,7 +456,7 @@ ip_mrouter_init(so)
* Disable multicast routing
*/
int
ip_mrouter_done()
_ip_mrouter_done()
{
vifi_t vifi;
int i;
@ -509,6 +536,8 @@ ip_mrouter_done()
return 0;
}
int (*ip_mrouter_done)(void) = _ip_mrouter_done;
/*
* Add a vif to the vif table
*/
@ -869,10 +898,10 @@ del_mfc(mfccp)
#define TUNNEL_LEN 12 /* # bytes of IP option for tunnel encapsulation */
int
ip_mforward(ip, ifp, m, imo)
struct mbuf *m;
_ip_mforward(ip, ifp, m, imo)
register struct ip *ip;
struct ifnet *ifp;
struct mbuf *m;
struct ip_moptions *imo;
{
register struct mfc *rt;
@ -1090,6 +1119,9 @@ ip_mforward(ip, ifp, m, imo)
}
}
int (*ip_mforward)(struct ip *, struct ifnet *, struct mbuf *,
struct ip_moptions *) = _ip_mforward;
/*
* Clean up the cache entry if upcall is not serviced
*/
@ -1225,7 +1257,7 @@ ip_mdq(m, ifp, tunnel_src, rt, imo)
* numvifs there,
*/
int
legal_vif_num(vif)
_legal_vif_num(vif)
int vif;
{ if (vif>=0 && vif<=numvifs)
return(1);
@ -1233,6 +1265,8 @@ legal_vif_num(vif)
return(0);
}
int (*legal_vif_num)(int) = _legal_vif_num;
static void
phyint_send(ip, vifp, m)
struct ip *ip;

View File

@ -35,7 +35,7 @@
* SUCH DAMAGE.
*
* @(#)ip_mroute.h 8.1 (Berkeley) 6/10/93
* $Id: ip_mroute.h,v 1.3 1994/08/21 05:27:32 paul Exp $
* $Id: ip_mroute.h,v 1.4 1994/09/06 22:42:23 wollman Exp $
*/
#ifndef _NETINET_IP_MROUTE_H_
@ -246,8 +246,8 @@ struct tbf
u_long q_len; /* length of queue at this vif */
};
int ip_mrouter_cmd __P((int, struct socket *, struct mbuf *));
int ip_mrouter_done __P((void));
extern int (*ip_mrouter_cmd) __P((int, struct socket *, struct mbuf *));
extern int (*ip_mrouter_done) __P((void));
#endif /* KERNEL */

View File

@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)ip_output.c 8.3 (Berkeley) 1/21/94
* $Id: ip_output.c,v 1.6 1994/09/06 22:42:24 wollman Exp $
* $Id: ip_output.c,v 1.7 1994/09/09 22:05:02 wollman Exp $
*/
#include <sys/param.h>
@ -211,7 +211,6 @@ ip_output(m0, opt, ro, flags, imo)
*/
ip_mloopback(ifp, m, dst);
}
#ifdef MROUTING
else {
/*
* If we are acting as a multicast router, perform
@ -240,7 +239,7 @@ ip_output(m0, opt, ro, flags, imo)
}
}
}
#endif
/*
* Multicasts with a time-to-live of zero may be looped-
* back, above, but must not be transmitted on a network.
@ -790,9 +789,13 @@ ip_setmoptions(optname, imop, m)
}
switch (optname) {
#ifdef MROUTING
extern int (*legal_vif_num)(int);
/* store an index number for the vif you wanna use in the send */
case IP_MULTICAST_VIF:
if (!legal_vif_num) {
error = EOPNOTSUPP;
break;
}
if (m == NULL || m->m_len != sizeof(int)) {
error = EINVAL;
break;
@ -804,7 +807,6 @@ ip_setmoptions(optname, imop, m)
}
imo->imo_multicast_vif = i;
break;
#endif
case IP_MULTICAST_IF:
/*

View File

@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)ip_var.h 8.1 (Berkeley) 6/10/93
* $Id: ip_var.h,v 1.4 1994/08/21 05:27:33 paul Exp $
* $Id: ip_var.h,v 1.5 1994/09/06 22:42:25 wollman Exp $
*/
#ifndef _NETINET_IP_VAR_H_
@ -169,7 +169,7 @@ void ip_freef __P((struct ipq *));
void ip_freemoptions __P((struct ip_moptions *));
int ip_getmoptions __P((int, struct ip_moptions *, struct mbuf **));
void ip_init __P((void));
int ip_mforward __P((struct ip *, struct ifnet *, struct mbuf *,
extern int (*ip_mforward) __P((struct ip *, struct ifnet *, struct mbuf *,
struct ip_moptions *));
int ip_optcopy __P((struct ip *, struct ip *));
int ip_output __P((struct mbuf *,

View File

@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)raw_ip.c 8.2 (Berkeley) 1/4/94
* $Id: raw_ip.c,v 1.2 1994/08/02 07:48:49 davidg Exp $
* $Id: raw_ip.c,v 1.3 1994/09/06 22:42:26 wollman Exp $
*/
#include <sys/param.h>
@ -217,7 +217,6 @@ rip_ctloutput(op, so, level, optname, m)
case DVMRP_DEL_VIF:
case DVMRP_ADD_MFC:
case DVMRP_DEL_MFC:
#ifdef MROUTING
if (op == PRCO_SETOPT) {
error = ip_mrouter_cmd(optname, so, *m);
if (*m)
@ -225,11 +224,6 @@ rip_ctloutput(op, so, level, optname, m)
} else
error = EINVAL;
return (error);
#else
if (op == PRCO_SETOPT && *m)
(void)m_free(*m);
return (EOPNOTSUPP);
#endif
}
return (ip_ctloutput(op, so, level, optname, m));
}
@ -274,10 +268,8 @@ rip_usrreq(so, req, m, nam, control)
case PRU_DETACH:
if (inp == 0)
panic("rip_detach");
#ifdef MROUTING
if (so == ip_mrouter)
ip_mrouter_done();
#endif
in_pcbdetach(inp);
break;