On 27 Dec 2014, at 15:53, Doychin Bondzhev <doyc...@dsoft-bg.com> wrote:
> This is a copy of my email that I sent earlier to core-libs-dev. > ----------- > > Hi, > > I want to report for a problem that I see when I have more then one IP > addresses assigned to same interface. > > Here is an output from ip addr command on my linux box: > > 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN > link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 > inet 127.0.0.1/8 scope host lo > inet6 ::1/128 scope host > valid_lft forever preferred_lft forever > 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP > qlen 1000 > link/ether 08:00:27:fc:25:9f brd ff:ff:ff:ff:ff:ff > inet 192.168.1.4/24 brd 192.168.1.255 scope global eth0 > inet6 fe80::a00:27ff:fefc:259f/64 scope link > valid_lft forever preferred_lft forever > 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP > qlen 1000 > link/ether 08:00:27:b1:42:d0 brd ff:ff:ff:ff:ff:ff > inet 192.168.240.1/24 brd 192.168.240.255 scope global eth1 > inet 192.168.241.1/24 brd 192.168.241.255 scope global eth1 > inet 192.168.239.1/24 brd 192.168.239.255 scope global eth1 > inet 10.0.0.1/22 brd 10.0.3.255 scope global eth1 > inet6 fe80::a00:27ff:feb1:42d0/64 scope link > valid_lft forever preferred_lft forever > > And this is the output of a test java program that uses NetworkInterfaces > class to display all IP addresses and their corresponding settings: > > eth1:10.0.0.1/24 broadcast:192.168.240.255 > eth1:192.168.239.1/24 broadcast:192.168.240.255 > eth1:192.168.241.1/24 broadcast:192.168.240.255 > eth1:192.168.240.1/24 broadcast:192.168.240.255 > eth0:192.168.1.4/24 broadcast:192.168.1.255 > lo:127.0.0.1/8 > > As you can see there are 2 problems visible here: > > 1. On all eth1 lines same broadcast is displayed. The value is the broadcast > of the first IP address set on that interface > > 2. All addresses are with prefix length of 24 which is not correct. We have > 10.0.0.1/22 in the "ip addr" output. > > So the problem is in NetworkInterfaces native code for Unix. > > For IPv4 addresses that code uses 2 functions (getBordacast and getSubnet and > these 2 functions use ioctl with SIOCGIFNETMASK and SIOCGIFBRDADDR. Both of > these requests receive as parameter interface name. They are not prepared to > work in environments where you can specify more then one IP on the same > interface without using virtual interfaces. > > So using virutal interfaces is the only workaround of this problem for the > moment. > > I propose another method of reading ip address information for interfaces > that will use getifaddrs/freeifaddrs. > > getifaddrs knows how to handle this case properly. It returns all the > necessary information in an array of "struct ifaddrs" > > Any toughs on this proposition? This sounds reasonable. It is an implementation only issue, right? No impact on the public NetworkInterface API. -Chris. > -- > Doychin Bondzhev > dSoft-Bulgaria Ltd. > PowerPro - billing & provisioning solution for Service providers > PowerStor - Warehouse & POS > http://www.dsoft-bg.com/ > Mobile: +359888243116 > <doychin.vcf>