aboutsummaryrefslogtreecommitdiff
path: root/usr.sbin
diff options
context:
space:
mode:
authorBrian Somers <brian@FreeBSD.org>1998-10-26 19:07:36 +0000
committerBrian Somers <brian@FreeBSD.org>1998-10-26 19:07:36 +0000
commit17871c5f6c2cdee5d29ab34b10dbc2bba8c568a5 (patch)
tree47ad38f2203177544eafcdc9db624f5a5c6f40f7 /usr.sbin
parentf377c8d85199ba156c0949f652b1851232bd39c1 (diff)
Notes
Diffstat (limited to 'usr.sbin')
-rw-r--r--usr.sbin/ppp/command.c32
-rw-r--r--usr.sbin/ppp/iface.c74
-rw-r--r--usr.sbin/ppp/ppp.818
-rw-r--r--usr.sbin/ppp/ppp.8.m418
4 files changed, 113 insertions, 29 deletions
diff --git a/usr.sbin/ppp/command.c b/usr.sbin/ppp/command.c
index a1b1789cac17..f474aca87aca 100644
--- a/usr.sbin/ppp/command.c
+++ b/usr.sbin/ppp/command.c
@@ -17,7 +17,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $Id: command.c,v 1.168 1998/10/22 02:32:48 brian Exp $
+ * $Id: command.c,v 1.169 1998/10/24 01:08:45 brian Exp $
*
*/
#include <sys/types.h>
@@ -132,7 +132,7 @@
#define NEG_DNS 50
const char Version[] = "2.0";
-const char VersionDate[] = "$Date: 1998/10/22 02:32:48 $";
+const char VersionDate[] = "$Date: 1998/10/24 01:08:45 $";
static int ShowCommand(struct cmdargs const *);
static int TerminalCommand(struct cmdargs const *);
@@ -2321,21 +2321,27 @@ IfaceAddCommand(struct cmdargs const *arg)
int bits, n, how;
struct in_addr ifa, mask, brd;
- if (arg->argc == arg->argn + 2) {
- if (!ParseAddr(NULL, 1, arg->argv + arg->argn, &ifa, &mask, &bits))
- return -1;
- n = 1;
- } else if (arg->argc == arg->argn + 3) {
+ if (arg->argc == arg->argn + 1) {
if (!ParseAddr(NULL, 1, arg->argv + arg->argn, &ifa, NULL, NULL))
return -1;
- if (!ParseAddr(NULL, 1, arg->argv + arg->argn + 1, &mask, NULL, NULL))
+ mask.s_addr = brd.s_addr = INADDR_BROADCAST;
+ } else {
+ if (arg->argc == arg->argn + 2) {
+ if (!ParseAddr(NULL, 1, arg->argv + arg->argn, &ifa, &mask, &bits))
+ return -1;
+ n = 1;
+ } else if (arg->argc == arg->argn + 3) {
+ if (!ParseAddr(NULL, 1, arg->argv + arg->argn, &ifa, NULL, NULL))
+ return -1;
+ if (!ParseAddr(NULL, 1, arg->argv + arg->argn + 1, &mask, NULL, NULL))
+ return -1;
+ n = 2;
+ } else
return -1;
- n = 2;
- } else
- return -1;
- if (!ParseAddr(NULL, 1, arg->argv + arg->argn + n, &brd, NULL, NULL))
- return -1;
+ if (!ParseAddr(NULL, 1, arg->argv + arg->argn + n, &brd, NULL, NULL))
+ return -1;
+ }
how = IFACE_ADD_LAST;
if (arg->cmd->args)
diff --git a/usr.sbin/ppp/iface.c b/usr.sbin/ppp/iface.c
index c21769016143..bca10ee0c3c6 100644
--- a/usr.sbin/ppp/iface.c
+++ b/usr.sbin/ppp/iface.c
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id:$
+ * $Id: iface.c,v 1.1 1998/10/22 02:32:49 brian Exp $
*/
#include <sys/types.h>
@@ -232,6 +232,7 @@ iface_addr_Zap(const char *name, struct iface_addr *addr)
me->sin_len = peer->sin_len = sizeof(struct sockaddr_in);
me->sin_addr = addr->ifa;
peer->sin_addr = addr->brd;
+ log_Printf(LogDEBUG, "Delete %s\n", inet_ntoa(addr->ifa));
if (ID0ioctl(s, SIOCDIFADDR, &ifra) < 0)
log_Printf(LogWARN, "iface_addr_Zap: ioctl(SIOCDIFADDR, %s): %s\n",
inet_ntoa(addr->ifa), strerror(errno));
@@ -256,7 +257,7 @@ int
iface_inAdd(struct iface *iface, struct in_addr ifa, struct in_addr mask,
struct in_addr brd, int how)
{
- int slot, s;
+ int slot, s, chg;
struct ifaliasreq ifra;
struct sockaddr_in *me, *peer, *msk;
struct iface_addr *addr;
@@ -284,27 +285,76 @@ iface_inAdd(struct iface *iface, struct in_addr ifa, struct in_addr mask,
return 0;
}
+ /*
+ * We've gotta be careful here. If we try to add an address with the
+ * same destination as an existing interface, nothing will work.
+ * Instead, we tweak all previous address entries that match the
+ * to-be-added destination to 255.255.255.255 (w/ a similar netmask).
+ * There *may* be more than one - if the user has ``iface add''ed
+ * stuff previously.
+ */
+ for (chg = 0; chg < iface->in_addrs; chg++) {
+ if ((iface->in_addr[chg].brd.s_addr == brd.s_addr &&
+ brd.s_addr != INADDR_BROADCAST) || chg == slot) {
+ memset(&ifra, '\0', sizeof ifra);
+ strncpy(ifra.ifra_name, iface->name, sizeof ifra.ifra_name - 1);
+ me = (struct sockaddr_in *)&ifra.ifra_addr;
+ msk = (struct sockaddr_in *)&ifra.ifra_mask;
+ peer = (struct sockaddr_in *)&ifra.ifra_broadaddr;
+ me->sin_family = msk->sin_family = peer->sin_family = AF_INET;
+ me->sin_len = msk->sin_len = peer->sin_len = sizeof(struct sockaddr_in);
+ me->sin_addr = iface->in_addr[chg].ifa;
+ msk->sin_addr = iface->in_addr[chg].mask;
+ peer->sin_addr = iface->in_addr[chg].brd;
+ log_Printf(LogDEBUG, "Delete %s\n", inet_ntoa(me->sin_addr));
+ ID0ioctl(s, SIOCDIFADDR, &ifra); /* Don't care if it fails... */
+ if (chg != slot) {
+ peer->sin_addr.s_addr = iface->in_addr[chg].brd.s_addr =
+ msk->sin_addr.s_addr = iface->in_addr[chg].mask.s_addr =
+ INADDR_BROADCAST;
+ iface->in_addr[chg].bits = 32;
+ log_Printf(LogDEBUG, "Add %s -> 255.255.255.255\n",
+ inet_ntoa(me->sin_addr));
+ if (ID0ioctl(s, SIOCAIFADDR, &ifra) < 0 && errno != EEXIST) {
+ /* Oops - that's bad(ish) news ! We've lost an alias ! */
+ log_Printf(LogERROR, "iface_inAdd: ioctl(SIOCAIFADDR): %s: %s\n",
+ inet_ntoa(me->sin_addr), strerror(errno));
+ iface->in_addrs--;
+ bcopy(iface->in_addr + chg + 1, iface->in_addr + chg,
+ (iface->in_addrs - chg) * sizeof iface->in_addr[0]);
+ if (slot > chg)
+ slot--;
+ chg--;
+ }
+ }
+ }
+ }
+
memset(&ifra, '\0', sizeof ifra);
strncpy(ifra.ifra_name, iface->name, sizeof ifra.ifra_name - 1);
-
me = (struct sockaddr_in *)&ifra.ifra_addr;
msk = (struct sockaddr_in *)&ifra.ifra_mask;
peer = (struct sockaddr_in *)&ifra.ifra_broadaddr;
-
me->sin_family = msk->sin_family = peer->sin_family = AF_INET;
me->sin_len = msk->sin_len = peer->sin_len = sizeof(struct sockaddr_in);
-
me->sin_addr = ifa;
msk->sin_addr = mask;
peer->sin_addr = brd;
- /*
- * Note: EEXIST is sometimes returned, despite the route actually being
- * added !
- */
- if (ID0ioctl(s, SIOCAIFADDR, &ifra) < 0 && errno != EEXIST) {
- log_Printf(LogERROR, "iface_inAdd: ioctl(SIOCAIFADDR): %s\n",
- strerror(errno));
+ if (log_IsKept(LogDEBUG)) {
+ char buf[16];
+
+ strncpy(buf, inet_ntoa(brd), sizeof buf-1);
+ buf[sizeof buf - 1] = '\0';
+ log_Printf(LogDEBUG, "Add %s -> %s\n", inet_ntoa(ifa), buf);
+ }
+
+ /* An EEXIST failure w/ brd == INADDR_BROADCAST is ok (and works!) */
+ if (ID0ioctl(s, SIOCAIFADDR, &ifra) < 0 &&
+ (brd.s_addr != INADDR_BROADCAST || errno != EEXIST)) {
+ log_Printf(LogERROR, "iface_inAdd: ioctl(SIOCAIFADDR): %s: %s\n",
+ inet_ntoa(ifa), strerror(errno));
+ ID0ioctl(s, SIOCDIFADDR, &ifra); /* EEXIST ? */
close(s);
return 0;
}
diff --git a/usr.sbin/ppp/ppp.8 b/usr.sbin/ppp/ppp.8
index de37467146ed..80e18321a5b8 100644
--- a/usr.sbin/ppp/ppp.8
+++ b/usr.sbin/ppp/ppp.8
@@ -1,4 +1,4 @@
-.\" $Id: ppp.8,v 1.126 1998/09/18 23:28:10 brian Exp $
+.\" $Id: ppp.8,v 1.127 1998/10/22 02:32:49 brian Exp $
.Dd 20 September 1995
.Os FreeBSD
.Dt PPP 8
@@ -2488,7 +2488,7 @@ This command is used to control the interface used by
.Ar Command
may be one of the following:
.Bl -tag -width XX
-.It iface add[!] Ar addr[/bits| mask] peer
+.It iface add[!] Ar addr[[/bits| mask] peer]
Add the given
.Ar addr mask peer
combination to the interface. Instead of specifying
@@ -2500,6 +2500,20 @@ If the given address already exists, the command fails unless the
.Dq \&!
is used - in which case the previous interface address entry is overwritten
with the new one, allowing a change of netmask or peer address.
+.Pp
+If only
+.Ar addr
+is specified,
+.Ar bits
+defaults to
+.Dq 32
+and
+.Ar peer
+defaults to
+.Dq 255.255.255.255 .
+This address (the broadcast address) is the only duplicate peer address that
+.Nm
+allows.
.It iface clear
If this command is used while
.Nm
diff --git a/usr.sbin/ppp/ppp.8.m4 b/usr.sbin/ppp/ppp.8.m4
index de37467146ed..80e18321a5b8 100644
--- a/usr.sbin/ppp/ppp.8.m4
+++ b/usr.sbin/ppp/ppp.8.m4
@@ -1,4 +1,4 @@
-.\" $Id: ppp.8,v 1.126 1998/09/18 23:28:10 brian Exp $
+.\" $Id: ppp.8,v 1.127 1998/10/22 02:32:49 brian Exp $
.Dd 20 September 1995
.Os FreeBSD
.Dt PPP 8
@@ -2488,7 +2488,7 @@ This command is used to control the interface used by
.Ar Command
may be one of the following:
.Bl -tag -width XX
-.It iface add[!] Ar addr[/bits| mask] peer
+.It iface add[!] Ar addr[[/bits| mask] peer]
Add the given
.Ar addr mask peer
combination to the interface. Instead of specifying
@@ -2500,6 +2500,20 @@ If the given address already exists, the command fails unless the
.Dq \&!
is used - in which case the previous interface address entry is overwritten
with the new one, allowing a change of netmask or peer address.
+.Pp
+If only
+.Ar addr
+is specified,
+.Ar bits
+defaults to
+.Dq 32
+and
+.Ar peer
+defaults to
+.Dq 255.255.255.255 .
+This address (the broadcast address) is the only duplicate peer address that
+.Nm
+allows.
.It iface clear
If this command is used while
.Nm