SCCS-vsn: sys/netinet/in.c 6.9
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*
- * @(#)in.c 6.8 (Berkeley) %G%
+ * @(#)in.c 6.9 (Berkeley) %G%
/*
* Return the network number from an internet address.
*/
/*
* Return the network number from an internet address.
*/
in_netof(in)
struct in_addr in;
{
in_netof(in)
struct in_addr in;
{
* if so, return subnet number.
*/
for (ia = in_ifaddr; ia; ia = ia->ia_next)
* if so, return subnet number.
*/
for (ia = in_ifaddr; ia; ia = ia->ia_next)
- if ((ia->ia_netmask & net) == ia->ia_net)
return (i & ia->ia_subnetmask);
return (net);
}
return (i & ia->ia_subnetmask);
return (net);
}
* if so, use the modified interpretation of `host'.
*/
for (ia = in_ifaddr; ia; ia = ia->ia_next)
* if so, use the modified interpretation of `host'.
*/
for (ia = in_ifaddr; ia; ia = ia->ia_next)
- if ((ia->ia_netmask & net) == ia->ia_net)
return (host &~ ia->ia_subnetmask);
return (host);
}
/*
* Return 1 if an internet address is for a ``local'' host
return (host &~ ia->ia_subnetmask);
return (host);
}
/*
* Return 1 if an internet address is for a ``local'' host
- * (one to which we have a connection).
+ * (one to which we have a connection through a local logical net).
*/
in_localaddr(in)
struct in_addr in;
*/
in_localaddr(in)
struct in_addr in;
net = i & IN_CLASSC_NET;
for (ia = in_ifaddr; ia; ia = ia->ia_next)
net = i & IN_CLASSC_NET;
for (ia = in_ifaddr; ia; ia = ia->ia_next)
- if ((ia->ia_netmask & net) == ia->ia_net)
return (1);
return (0);
}
return (1);
return (0);
}
+int in_interfaces; /* number of external internet interfaces */
+extern struct ifnet loif;
+
/*
* Generic internet control operations (ioctl's).
* Ifp is 0 if not an interface-specific ioctl.
*/
/*
* Generic internet control operations (ioctl's).
* Ifp is 0 if not an interface-specific ioctl.
*/
in_control(so, cmd, data, ifp)
struct socket *so;
int cmd;
in_control(so, cmd, data, ifp)
struct socket *so;
int cmd;
ifp->if_addrlist = (struct ifaddr *) ia;
ia->ia_ifp = ifp;
IA_SIN(ia)->sin_family = AF_INET;
ifp->if_addrlist = (struct ifaddr *) ia;
ia->ia_ifp = ifp;
IA_SIN(ia)->sin_family = AF_INET;
+ if (ifp != &loif)
+ in_interfaces++;
if ((ifp->if_flags & IFF_POINTOPOINT) == 0)
return (EINVAL);
if (ifp->if_ioctl &&
if ((ifp->if_flags & IFF_POINTOPOINT) == 0)
return (EINVAL);
if (ifp->if_ioctl &&
- (error = (*ifp->if_ioctl)(ifp, SIOCSIFADDR, ia)))
+ (error = (*ifp->if_ioctl)(ifp, SIOCSIFDSTADDR, ia)))
return (error);
ia->ia_dstaddr = ifr->ifr_dstaddr;
break;
return (error);
ia->ia_dstaddr = ifr->ifr_dstaddr;
break;
case SIOCSIFADDR:
return (in_ifinit(ifp, ia, &ifr->ifr_addr));
case SIOCSIFADDR:
return (in_ifinit(ifp, ia, &ifr->ifr_addr));
case SIOCSIFNETMASK:
ia->ia_subnetmask = ntohl(satosin(&ifr->ifr_addr)->sin_addr.s_addr);
case SIOCSIFNETMASK:
ia->ia_subnetmask = ntohl(satosin(&ifr->ifr_addr)->sin_addr.s_addr);