Hi, I have a patch which adds the NIC selection part of the whole iBFT functionality and some other pieces, right now unsupported by NM, but I might have forgotten something.. so scream at me, if you see anything horrible ;) Martin PS: some information about how this is supposed to work is below.. ----- Forwarded Message ----- Martin Sivak wrote: > Hi David, > > I started working on the iBFT functionality in Fedora and since you've changed networking code quite a bit, I need some help. > > I have been able to port the NIC selection code and some of the iBFT fallback routines, but the main part, setting the IP/mask/gw kind of eludes me. The problem is, I can't write the values into the ifcfg-ethX file, because they can be different during next boot and I have to set BOOTPROTO=ibft to tell the initscripts that. > > So.. how do I tell NM to do this for me? And how do I change the anaconda GUI to understand the ibft bootproto? To my knowledge, there is no way to tell NM over D-Bus that you want a NIC configured a particular way. The way it's set up is to retain knowledge about the network interfaces it is set to control. For interfaces that have an ifcfg-DEVICE file, there is another daemon called nm-system-settings that constantly monitors those files for changes and feeds the new/changed data in to NetworkManager. It looks like this: NetworkManager (main daemon) | +-- nm-system-settings (monitors /etc files for changes) | +--- uses plugins such as ifcfg-fedora or ifcfg-suse In loader, I set everything up to talk to network manager via the ifcfg files since that was the easiest to maintain. I'm glad I've done that for now because the other APIs for NetworkManager keep changing. What happens when BOOTPROTO=ibft is set? Right now, the ifcfg-fedora plugin for nm-system-settings reads the ifcfg files and can handle BOOTPROTO=static and BOOTPROTO=dhcp. It takes appropriate action depending on those settings. If BOOTPROTO=ibft is simply another kind of configuration path, it might be easy to modify the ifcfg-fedora plugin in NetworkManager to handle that.
diff --git a/anaconda.spec b/anaconda.spec index 5a66b49..c55095e 100644 --- a/anaconda.spec +++ b/anaconda.spec @@ -69,6 +69,7 @@ BuildRequires: zlib-devel BuildRequires: NetworkManager-devel >= %{nmver} BuildRequires: NetworkManager-glib-devel >= %{nmver} BuildRequires: dbus-devel >= %{dbusver} +BuildRequires: iscsi-initiator-utils >= 6.2.0.868-0.9 %ifarch %livearches BuildRequires: desktop-file-utils %endif diff --git a/iscsi.py b/iscsi.py index 5feae15..02bc08e 100644 --- a/iscsi.py +++ b/iscsi.py @@ -461,6 +461,7 @@ class iscsi(object): os.makedirs(fulldir, 0660) self._startIscsiDaemon() + self.startIBFT() if intf: w.pop() diff --git a/isys/iface.h b/isys/iface.h index 5cd8614..e20c2b4 100644 --- a/isys/iface.h +++ b/isys/iface.h @@ -30,7 +30,7 @@ /* Enumerated types used in iface.c as well as loader's network code */ enum { IPUNUSED, IPV4, IPV6 }; -enum { IPV4_UNUSED_METHOD, IPV4_DHCP_METHOD, IPV4_MANUAL_METHOD }; +enum { IPV4_UNUSED_METHOD, IPV4_DHCP_METHOD, IPV4_MANUAL_METHOD, IPV4_IBFT_METHOD }; enum { IPV6_UNUSED_METHOD, IPV6_AUTO_METHOD, IPV6_DHCP_METHOD, IPV6_MANUAL_METHOD }; @@ -100,6 +100,7 @@ typedef struct _iface_t { uint64_t flags; int ipv4method; int ipv6method; + int isiBFT; } iface_t; /* Function prototypes */ diff --git a/iw/netconfig_dialog.py b/iw/netconfig_dialog.py index 4818171..c87da21 100644 --- a/iw/netconfig_dialog.py +++ b/iw/netconfig_dialog.py @@ -67,8 +67,8 @@ class NetworkConfigurator: val = combo.get_model().get_value(active, 1) netdev = self.network.available()[val] - bootproto = netdev.get('BOOTPROTO') - if not bootproto or bootproto == "dhcp": + bootproto = netdev.get("BOOTPROTO") + if not bootproto or bootproto == "dhcp" or bootproto == "ibft": self.xml.get_widget("dhcpCheckbutton").set_active(True) else: self.xml.get_widget("dhcpCheckbutton").set_active(False) diff --git a/loader/Makefile b/loader/Makefile index 6dc0412..443e539 100644 --- a/loader/Makefile +++ b/loader/Makefile @@ -26,7 +26,7 @@ else TARGET=depend $(PROGS) endif -LIBS = -lnewt -lslang -lz -lpopt ../isys/libisys.a -lcheckisomd5 +LIBS = -lnewt -lslang -lz -lpopt ../isys/libisys.a -lcheckisomd5 -lfwparam # devmapper LIBS += $(shell pkg-config --libs devmapper) @@ -57,7 +57,7 @@ METHOBJS = method.o cdinstall.o hdinstall.o nfsinstall.o urlinstall.o OBJS = copy.o log.o moduleinfo.o loadermisc.o modules.o windows.o \ lang.o kbd.o driverdisk.o selinux.o \ mediacheck.o kickstart.o driverselect.o \ - getparts.o dirbrowser.o fwloader.o \ + getparts.o dirbrowser.o fwloader.o ibft.o \ $(HWOBJS) $(METHOBJS) LOADEROBJS = loader.o loader-pcmcia.o NETOBJS = net.o urls.o ftp.o telnet.o telnetd.o diff --git a/loader/net.c b/loader/net.c index eef0234..9ecd70c 100644 --- a/loader/net.c +++ b/loader/net.c @@ -53,6 +53,7 @@ #include "method.h" #include "net.h" #include "windows.h" +#include "ibft.h" /* boot flags */ extern uint64_t flags; @@ -237,8 +238,26 @@ void setupIfaceStruct(iface_t * iface, struct loaderData_s * loaderData) { } if (loaderData->ipinfo_set && loaderData->ipv4 != NULL) { + /* this is iBFT configured device */ + if (!strncmp(loaderData->ip, "ibft", 4)) { + char *devmacaddr = nl_mac2str(loaderData->netDev); + iface->ipv4method = IPV4_IBFT_METHOD; + iface->isiBFT = 1; + + /* Problems with getting the info from iBFT or iBFT uses dhcp*/ + if(!devmacaddr || !ibft_present() || ibft_iface_dhcp()){ + iface->ipv4method = IPV4_DHCP_METHOD; + logMessage(INFO, "iBFT is not present or is configured to use DHCP"); + } + /* MAC address doesn't match */ + else if(strcasecmp(ibft_iface_mac(), devmacaddr)){ + iface->ipv4method = IPV4_DHCP_METHOD; + logMessage(INFO, "iBFT doesn't know what NIC to use - falling back to DHCP"); + } + if(devmacaddr) free(devmacaddr); + } /* this is how we specify dhcp */ - if (!strncmp(loaderData->ipv4, "dhcp", 4)) { + else if (!strncmp(loaderData->ipv4, "dhcp", 4)) { iface->dhcptimeout = loaderData->dhcpTimeout; iface->ipv4method = IPV4_DHCP_METHOD; } else if (inet_pton(AF_INET, loaderData->ipv4, &addr) >= 1) { @@ -289,6 +308,24 @@ void setupIfaceStruct(iface_t * iface, struct loaderData_s * loaderData) { } #endif + /* iBFT configured DNS */ + if(iface->ipv4method == IPV4_IBFT_METHOD){ + if(iface->numdns<MAXNS){ + if(ibft_iface_dns1() && inet_pton(AF_INET, ibft_iface_dns1(), &addr)>=1){ + iface->dns[iface->numdns] = strdup(ibft_iface_dns1()); + iface->numdns++; + logMessage(INFO, "adding iBFT dns server %s", ibft_iface_dns1()); + } + } + if(iface->numdns<MAXNS){ + if(ibft_iface_dns2() && inet_pton(AF_INET, ibft_iface_dns2(), &addr)>=1){ + iface->dns[iface->numdns] = strdup(ibft_iface_dns2()); + iface->numdns++; + logMessage(INFO, "adding iBFT dns server %s", ibft_iface_dns2()); + } + } + } + if (loaderData->dns) { char * buf; char ret[INET6_ADDRSTRLEN+1]; @@ -320,6 +357,8 @@ void setupIfaceStruct(iface_t * iface, struct loaderData_s * loaderData) { } } + + logMessage(INFO, "dnsservers is %s", loaderData->dns); } @@ -1221,7 +1260,9 @@ int writeEnabledNetInfo(iface_t *iface) { fprintf(fp, "ONBOOT=yes\n"); if (!FL_NOIPV4(flags)) { - if (iface->ipv4method == IPV4_DHCP_METHOD) { + if (iface->ipv4method == IPV4_IBFT_METHOD) { + fprintf(fp, "BOOTPROTO=ibft\n"); + else if (iface->ipv4method == IPV4_DHCP_METHOD) { fprintf(fp, "BOOTPROTO=dhcp\n"); } else if (iface->ipv4method == IPV4_MANUAL_METHOD) { fprintf(fp, "BOOTPROTO=static\n"); @@ -1580,6 +1621,7 @@ int chooseNetworkInterface(struct loaderData_s * loaderData) { char **deviceNames; char *ksMacAddr = NULL, *seconds = strdup("10"), *idstr = NULL; struct device **devs; + int lookForLink = 0; struct newtWinEntry entry[] = {{N_("Seconds:"), (char **) &seconds, 0}, {NULL, NULL, 0 }}; @@ -1669,8 +1711,60 @@ int chooseNetworkInterface(struct loaderData_s * loaderData) { return LOADER_NOOP; } + while((loaderData->netDev && (loaderData->netDev_set == 1)) && + !strcmp(loaderData->netDev, "ibft")){ + char *devmacaddr = NULL; + char *ibftmacaddr = ""; + + /* get MAC from the iBFT table */ + if(!(ibftmacaddr = ibft_iface_mac())){ /* iBFT not present or error */ + lookForLink = 0; + break; + } + + logMessage(INFO, "looking for iBFT configured device %s with link", ibftmacaddr); + lookForLink = 0; + + for (i = 0; devs[i]; i++) { + if (!devs[i]->device) + continue; + devmacaddr = nl_mac2str(devs[i]->device); + if(!strcasecmp(devmacaddr, ibftmacaddr)){ + logMessage(INFO, "%s has the right MAC (%s), checking for link", devmacaddr, devices[i]); + free(devmacaddr); + if(get_link_status(devices[i]) == 1){ + lookForLink = 0; + loaderData->netDev = devices[i]; + logMessage(INFO, "%s has link, using it", devices[i]); + + /* set the IP method to ibft if not requested differently */ + if(loaderData->ip==NULL){ + loaderData->ip = strdup("ibft"); + logMessage(INFO, "%s will be configured using iBFT values", devices[i]); + } + return LOADER_NOOP; + } + else{ + logMessage(INFO, "%s has no link, skipping it", devices[i]); + } + + break; + } + else{ + free(devmacaddr); + } + } + + break; + } + + if ((loaderData->netDev && (loaderData->netDev_set == 1)) && !strcmp(loaderData->netDev, "link")) { + lookForLink = 1; + } + + if(lookForLink){ logMessage(INFO, "looking for first netDev with link"); for (rc = 0; rc < 5; rc++) { for (i = 0; i < deviceNums; i++) {
_______________________________________________ Anaconda-devel-list mailing list Anaconda-devel-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/anaconda-devel-list