[PATCH] RHEL5 iBFT forward port to Fedora - part 1

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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

[Index of Archives]     [Kickstart]     [Fedora Users]     [Fedora Legacy List]     [Fedora Maintainers]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [Yosemite Photos]     [KDE Users]     [Fedora Tools]
  Powered by Linux