diff options
-rw-r--r-- | include/iscsi_net_util.h | 1 | ||||
-rw-r--r-- | usr/initiator_common.c | 18 | ||||
-rw-r--r-- | usr/iscsi_net_util.c | 53 |
3 files changed, 72 insertions, 0 deletions
diff --git a/include/iscsi_net_util.h b/include/iscsi_net_util.h index 222634d..31b80ad 100644 --- a/include/iscsi_net_util.h +++ b/include/iscsi_net_util.h @@ -7,5 +7,6 @@ extern int net_get_transport_name_from_netdev(char *netdev, char *transport); extern int net_get_netdev_from_hwaddress(char *hwaddress, char *netdev); extern int net_setup_netdev(char *netdev, char *local_ip, char *mask, char *gateway, char *remote_ip, int needs_bringup); +extern int net_ifup_netdev(char *netdev); #endif diff --git a/usr/initiator_common.c b/usr/initiator_common.c index fa8846d..ef6820c 100644 --- a/usr/initiator_common.c +++ b/usr/initiator_common.c @@ -35,6 +35,7 @@ #include "host.h" #include "sysdeps.h" #include "iscsi_err.h" +#include "iscsi_net_util.h" struct iscsi_session *session_find_by_sid(uint32_t sid) { @@ -566,6 +567,8 @@ int iscsi_host_set_net_params(struct iface_rec *iface, { struct iscsi_transport *t = session->t; int rc = 0; + char *netdev; + struct host_info hinfo; log_debug(3, "setting iface %s, dev %s, set ip %s, hw %s, " "transport %s.\n", @@ -582,6 +585,21 @@ int iscsi_host_set_net_params(struct iface_rec *iface, return EINVAL; } + /* these type of drivers need the netdev upd */ + if (strlen(iface->netdev)) + netdev = iface->netdev; + else { + memset(&hinfo, 0, sizeof(hinfo)); + hinfo.host_no = session->hostno; + iscsi_sysfs_get_hostinfo_by_host_no(&hinfo); + + netdev = hinfo.iface.netdev; + } + + if (net_ifup_netdev(netdev)) + log_warning("Could not brining up netdev %s. Try running " + "'ifup %s' first if login fails.", netdev, netdev); + rc = host_set_param(t, session->hostno, ISCSI_HOST_PARAM_IPADDRESS, iface->ipaddress, ISCSI_STRING); diff --git a/usr/iscsi_net_util.c b/usr/iscsi_net_util.c index 7edc0b9..212cc59 100644 --- a/usr/iscsi_net_util.c +++ b/usr/iscsi_net_util.c @@ -306,4 +306,57 @@ done: return ret; } +/** + * net_ifup_netdev - bring up network interface + * @netdev: netdevice to bring up. + */ +int net_ifup_netdev(char *netdev) +{ + struct ifreq ifr; + int sock; + int ret = 0; + + if (!strlen(netdev)) { + log_error("No netdev name in fw entry.\n"); + return EINVAL; + } + + /* Create socket for making networking changes */ + if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { + log_error("Could not open socket to manage network " + "(err %d - %s)", errno, strerror(errno)); + return errno; + } + + memset(&ifr, 0, sizeof(ifr)); + strncpy(ifr.ifr_name, netdev, IFNAMSIZ); + if (ioctl(sock, SIOCSIFFLAGS, &ifr) < 0) { + log_error("Could not bring up netdev %s (err %d - %s)", + netdev, errno, strerror(errno)); + ret = errno; + goto done; + } + + if (ifr.ifr_flags & IFF_UP) { + log_debug(3, "%s up\n", netdev); + goto done; + } + + log_debug(3, "bringing %s up\n", netdev); + + /* Bring up interface */ + memset(&ifr, 0, sizeof(ifr)); + strncpy(ifr.ifr_name, netdev, IFNAMSIZ); + ifr.ifr_flags = IFF_UP; + if (ioctl(sock, SIOCSIFFLAGS, &ifr) < 0) { + log_error("Could not bring up netdev %s (err %d - %s)", + netdev, errno, strerror(errno)); + ret = errno; + goto done; + } +done: + close(sock); + return ret; +} + |