summaryrefslogtreecommitdiffstats
path: root/sys/netinet/ip_output.c
diff options
context:
space:
mode:
authorwollman <wollman@FreeBSD.org>1995-06-13 17:51:16 +0000
committerwollman <wollman@FreeBSD.org>1995-06-13 17:51:16 +0000
commit20ad4f8359820cf12331c0335034438fc23ad604 (patch)
treeb5de17b0bb0d03b7ed728b104d3d0f4a9752fd4a /sys/netinet/ip_output.c
parentc0dfcf234735c518d2c756c46fddf87d2332c838 (diff)
downloadFreeBSD-src-20ad4f8359820cf12331c0335034438fc23ad604.zip
FreeBSD-src-20ad4f8359820cf12331c0335034438fc23ad604.tar.gz
Kernel side of 3.5 multicast routing code, based on work by Bill Fenner
and other work done here. The LKM support is probably broken, but it still compiles and will be fixed later.
Diffstat (limited to 'sys/netinet/ip_output.c')
-rw-r--r--sys/netinet/ip_output.c25
1 files changed, 15 insertions, 10 deletions
diff --git a/sys/netinet/ip_output.c b/sys/netinet/ip_output.c
index 8e6fb56..45c21cc 100644
--- a/sys/netinet/ip_output.c
+++ b/sys/netinet/ip_output.c
@@ -188,15 +188,20 @@ ip_output(m0, opt, ro, flags, imo)
ip->ip_ttl = imo->imo_multicast_ttl;
if (imo->imo_multicast_ifp != NULL)
ifp = imo->imo_multicast_ifp;
+ if (imo->imo_multicast_vif != -1)
+ ip->ip_src.s_addr =
+ ip_mcast_src(imo->imo_multicast_vif);
} else
ip->ip_ttl = IP_DEFAULT_MULTICAST_TTL;
/*
* Confirm that the outgoing interface supports multicast.
*/
- if ((ifp->if_flags & IFF_MULTICAST) == 0) {
- ipstat.ips_noroute++;
- error = ENETUNREACH;
- goto bad;
+ if ((imo == NULL) || (imo->imo_multicast_vif == -1)) {
+ if ((ifp->if_flags & IFF_MULTICAST) == 0) {
+ ipstat.ips_noroute++;
+ error = ENETUNREACH;
+ goto bad;
+ }
}
/*
* If source address not specified yet, use address
@@ -805,7 +810,7 @@ ip_setmoptions(optname, imop, m)
return (ENOBUFS);
*imop = imo;
imo->imo_multicast_ifp = NULL;
- imo->imo_multicast_vif = 0;
+ imo->imo_multicast_vif = -1;
imo->imo_multicast_ttl = IP_DEFAULT_MULTICAST_TTL;
imo->imo_multicast_loop = IP_DEFAULT_MULTICAST_LOOP;
imo->imo_num_memberships = 0;
@@ -823,7 +828,7 @@ ip_setmoptions(optname, imop, m)
break;
}
i = *(mtod(m, int *));
- if (!legal_vif_num(i)) {
+ if (!legal_vif_num(i) && (i != -1)) {
error = EINVAL;
break;
}
@@ -907,7 +912,7 @@ ip_setmoptions(optname, imop, m)
* the route to the given multicast address.
*/
if (mreq->imr_interface.s_addr == INADDR_ANY) {
- ro.ro_rt = NULL;
+ bzero((caddr_t)&ro, sizeof(ro));
dst = (struct sockaddr_in *)&ro.ro_dst;
dst->sin_len = sizeof(*dst);
dst->sin_family = AF_INET;
@@ -1036,7 +1041,7 @@ ip_setmoptions(optname, imop, m)
* If all options have default values, no need to keep the mbuf.
*/
if (imo->imo_multicast_ifp == NULL &&
- imo->imo_multicast_vif == 0 &&
+ imo->imo_multicast_vif == -1 &&
imo->imo_multicast_ttl == IP_DEFAULT_MULTICAST_TTL &&
imo->imo_multicast_loop == IP_DEFAULT_MULTICAST_LOOP &&
imo->imo_num_memberships == 0) {
@@ -1065,11 +1070,11 @@ ip_getmoptions(optname, imo, mp)
switch (optname) {
- case IP_MULTICAST_VIF:
+ case IP_MULTICAST_VIF:
if (imo != NULL)
*(mtod(*mp, int *)) = imo->imo_multicast_vif;
else
- *(mtod(*mp, int *)) = 7890;
+ *(mtod(*mp, int *)) = -1;
(*mp)->m_len = sizeof(int);
return(0);
OpenPOWER on IntegriCloud