| Summary: | ifconfig if0 netmask xxx.xxx.xxx.0 doesn't change the netmask | ||
|---|---|---|---|
| Product: | Base System | Reporter: | Mark Blackman <mark.blackman> |
| Component: | bin | Assignee: | Hajimu UMEMOTO <ume> |
| Status: | Closed FIXED | ||
| Severity: | Affects Only Me | ||
| Priority: | Normal | ||
| Version: | 4.3-STABLE | ||
| Hardware: | Any | ||
| OS: | Any | ||
On Mon, Jul 09, 2001 at 08:16:15AM -0700, Mark Blackman wrote:
>
> >Number: 28833
> >Category: bin
> >Synopsis: ifconfig if0 netmask xxx.xxx.xxx.0 doesn't change the netmask
> >Environment:
> System: FreeBSD amoeba.ch.dircon.net 4.3-STABLE FreeBSD 4.3-STABLE #1: Thu May 24 13:03:35 BST 2001 root@admi
> n4.dircon.net:/usr/obj/usr/src/sys/AMOEBA i386
> >Description:
> "ifconfig ep0 netmask 255.255.240.0" has no effect on the netmask for ep0
>
> This did work in FreeBSD-4.2 RELEASE. I suspect this is connnected with ifconfig changes, but I couldn't track it down. It looked like it shouldn't work in 4.2 either, but it does.
It works for me, if I also specify the IP address to change the netmask for.
Consider a case where there are multiple IP addresses on a single interface;
ifconfig should probably spit out an error instead of doing nothing, but
it should most definitely not change the netmask on *all* addresses, and
I guess it was considered unsafe to make it just change the netmask on
the first address.
Demonstration:
# clean start
[root@ringworld:v0 ~]# ifconfig rl0
rl0: flags=8802<BROADCAST,SIMPLEX,MULTICAST> mtu 1500
ether 00:e0:18:18:f2:0e
media: Ethernet autoselect (none)
status: active
# add an IP address (with an erroneous netmask)
[root@ringworld:v0 ~]# ifconfig rl0 195.24.48.13 netmask 255.255.0.0
[root@ringworld:v0 ~]# ifconfig rl0
rl0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
inet 195.24.48.13 netmask 0xffff0000 broadcast 195.24.255.255
ether 00:e0:18:18:f2:0e
media: Ethernet autoselect (none)
status: active
# attempt to change the netmask without specifying the address
[root@ringworld:v0 ~]# ifconfig rl0 netmask 255.255.255.0
[root@ringworld:v0 ~]# ifconfig rl0
rl0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
inet 195.24.48.13 netmask 0xffff0000 broadcast 195.24.255.255
ether 00:e0:18:18:f2:0e
media: Ethernet autoselect (none)
status: active
# now do it "the right way"
[root@ringworld:v0 ~]# ifconfig rl0 195.24.48.13 netmask 255.255.255.0
[root@ringworld:v0 ~]# ifconfig rl0
rl0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
inet 195.24.48.13 netmask 0xffffff00 broadcast 195.24.48.255
ether 00:e0:18:18:f2:0e
media: Ethernet autoselect (none)
status: active
Does that work for you?
G'luck,
Peter
--
This would easier understand fewer had omitted.
On Mon, Jul 09, 2001 at 06:39:50PM +0300, Peter Pentchev wrote:
> On Mon, Jul 09, 2001 at 08:16:15AM -0700, Mark Blackman wrote:
> >
> > >Number: 28833
> > >Category: bin
> > >Synopsis: ifconfig if0 netmask xxx.xxx.xxx.0 doesn't change the netmask
> > >Environment:
> > System: FreeBSD amoeba.ch.dircon.net 4.3-STABLE FreeBSD 4.3-STABLE #1: Thu May 24 13:03:35 BST 2001 root@admi
> > n4.dircon.net:/usr/obj/usr/src/sys/AMOEBA i386
> > >Description:
> > "ifconfig ep0 netmask 255.255.240.0" has no effect on the netmask for ep0
> >
> > This did work in FreeBSD-4.2 RELEASE. I suspect this is connnected with ifconfig changes, but I couldn't track it down. It looked like it shouldn't work in 4.2 either, but it does.
>
> It works for me, if I also specify the IP address to change the netmask for.
> Consider a case where there are multiple IP addresses on a single interface;
> ifconfig should probably spit out an error instead of doing nothing, but
> it should most definitely not change the netmask on *all* addresses, and
> I guess it was considered unsafe to make it just change the netmask on
> the first address.
Ah; I actually see that you already knew that - 'only way to change
netmask is via address setting as well'. Well, once again, I don't
think it would be safe to change just the netmask on the first address,
or on all of them. Think aliases - several IP addresses on the same
network on the same NIC; or think subnets - several logical networks
on the same physical network, and a machine on more than one of
the logical nets.
Though I guess ifconfig(8) could somehow error out, instead of failing
silently. I'll look into this.
G'luck,
Peter
--
I am the meaning of this sentence.
you're right, the correct behaviour is that the netmask change must be allied
to a specific address as aliases are very common.
Although, generally most aliases are have netmask of 255.255.255.255 and
so the new netmask is logically applied to the "first".
The fundamental problem is that changing the netmask loses the default
route if you use an address as well as .. using an address causes the default
route to go away.
I just think its a violation of POLA that changing the netmask only
causes your default route to disappear
I posted a related message on freebsd-net.
If you feel its semantically inappropriate to get away without
using an address then fine, but this did work in the past and so
there is some POLA violation.
- Mark
POLA --> principle of least astonishment.
> On Mon, Jul 09, 2001 at 06:39:50PM +0300, Peter Pentchev wrote:
> > On Mon, Jul 09, 2001 at 08:16:15AM -0700, Mark Blackman wrote:
> > >
> > > >Number: 28833
> > > >Category: bin
> > > >Synopsis: ifconfig if0 netmask xxx.xxx.xxx.0 doesn't change the ne
> tmask
> > > >Environment:
> > > System: FreeBSD amoeba.ch.dircon.net 4.3-STABLE FreeBSD 4.3-STABLE #1: Th
> u May 24 13:03:35 BST 2001 root@admi
> > > n4.dircon.net:/usr/obj/usr/src/sys/AMOEBA i386
> > > >Description:
> > > "ifconfig ep0 netmask 255.255.240.0" has no effect on the netmask for ep0
> > >
> > > This did work in FreeBSD-4.2 RELEASE. I suspect this is connnected with i
> fconfig changes, but I couldn't track it down. It looked like it shouldn't wo
> rk in 4.2 either, but it does.
> >
> > It works for me, if I also specify the IP address to change the netmask for
> .
> > Consider a case where there are multiple IP addresses on a single interface
> ;
> > ifconfig should probably spit out an error instead of doing nothing, but
> > it should most definitely not change the netmask on *all* addresses, and
> > I guess it was considered unsafe to make it just change the netmask on
> > the first address.
>
> Ah; I actually see that you already knew that - 'only way to change
> netmask is via address setting as well'. Well, once again, I don't
> think it would be safe to change just the netmask on the first address,
> or on all of them. Think aliases - several IP addresses on the same
> network on the same NIC; or think subnets - several logical networks
> on the same physical network, and a machine on more than one of
> the logical nets.
>
> Though I guess ifconfig(8) could somehow error out, instead of failing
> silently. I'll look into this.
>
> G'luck,
> Peter
>
> --
> I am the meaning of this sentence.
On Mon, Jul 09, 2001 at 09:00:05AM -0700, Mark Blackman wrote: > you're right, the correct behaviour is that the netmask change must be allied > to a specific address as aliases are very common. > > Although, generally most aliases are have netmask of 255.255.255.255 and > so the new netmask is logically applied to the "first". Yep, but there's still the case of more than one non-alias IP address.. > The fundamental problem is that changing the netmask loses the default > route if you use an address as well as .. using an address causes the default > route to go away. > > I just think its a violation of POLA that changing the netmask only > causes your default route to disappear > > I posted a related message on freebsd-net. Unfortunately, I am not on -net :( Causing the default route to disappear is a side effect of a change that was very much needed indeed - namely, that all routes associated with an interface should disappear once that interface is brought down. (Strictly speaking, this is more of 'all routes associated with an IP address of a non-alias interface' or some such, but you get the drift..) This is really important in the case of dynamically-configurable and oft-changing networks on, say, a laptop. If you bring down an interface address, and then bring up a new one, many programs expect setting a default route via the new net to 'just work', without having to replace an existing default route; many programs even complain if there is an existing default route, and leave it there, leaving the laptop in a kind of unusable state - with a default gateway on the old network, unreachable from the present one. > If you feel its semantically inappropriate to get away without > using an address then fine, but this did work in the past and so > there is some POLA violation. Yes, this is a POLA violation, but I prefer to think of it as a fix for a problem that has annoyed quite a lot of people. Maybe there could be a better solution, like adding an 'ifconfig change'.. but then again, no - when you change an interface address's netmask, you actually delete a route for the old network, and add a route to the new one. Keeping all the routes which have addresses on the old network as gateways, and whose gateway addresses are still reachable via the new network, and removing all others, might require a bit more work. G'luck, Peter -- If I were you, who would be reading this sentence? all things considered, I'm quite convinced that the current behaviour
is much closer to correct and consistent, but it still strikes me as
non-intuitive that address changes that aren't lead to default route
disappearance.
I think, as Brian Somers suggested, that ifconfig could be a bit smarter
and for the special case that
1) the new address is within the old netmask and the new netmask
or
the new address is identical to the old address
and
2) the default route is still within the new netmask
then only a
SIOCSIFNETMASK ioctl is performed,
although I'm happy to insist that an address be specified for
netmask changes unless there is only one address bound to the interface.
this does possibly make 'ifconfig' a bit too clever.
In any case, I just wanted to know what the expected behaviour
was currently, so I can educate people locally.
- Mark
> On Mon, Jul 09, 2001 at 09:00:05AM -0700, Mark Blackman wrote:
> > you're right, the correct behaviour is that the netmask change must be all
> ied
> > to a specific address as aliases are very common.
> >
> > Although, generally most aliases are have netmask of 255.255.255.255 and
> > so the new netmask is logically applied to the "first".
>
> Yep, but there's still the case of more than one non-alias IP address..
>
> > The fundamental problem is that changing the netmask loses the default
> > route if you use an address as well as .. using an address causes the defa
> ult
> > route to go away.
> >
> > I just think its a violation of POLA that changing the netmask only
> > causes your default route to disappear
> >
> > I posted a related message on freebsd-net.
>
> Unfortunately, I am not on -net :(
>
> Causing the default route to disappear is a side effect of a change
> that was very much needed indeed - namely, that all routes associated
> with an interface should disappear once that interface is brought down.
> (Strictly speaking, this is more of 'all routes associated with an IP
> address of a non-alias interface' or some such, but you get the drift..)
> This is really important in the case of dynamically-configurable and
> oft-changing networks on, say, a laptop. If you bring down an interface
> address, and then bring up a new one, many programs expect setting
> a default route via the new net to 'just work', without having to replace
> an existing default route; many programs even complain if there is
> an existing default route, and leave it there, leaving the laptop
> in a kind of unusable state - with a default gateway on the old network,
> unreachable from the present one.
>
> > If you feel its semantically inappropriate to get away without
> > using an address then fine, but this did work in the past and so
> > there is some POLA violation.
>
> Yes, this is a POLA violation, but I prefer to think of it as a fix
> for a problem that has annoyed quite a lot of people. Maybe there
> could be a better solution, like adding an 'ifconfig change'..
> but then again, no - when you change an interface address's netmask,
> you actually delete a route for the old network, and add a route
> to the new one. Keeping all the routes which have addresses on
> the old network as gateways, and whose gateway addresses are still
> reachable via the new network, and removing all others, might require
> a bit more work.
>
> G'luck,
> Peter
>
> --
> If I were you, who would be reading this sentence?
Responsible Changed From-To: freebsd-bugs->ume Umemoto san, rev. 1.59 of ifconfig.c broke this feature. State Changed From-To: open->closed Thank you for your report. I just committed the fix. http://www.freebsd.org/cgi/cvsweb.cgi/src/sbin/ifconfig/ifconfig.c.diff?r1=1.65&r2=1.66 |
"ifconfig ep0 netmask 255.255.240.0" has no effect on the netmask for ep0 This did work in FreeBSD-4.2 RELEASE. I suspect this is connnected with ifconfig changes, but I couldn't track it down. It looked like it shouldn't work in 4.2 either, but it does. The get_inaddr function seems not to do anything with which==MASK (http://www.freebsd.org/cgi/cvsweb.cgi/src/sbin/ifconfig/ifconfig.c?rev=1.51.2.6&content-type=text/x- cvsweb-markup) Fix: only way to change netmask is via address setting as well fconfig ep0 inet 10.0.0.1 netmask 255.255.240.0 then you lose your default route. How-To-Repeat: see description