orphan
[debian/elilo] / glue_netfs.c
index 757fc8b8f3ba2b0f39b5d22e7831f822a2279e1a..eebfecc103ee692954ea8b48f77ca015f8c2346c 100644 (file)
@@ -1,6 +1,10 @@
 /*
  *  Copyright (C) 2001-2003 Hewlett-Packard Co.
  *     Contributed by Stephane Eranian <eranian@hpl.hp.com>
+ *  Copyright (C) 2006-2009 Intel Corporation
+ *     Contributed by Fenghua Yu <fenghua.yu@intel.com>
+ *     Contributed by Bibo Mao <bibo.mao@intel.com>
+ *     Contributed by Chandramouli Narayanan <mouli@linux.intel.com>
  *
  * This file is part of the ELILO, the EFI Linux boot loader.
  *
@@ -60,6 +64,19 @@ static CHAR16 netfs_default_path[FILENAME_MAXLEN];
 
 static CHAR16 *hexa=L"0123456789ABCDEF";
 
+static VOID
+convert_mac2hex(UINT8 *hw_addr,INTN l, CHAR16 *str)
+{
+       UINTN i;
+
+       for (i=0 ; i < l; i++) {
+               str[3*i] = hexa[(hw_addr[i] & 0xf0)>>4];
+               str[3*i+1] = hexa[hw_addr[i] & 0x0f];
+               str[3*i+2] = ':';
+       }
+       str[3*l-1]='\0';
+}
+
 static VOID
 convert_ip2hex(UINT8 *ip, INTN l, CHAR16 *str)
 {
@@ -117,7 +134,7 @@ netfs_set_default_path(netfs_interface_t *netfs, netfs_info_t *info)
 }
 
 static EFI_STATUS
-netfs_setdefaults(VOID *intf, CHAR16 *config, CHAR16 *kname, UINTN maxlen, CHAR16 *devpath)
+netfs_setdefaults(VOID *intf, config_file_t *config, CHAR16 *kname, UINTN maxlen, CHAR16 *devpath)
 {
        netfs_interface_t *netfs = (netfs_interface_t *)intf;
        netfs_info_t info;
@@ -149,10 +166,12 @@ netfs_setdefaults(VOID *intf, CHAR16 *config, CHAR16 *kname, UINTN maxlen, CHAR1
        set_var(VAR_NETFS_DOMAINAME, info.domainame);
 
        if (info.using_pxe) {
-               status = netfs->netfs_query_layer(netfs, 0, NETFS_CONFIG_LAYER, maxlen, config);
+               DBG_PRT((L"netfs_setdefaults: using_pxe"));
+
+               status = netfs->netfs_query_layer(netfs, 0, NETFS_CONFIG_LAYER, maxlen, config[0].fname);
                if (EFI_ERROR(status)) {
-                       StrnCpy(config, NETFS_DEFAULT_CONFIG, maxlen-1);
-                       config[maxlen-1] = CHAR_NULL;
+                       StrnCpy(config[0].fname, NETFS_DEFAULT_CONFIG, maxlen-1);
+                       config[0].fname[maxlen-1] = CHAR_NULL;
                }
 
                status = netfs->netfs_query_layer(netfs, 0, NETFS_KERNEL_LAYER, maxlen, kname);
@@ -162,21 +181,57 @@ netfs_setdefaults(VOID *intf, CHAR16 *config, CHAR16 *kname, UINTN maxlen, CHAR1
                }
        } else {
 #ifdef ENABLE_MACHINE_SPECIFIC_NETCONFIG
+
+#  if defined(CONFIG_ia64)
+#    define CONFIG_ARCH_EXTENSION L"-ia64.conf\0"
+#    define EXTENSION_LENGTH 11
+#  elif defined (CONFIG_ia32)
+#    define CONFIG_ARCH_EXTENSION L"-ia32.conf\0"
+#    define EXTENSION_LENGTH 11
+#  elif defined (CONFIG_x86_64)
+#    define CONFIG_ARCH_EXTENSION L"-x86_64.conf\0"
+#    define EXTENSION_LENGTH 13
+#  else
+#    error "You need to specfy your default arch config file"
+#  endif            
+
+#  define CONFIG_EXTENSION L".conf\0"
+
+               DBG_PRT((L"netfs_setdefaults: machine specific (!using_pxe)"));
                /*
-                * will try a machine specific file first.
-                * the file is constructed based on the IP(v4) address
+                * will try machine/subnet specific files first.
+                * the filenames are constructed based on the IP(v4) address
                 */
-               convert_ip2hex(ipaddr, m, config);
-
-               config[8]  = L'.';
-               config[9]  = L'c';
-               config[10] = L'o';
-               config[11] = L'n';
-               config[12] = L'f';
-               config[13] = CHAR_NULL;
+               convert_ip2hex(ipaddr, m, str);
+               StrnCpy(config[0].fname, str, maxlen-1);
+               StrnCpy(config[0].fname+8, CONFIG_EXTENSION, 6);
+
+               StrnCpy(config[1].fname, str, maxlen-1);
+               StrnCpy(config[1].fname+6, CONFIG_ARCH_EXTENSION, EXTENSION_LENGTH);
+
+               StrnCpy(config[2].fname, str, maxlen-1);
+               StrnCpy(config[2].fname+6, CONFIG_EXTENSION, 6);
+
+               StrnCpy(config[3].fname, str, maxlen-1);
+               StrnCpy(config[3].fname+4, CONFIG_ARCH_EXTENSION, EXTENSION_LENGTH);
+
+               StrnCpy(config[4].fname, str, maxlen-1);
+               StrnCpy(config[4].fname+4, CONFIG_EXTENSION, 6);
+                
+               StrnCpy(config[5].fname, str, maxlen-1);
+               StrnCpy(config[5].fname+2, CONFIG_ARCH_EXTENSION, EXTENSION_LENGTH);
+
+               StrnCpy(config[6].fname, str, maxlen-1);
+               StrnCpy(config[6].fname+2, CONFIG_EXTENSION, 6);
+
+               /* use the MAC address as a possible file name as well */
+               convert_mac2hex(info.hw_addr,6,str);
+               StrnCpy(config[7].fname, str, maxlen-1);
+               StrnCpy(config[7].fname+17, CONFIG_EXTENSION, 6);
+
 #else
-               StrnCpy(config, NETFS_DEFAULT_CONFIG, maxlen-1);
-               config[maxlen-1] = CHAR_NULL;
+               StrnCpy(config[0].fname, NETFS_DEFAULT_CONFIG, maxlen-1);
+               config[0].fname[maxlen-1] = CHAR_NULL;
 #endif
                StrnCpy(kname, NETFS_DEFAULT_KERNEL, maxlen-1);
                kname[maxlen-1] = CHAR_NULL;