Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
a734e8de
Commit
a734e8de
authored
Jul 19, 2003
by
Jeff Garzik
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[bonding] sync ifenslave with 2.4 (pulls in several bug fixes)
parent
58e3b621
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
232 additions
and
114 deletions
+232
-114
Documentation/networking/ifenslave.c
Documentation/networking/ifenslave.c
+232
-114
No files found.
Documentation/networking/ifenslave.c
View file @
a734e8de
...
...
@@ -27,7 +27,7 @@
* - 2001/02/16 Chad N. Tindel <ctindel at ieee dot org> :
* - Master is now brought down before setting the MAC address. In
* the 2.4 kernel you can't change the MAC address while the device is
* up because you get EBUSY.
* up because you get EBUSY.
*
* - 2001/09/13 Takao Indoh <indou dot takao at jp dot fujitsu dot com>
* - Added the ability to change the active interface on a mode 1 bond
...
...
@@ -44,17 +44,60 @@
*
* - 2002/10/31 Tony Cureington <tony.cureington * hp_com> :
* - If the master does not have a hardware address when the first slave
* is enslaved, the master is assigned the hardware address of that
* slave - there is a comment in bonding.c stating "ifenslave takes
* care of this now." This corrects the problem of slaves having
* different hardware addresses in active-backup mode when
* is enslaved, the master is assigned the hardware address of that
* slave - there is a comment in bonding.c stating "ifenslave takes
* care of this now." This corrects the problem of slaves having
* different hardware addresses in active-backup mode when
* multiple interfaces are specified on a single ifenslave command
* (ifenslave bond0 eth0 eth1).
*
* - 2003/03/18 - Tsippy Mendelson <tsippy.mendelson at intel dot com> and
* Shmulik Hen <shmulik.hen at intel dot com>
* - Moved setting the slave's mac address and openning it, from
* the application to the driver. This enables support of modes
* that need to use the unique mac address of each slave.
* The driver also takes care of closing the slave and restoring its
* original mac address upon release.
* In addition, block possibility of enslaving before the master is up.
* This prevents putting the system in an undefined state.
*
* - 2003/05/01 - Amir Noam <amir.noam at intel dot com>
* - Added ABI version control to restore compatibility between
* new/old ifenslave and new/old bonding.
* - Prevent adding an adapter that is already a slave.
* Fixes the problem of stalling the transmission and leaving
* the slave in a down state.
*
* - 2003/05/01 - Shmulik Hen <shmulik.hen at intel dot com>
* - Prevent enslaving if the bond device is down.
* Fixes the problem of leaving the system in unstable state and
* halting when trying to remove the module.
* - Close socket on all abnormal exists.
* - Add versioning scheme that follows that of the bonding driver.
* current version is 1.0.0 as a base line.
*
* - 2003/05/22 - Jay Vosburgh <fubar at us dot ibm dot com>
* - ifenslave -c was broken; it's now fixed
* - Fixed problem with routes vanishing from master during enslave
* processing.
*
* - 2003/05/27 - Amir Noam <amir.noam at intel dot com>
* - Fix backward compatibility issues:
* For drivers not using ABI versions, slave was set down while
* it should be left up before enslaving.
* Also, master was not set down and the default set_mac_address()
* would fail and generate an error message in the system log.
* - For opt_c: slave should not be set to the master's setting
* while it is running. It was already set during enslave. To
* simplify things, it is now handeled separately.
*/
#define APP_VERSION "1.0.12"
#define APP_RELDATE "June 30, 2003"
#define APP_NAME "ifenslave"
static
char
*
version
=
"ifenslave.c:v0.07 9/9/97
Donald Becker (becker@cesdis.gsfc.nasa.gov).
\n
"
APP_NAME
".c:v"
APP_VERSION
" ("
APP_RELDATE
") "
"
\n
Donald Becker (becker@cesdis.gsfc.nasa.gov).
\n
"
"detach support added on 2000/10/02 by Willy Tarreau (willy at meta-x.org).
\n
"
"2.4 kernel support added on 2001/02/16 by Chad N. Tindel (ctindel at ieee dot org.
\n
"
;
...
...
@@ -103,6 +146,12 @@ static const char *howto_msg =
#include <linux/if_bonding.h>
#include <linux/sockios.h>
typedef
unsigned
long
long
u64
;
/* hack, so we may include kernel's ethtool.h */
typedef
__uint32_t
u32
;
/* ditto */
typedef
__uint16_t
u16
;
/* ditto */
typedef
__uint8_t
u8
;
/* ditto */
#include <linux/ethtool.h>
struct
option
longopts
[]
=
{
/* { name has_arg *flag val } */
{
"all-interfaces"
,
0
,
0
,
'a'
},
/* Show all interfaces. */
...
...
@@ -130,18 +179,19 @@ opt_howto = 0;
int
skfd
=
-
1
;
/* AF_INET socket for ioctl() calls. */
static
void
if_print
(
char
*
ifname
);
static
int
get_abi_ver
(
char
*
master_ifname
);
int
main
(
int
argc
,
char
**
argv
)
{
struct
ifreq
ifr2
,
if_hwaddr
,
if_ipaddr
,
if_metric
,
if_mtu
,
if_dstaddr
;
struct
ifreq
if_netmask
,
if_brdaddr
,
if_flags
;
int
goterr
=
0
;
int
rv
,
goterr
=
0
;
int
c
,
errflag
=
0
;
sa_family_t
master_family
;
char
**
spp
,
*
master_ifname
,
*
slave_ifname
;
int
hwaddr_notset
;
int
master_up
;
int
abi_ver
=
0
;
while
((
c
=
getopt_long
(
argc
,
argv
,
"acdfrvV?h"
,
longopts
,
0
))
!=
EOF
)
switch
(
c
)
{
...
...
@@ -207,6 +257,7 @@ main(int argc, char **argv)
char
**
tempp
=
spp
;
if
((
master_ifname
==
NULL
)
||
(
slave_ifname
==
NULL
)
||
(
*
tempp
++
!=
NULL
))
{
fprintf
(
stderr
,
usage_msg
);
(
void
)
close
(
skfd
);
return
2
;
}
}
...
...
@@ -218,6 +269,13 @@ main(int argc, char **argv)
exit
(
0
);
}
/* exchange abi version with bonding driver */
abi_ver
=
get_abi_ver
(
master_ifname
);
if
(
abi_ver
<
0
)
{
(
void
)
close
(
skfd
);
exit
(
1
);
}
/* Get the vitals from the master interface. */
{
struct
ifreq
*
ifra
[
7
]
=
{
&
if_ipaddr
,
&
if_mtu
,
&
if_dstaddr
,
...
...
@@ -242,6 +300,13 @@ main(int argc, char **argv)
}
}
/* check if master is up; if not then fail any operation */
if
(
!
(
if_flags
.
ifr_flags
&
IFF_UP
))
{
fprintf
(
stderr
,
"Illegal operation; the specified master interface '%s' is not up.
\n
"
,
master_ifname
);
(
void
)
close
(
skfd
);
exit
(
1
);
}
hwaddr_notset
=
1
;
/* assume master's address not set yet */
for
(
i
=
0
;
hwaddr_notset
&&
(
i
<
6
);
i
++
)
{
hwaddr_notset
&=
((
unsigned
char
*
)
if_hwaddr
.
ifr_hwaddr
.
sa_data
)[
i
]
==
0
;
...
...
@@ -254,7 +319,7 @@ main(int argc, char **argv)
" with ethernet-like network interfaces.
\n
"
" Use the '-f' option to force the operation.
\n
"
,
master_ifname
);
(
void
)
close
(
skfd
);
exit
(
1
);
}
master_family
=
if_hwaddr
.
ifr_hwaddr
.
sa_family
;
...
...
@@ -278,143 +343,153 @@ main(int argc, char **argv)
fprintf
(
stderr
,
"SIOCBONDRELEASE: cannot detach %s from %s. errno=%s.
\n
"
,
slave_ifname
,
master_ifname
,
strerror
(
errno
));
}
else
{
/* we'll set the interface down to avoid any conflicts due to
same IP/MAC */
else
if
(
abi_ver
<
1
)
{
/* The driver is using an old ABI, so we'll set the interface
* down to avoid any conflicts due to same IP/MAC
*/
strncpy
(
ifr2
.
ifr_name
,
slave_ifname
,
IFNAMSIZ
);
if
(
ioctl
(
skfd
,
SIOCGIFFLAGS
,
&
ifr2
)
<
0
)
{
int
saved_errno
=
errno
;
fprintf
(
stderr
,
"SIOCGIFFLAGS on %s failed: %s
\n
"
,
slave_ifname
,
strerror
(
saved_errno
));
strerror
(
saved_errno
));
}
else
{
ifr2
.
ifr_flags
&=
~
(
IFF_UP
|
IFF_RUNNING
);
if
(
ioctl
(
skfd
,
SIOCSIFFLAGS
,
&
ifr2
)
<
0
)
{
int
saved_errno
=
errno
;
fprintf
(
stderr
,
"Shutting down interface %s failed: %s
\n
"
,
slave_ifname
,
strerror
(
saved_errno
));
slave_ifname
,
strerror
(
saved_errno
));
}
}
}
}
else
{
/* attach a slave interface to the master */
/* two possibilities :
- if hwaddr_notset, do nothing. The bond will assign the
hwaddr from its first slave.
- if !hwaddr_notset, assign the master's hwaddr to each slave
*/
}
else
if
(
opt_c
)
{
/* change primary slave */
strncpy
(
if_flags
.
ifr_name
,
master_ifname
,
IFNAMSIZ
);
strncpy
(
if_flags
.
ifr_slave
,
slave_ifname
,
IFNAMSIZ
);
if
((
ioctl
(
skfd
,
SIOCBONDCHANGEACTIVE
,
&
if_flags
)
<
0
)
&&
(
ioctl
(
skfd
,
BOND_CHANGE_ACTIVE_OLD
,
&
if_flags
)
<
0
))
{
fprintf
(
stderr
,
"SIOCBONDCHANGEACTIVE: %s.
\n
"
,
strerror
(
errno
));
}
}
else
{
/* attach a slave interface to the master */
strncpy
(
ifr2
.
ifr_name
,
slave_ifname
,
IFNAMSIZ
);
if
(
ioctl
(
skfd
,
SIOCGIFFLAGS
,
&
ifr2
)
<
0
)
{
int
saved_errno
=
errno
;
fprintf
(
stderr
,
"SIOCGIFFLAGS on %s failed: %s
\n
"
,
slave_ifname
,
strerror
(
saved_errno
));
(
void
)
close
(
skfd
);
return
1
;
}
if
((
ifr2
.
ifr_flags
&
IFF_SLAVE
)
&&
!
opt_r
)
{
fprintf
(
stderr
,
"%s is already a slave
\n
"
,
slave_ifname
);
(
void
)
close
(
skfd
);
return
1
;
}
/* if hwaddr_notset, assign the slave hw address to the master */
if
(
hwaddr_notset
)
{
/* assign the slave hw address to the
* master since it currently does not
/* assign the slave hw address to the
* master since it currently does not
* have one; otherwise, slaves may
* have different hw addresses in
* active-backup mode as seen when enslaving
* have different hw addresses in
* active-backup mode as seen when enslaving
* using "ifenslave bond0 eth0 eth1" because
* hwaddr_notset is set outside this loop.
* TODO: put this and the "else" portion in
* a function.
*/
goterr
=
0
;
master_up
=
0
;
if
(
if_flags
.
ifr_flags
&
IFF_UP
)
{
if_flags
.
ifr_flags
&=
~
IFF_UP
;
if
(
ioctl
(
skfd
,
SIOCSIFFLAGS
,
&
if_flags
)
<
0
)
{
goterr
=
1
;
fprintf
(
stderr
,
"Shutting down "
"interface %s failed: "
"%s
\n
"
,
master_ifname
,
strerror
(
errno
));
}
else
{
/* we took the master down,
* so we must bring it up
*/
master_up
=
1
;
}
/* get the slaves MAC address */
strncpy
(
if_hwaddr
.
ifr_name
,
slave_ifname
,
IFNAMSIZ
);
rv
=
ioctl
(
skfd
,
SIOCGIFHWADDR
,
&
if_hwaddr
);
if
(
-
1
==
rv
)
{
fprintf
(
stderr
,
"Could not get MAC "
"address of %s: %s
\n
"
,
slave_ifname
,
strerror
(
errno
));
strncpy
(
if_hwaddr
.
ifr_name
,
master_ifname
,
IFNAMSIZ
);
goterr
=
1
;
}
if
(
!
goterr
)
{
/* get the slaves MAC address */
strncpy
(
if_hwaddr
.
ifr_name
,
slave_ifname
,
IFNAMSIZ
);
if
(
ioctl
(
skfd
,
SIOCGIFHWADDR
,
&
if_hwaddr
)
<
0
)
{
fprintf
(
stderr
,
"Could not get MAC "
"address of %s: %s
\n
"
,
slave_ifname
,
strerror
(
errno
));
strncpy
(
if_hwaddr
.
ifr_name
,
master_ifname
,
IFNAMSIZ
);
goterr
=
1
;
if
(
abi_ver
<
1
)
{
/* In ABI versions older than 1, the
* master's set_mac routine couldn't
* work if it was up, because it
* used the default ethernet set_mac
* function.
*/
/* bring master down */
if_flags
.
ifr_flags
&=
~
IFF_UP
;
if
(
ioctl
(
skfd
,
SIOCSIFFLAGS
,
&
if_flags
)
<
0
)
{
goterr
=
1
;
fprintf
(
stderr
,
"Shutting down "
"interface %s failed: "
"%s
\n
"
,
master_ifname
,
strerror
(
errno
));
}
}
}
if
(
!
goterr
)
{
strncpy
(
if_hwaddr
.
ifr_name
,
strncpy
(
if_hwaddr
.
ifr_name
,
master_ifname
,
IFNAMSIZ
);
if
(
ioctl
(
skfd
,
SIOCSIFHWADDR
,
if
(
ioctl
(
skfd
,
SIOCSIFHWADDR
,
&
if_hwaddr
)
<
0
)
{
fprintf
(
stderr
,
fprintf
(
stderr
,
"Could not set MAC "
"address of %s: %s
\n
"
,
master_ifname
,
master_ifname
,
strerror
(
errno
));
goterr
=
1
;
}
else
{
hwaddr_notset
=
0
;
}
}
if
(
master_up
)
{
if_flags
.
ifr_flags
|=
IFF_UP
;
if
(
ioctl
(
skfd
,
SIOCSIFFLAGS
,
&
if_flags
)
<
0
)
{
fprintf
(
stderr
,
"Bringing up interface "
"%s failed: %s
\n
"
,
master_ifname
,
strerror
(
errno
));
if
(
abi_ver
<
1
)
{
/* bring master back up */
if_flags
.
ifr_flags
|=
IFF_UP
;
if
(
ioctl
(
skfd
,
SIOCSIFFLAGS
,
&
if_flags
)
<
0
)
{
fprintf
(
stderr
,
"Bringing up interface "
"%s failed: %s
\n
"
,
master_ifname
,
strerror
(
errno
));
}
}
}
}
else
if
(
abi_ver
<
1
)
{
/* if (hwaddr_notset) */
}
else
{
/* we'll assign master's hwaddr to this slave */
/* The driver is using an old ABI, so we'll set the interface
* down and assign the master's hwaddr to it
*/
if
(
ifr2
.
ifr_flags
&
IFF_UP
)
{
ifr2
.
ifr_flags
&=
~
IFF_UP
;
if
(
ioctl
(
skfd
,
SIOCSIFFLAGS
,
&
ifr2
)
<
0
)
{
int
saved_errno
=
errno
;
fprintf
(
stderr
,
"Shutting down interface %s failed: %s
\n
"
,
slave_ifname
,
strerror
(
saved_errno
));
slave_ifname
,
strerror
(
saved_errno
));
}
}
strncpy
(
if_hwaddr
.
ifr_name
,
slave_ifname
,
IFNAMSIZ
);
if
(
ioctl
(
skfd
,
SIOCSIFHWADDR
,
&
if_hwaddr
)
<
0
)
{
int
saved_errno
=
errno
;
fprintf
(
stderr
,
"SIOCSIFHWADDR on %s failed: %s
\n
"
,
if_hwaddr
.
ifr_name
,
strerror
(
saved_errno
));
strerror
(
saved_errno
));
if
(
saved_errno
==
EBUSY
)
fprintf
(
stderr
,
" The slave device %s is busy: it must be"
" idle before running this command.
\n
"
,
slave_ifname
);
" idle before running this command.
\n
"
,
slave_ifname
);
else
if
(
saved_errno
==
EOPNOTSUPP
)
fprintf
(
stderr
,
" The slave device you specified does not support"
" setting the MAC address.
\n
Your kernel likely does not"
" support slave devices.
\n
"
);
" setting the MAC address.
\n
Your kernel likely does not"
" support slave devices.
\n
"
);
else
if
(
saved_errno
==
EINVAL
)
fprintf
(
stderr
,
" The slave device's address type does not match"
" the master's address type.
\n
"
);
" the master's address type.
\n
"
);
}
else
{
if
(
verbose
)
{
unsigned
char
*
hwaddr
=
if_hwaddr
.
ifr_hwaddr
.
sa_data
;
...
...
@@ -424,10 +499,11 @@ main(int argc, char **argv)
}
}
}
if
(
*
spp
&&
!
strcmp
(
*
spp
,
"metric"
))
{
if
(
*++
spp
==
NULL
)
{
fprintf
(
stderr
,
usage_msg
);
(
void
)
close
(
skfd
);
exit
(
2
);
}
if_metric
.
ifr_metric
=
atoi
(
*
spp
);
...
...
@@ -439,7 +515,7 @@ main(int argc, char **argv)
}
spp
++
;
}
if
(
strncpy
(
if_ipaddr
.
ifr_name
,
slave_ifname
,
IFNAMSIZ
)
<=
0
||
ioctl
(
skfd
,
SIOCSIFADDR
,
&
if_ipaddr
)
<
0
)
{
fprintf
(
stderr
,
...
...
@@ -452,16 +528,16 @@ main(int argc, char **argv)
slave_ifname
,
ipaddr
[
0
],
ipaddr
[
1
],
ipaddr
[
2
],
ipaddr
[
3
]);
}
}
if
(
strncpy
(
if_mtu
.
ifr_name
,
slave_ifname
,
IFNAMSIZ
)
<=
0
||
ioctl
(
skfd
,
SIOCSIFMTU
,
&
if_mtu
)
<
0
)
{
||
ioctl
(
skfd
,
SIOCSIFMTU
,
&
if_mtu
)
<
0
)
{
fprintf
(
stderr
,
"Something broke setting the slave MTU: %s.
\n
"
,
strerror
(
errno
));
}
else
{
if
(
verbose
)
printf
(
"Set the slave's (%s) MTU to %d.
\n
"
,
slave_ifname
,
if_mtu
.
ifr_mtu
);
}
if
(
strncpy
(
if_dstaddr
.
ifr_name
,
slave_ifname
,
IFNAMSIZ
)
<=
0
||
ioctl
(
skfd
,
SIOCSIFDSTADDR
,
&
if_dstaddr
)
<
0
)
{
fprintf
(
stderr
,
"Error setting the slave (%s) with SIOCSIFDSTADDR: %s.
\n
"
,
...
...
@@ -473,7 +549,7 @@ main(int argc, char **argv)
slave_ifname
,
ipaddr
[
0
],
ipaddr
[
1
],
ipaddr
[
2
],
ipaddr
[
3
]);
}
}
if
(
strncpy
(
if_brdaddr
.
ifr_name
,
slave_ifname
,
IFNAMSIZ
)
<=
0
||
ioctl
(
skfd
,
SIOCSIFBRDADDR
,
&
if_brdaddr
)
<
0
)
{
fprintf
(
stderr
,
...
...
@@ -486,7 +562,7 @@ main(int argc, char **argv)
slave_ifname
,
ipaddr
[
0
],
ipaddr
[
1
],
ipaddr
[
2
],
ipaddr
[
3
]);
}
}
if
(
strncpy
(
if_netmask
.
ifr_name
,
slave_ifname
,
IFNAMSIZ
)
<=
0
||
ioctl
(
skfd
,
SIOCSIFNETMASK
,
&
if_netmask
)
<
0
)
{
fprintf
(
stderr
,
...
...
@@ -499,34 +575,45 @@ main(int argc, char **argv)
slave_ifname
,
ipaddr
[
0
],
ipaddr
[
1
],
ipaddr
[
2
],
ipaddr
[
3
]);
}
}
ifr2
.
ifr_flags
|=
IFF_UP
;
/* the interface will need to be up to be bonded */
if
((
ifr2
.
ifr_flags
&=
~
(
IFF_SLAVE
|
IFF_MASTER
))
==
0
||
strncpy
(
ifr2
.
ifr_name
,
slave_ifname
,
IFNAMSIZ
)
<=
0
||
ioctl
(
skfd
,
SIOCSIFFLAGS
,
&
ifr2
)
<
0
)
{
fprintf
(
stderr
,
"Something broke setting the slave (%s) flags: %s.
\n
"
,
slave_ifname
,
strerror
(
errno
));
if
(
abi_ver
<
1
)
{
/* The driver is using an old ABI, so we'll set the interface
* up before enslaving it
*/
ifr2
.
ifr_flags
|=
IFF_UP
;
if
((
ifr2
.
ifr_flags
&=
~
(
IFF_SLAVE
|
IFF_MASTER
))
==
0
||
strncpy
(
ifr2
.
ifr_name
,
slave_ifname
,
IFNAMSIZ
)
<=
0
||
ioctl
(
skfd
,
SIOCSIFFLAGS
,
&
ifr2
)
<
0
)
{
fprintf
(
stderr
,
"Something broke setting the slave (%s) flags: %s.
\n
"
,
slave_ifname
,
strerror
(
errno
));
}
else
{
if
(
verbose
)
printf
(
"Set the slave's (%s) flags %4.4x.
\n
"
,
slave_ifname
,
if_flags
.
ifr_flags
);
}
}
else
{
if
(
verbose
)
printf
(
"Set the slave's (%s) flags %4.4x.
\n
"
,
slave_ifname
,
if_flags
.
ifr_flags
);
/* the bonding module takes care of setting the slave's mac address
* and opening its interface
*/
if
(
ifr2
.
ifr_flags
&
IFF_UP
)
{
/* the interface will need to be down */
ifr2
.
ifr_flags
&=
~
IFF_UP
;
if
(
ioctl
(
skfd
,
SIOCSIFFLAGS
,
&
ifr2
)
<
0
)
{
int
saved_errno
=
errno
;
fprintf
(
stderr
,
"Shutting down interface %s failed: %s
\n
"
,
slave_ifname
,
strerror
(
saved_errno
));
}
}
}
/* Do the real thing */
if
(
!
opt_r
)
{
if
(
!
opt_r
)
{
strncpy
(
if_flags
.
ifr_name
,
master_ifname
,
IFNAMSIZ
);
strncpy
(
if_flags
.
ifr_slave
,
slave_ifname
,
IFNAMSIZ
);
if
(
!
opt_c
)
{
if
((
ioctl
(
skfd
,
SIOCBONDENSLAVE
,
&
if_flags
)
<
0
)
&&
(
ioctl
(
skfd
,
BOND_ENSLAVE_OLD
,
&
if_flags
)
<
0
))
{
fprintf
(
stderr
,
"SIOCBONDENSLAVE: %s.
\n
"
,
strerror
(
errno
));
}
}
else
{
if
((
ioctl
(
skfd
,
SIOCBONDCHANGEACTIVE
,
&
if_flags
)
<
0
)
&&
(
ioctl
(
skfd
,
BOND_CHANGE_ACTIVE_OLD
,
&
if_flags
)
<
0
))
{
fprintf
(
stderr
,
"SIOCBONDCHANGEACTIVE: %s.
\n
"
,
strerror
(
errno
));
}
if
((
ioctl
(
skfd
,
SIOCBONDENSLAVE
,
&
if_flags
)
<
0
)
&&
(
ioctl
(
skfd
,
BOND_ENSLAVE_OLD
,
&
if_flags
)
<
0
))
{
fprintf
(
stderr
,
"SIOCBONDENSLAVE: %s.
\n
"
,
strerror
(
errno
));
}
}
}
...
...
@@ -540,7 +627,7 @@ main(int argc, char **argv)
static
short
mif_flags
;
/* Get the inte
r
face configuration from the kernel. */
/* Get the inteface configuration from the kernel. */
static
int
if_getconfig
(
char
*
ifname
)
{
struct
ifreq
ifr
;
...
...
@@ -639,7 +726,38 @@ static void if_print(char *ifname)
}
}
static
int
get_abi_ver
(
char
*
master_ifname
)
{
struct
ifreq
ifr
;
struct
ethtool_drvinfo
info
;
int
abi_ver
=
0
;
memset
(
&
ifr
,
0
,
sizeof
(
ifr
));
strncpy
(
ifr
.
ifr_name
,
master_ifname
,
IFNAMSIZ
);
ifr
.
ifr_data
=
(
caddr_t
)
&
info
;
info
.
cmd
=
ETHTOOL_GDRVINFO
;
strncpy
(
info
.
driver
,
"ifenslave"
,
32
);
snprintf
(
info
.
fw_version
,
32
,
"%d"
,
BOND_ABI_VERSION
);
if
(
ioctl
(
skfd
,
SIOCETHTOOL
,
&
ifr
)
>=
0
)
{
char
*
endptr
;
abi_ver
=
strtoul
(
info
.
fw_version
,
&
endptr
,
0
);
if
(
*
endptr
)
{
fprintf
(
stderr
,
"Error: got invalid string as an ABI "
"version from the bonding module
\n
"
);
return
-
1
;
}
}
if
(
verbose
)
{
printf
(
"ABI ver is %d
\n
"
,
abi_ver
);
}
return
abi_ver
;
}
/*
* Local variables:
* version-control: t
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment