diff options
Diffstat (limited to 'sys/netinet/raw_ip.c')
-rw-r--r-- | sys/netinet/raw_ip.c | 40 |
1 files changed, 31 insertions, 9 deletions
diff --git a/sys/netinet/raw_ip.c b/sys/netinet/raw_ip.c index f435d97..8599a1b 100644 --- a/sys/netinet/raw_ip.c +++ b/sys/netinet/raw_ip.c @@ -86,6 +86,28 @@ ip_fw_ctl_t *ip_fw_ctl_ptr; ip_dn_ctl_t *ip_dn_ctl_ptr; /* + * hooks for multicast routing. They all default to NULL, + * so leave them not initialized and rely on BSS being set to 0. + */ + +/* The socket used to communicate with the multicast routing daemon. */ +struct socket *ip_mrouter; + +/* The various mrouter and rsvp functions */ +int (*ip_mrouter_set)(struct socket *, struct sockopt *); +int (*ip_mrouter_get)(struct socket *, struct sockopt *); +int (*ip_mrouter_done)(void); +int (*ip_mforward)(struct ip *, struct ifnet *, struct mbuf *, + struct ip_moptions *); +int (*mrt_ioctl)(int, caddr_t); +int (*legal_vif_num)(int); +u_long (*ip_mcast_src)(int); + +void (*rsvp_input_p)(struct mbuf *m, int off); +int (*ip_rsvp_vif)(struct socket *, struct sockopt *); +void (*ip_rsvp_force_done)(struct socket *); + +/* * Nominal space allocated to a raw ip socket. */ #define RIPSNDQ 8192 @@ -351,7 +373,8 @@ rip_ctloutput(so, sopt) case MRT_DEL_MFC: case MRT_VERSION: case MRT_ASSERT: - error = ip_mrouter_get(so, sopt); + error = ip_mrouter_get ? ip_mrouter_get(so, sopt) : + EOPNOTSUPP; break; default: @@ -401,13 +424,10 @@ rip_ctloutput(so, sopt) error = ip_rsvp_done(); break; - /* XXX - should be combined */ case IP_RSVP_VIF_ON: - error = ip_rsvp_vif_init(so, sopt); - break; - case IP_RSVP_VIF_OFF: - error = ip_rsvp_vif_done(so, sopt); + error = ip_rsvp_vif ? + ip_rsvp_vif(so, sopt) : EINVAL; break; case MRT_INIT: @@ -418,7 +438,8 @@ rip_ctloutput(so, sopt) case MRT_DEL_MFC: case MRT_VERSION: case MRT_ASSERT: - error = ip_mrouter_set(so, sopt); + error = ip_mrouter_set ? ip_mrouter_set(so, sopt) : + EOPNOTSUPP; break; default: @@ -546,9 +567,10 @@ rip_detach(struct socket *so) inp = sotoinpcb(so); if (inp == 0) panic("rip_detach"); - if (so == ip_mrouter) + if (so == ip_mrouter && ip_mrouter_done) ip_mrouter_done(); - ip_rsvp_force_done(so); + if (ip_rsvp_force_done) + ip_rsvp_force_done(so); if (so == ip_rsvpd) ip_rsvp_done(); in_pcbdetach(inp); |