]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
Network code specific for ieee1275 machines.
authorManoel R. Abranches <mrabran@br.ibm.com>
Mon, 21 Jun 2010 22:20:55 +0000 (19:20 -0300)
committerManoel R. Abranches <mrabran@br.ibm.com>
Mon, 21 Jun 2010 22:20:55 +0000 (19:20 -0300)
Used to parse BOOTP packet from the server and use write/read on the network card.
May be removed later.

conf/powerpc-ieee1275.rmk
include/grub/disk.h
include/grub/ieee1275/ieee1275.h
kern/ieee1275/init.c
kern/ieee1275/openfw.c
kern/main.c
net/ieee1275/interface.c

index 14d04f93edbc117951769833a502bb3051fbce3f..ead6d423093d59f184862cb15a3c0a9b132d66a5 100644 (file)
@@ -24,7 +24,8 @@ kernel_img_SOURCES = kern/powerpc/ieee1275/startup.S kern/ieee1275/cmain.c \
        kern/parser.c kern/partition.c kern/env.c kern/$(target_cpu)/dl.c       \
        kern/generic/millisleep.c kern/time.c                            \
        symlist.c kern/$(target_cpu)/cache.S net/ip.c net/tftp.c net/udp.c net/ethernet.c net/arp.c     \
-        net/ieee1275/interface.c net/interface.c net/protocol.c net/netbuff.c
+        net/ieee1275/interface.c net/interface.c net/protocol.c net/netbuff.c \
+        fs/ieee1275/ofnet.c
 kernel_img_CFLAGS = $(COMMON_CFLAGS)
 kernel_img_ASFLAGS = $(COMMON_ASFLAGS)
 kernel_img_LDFLAGS += $(COMMON_LDFLAGS) -Wl,-N,-S,-Ttext,0x200000,-Bstatic
index e7f807e0efbe0c10c2ef48cc140d6ad77238a24f..1bdfb639b962396a20f9442ade1e14d14a50c649 100644 (file)
@@ -42,7 +42,8 @@ enum grub_disk_dev_id
     GRUB_DISK_DEVICE_PXE_ID,
     GRUB_DISK_DEVICE_SCSI_ID,
     GRUB_DISK_DEVICE_FILE_ID,
-    GRUB_DISK_DEVICE_LUKS_ID
+    GRUB_DISK_DEVICE_LUKS_ID,
+    GRUB_DISK_DEVICE_OFNET_ID
   };
 
 struct grub_disk;
index b30909c68f4dc6169c6a0f46e9d38f74b7572c03..f4c8b4edff005daac8ca8464d78f4896b02213b2 100644 (file)
@@ -182,9 +182,8 @@ EXPORT_FUNC(grub_ieee1275_map) (grub_addr_t phys, grub_addr_t virt,
 
 char *EXPORT_FUNC(grub_ieee1275_encode_devname) (const char *path);
 char *EXPORT_FUNC(grub_ieee1275_get_filename) (const char *path);
-
 int EXPORT_FUNC(grub_ieee1275_devices_iterate) (int (*hook)
                                                (struct grub_ieee1275_devalias *
                                                 alias));
-
+char *EXPORT_FUNC(grub_ieee1275_get_aliasdevname) (const char *path);
 #endif /* ! GRUB_IEEE1275_HEADER */
index b7e5c337e64916e8a3bd5d46547ee81fde662f50..1e108c920c2224cb1ed39824bce159a104dd0006 100644 (file)
@@ -32,6 +32,7 @@
 #include <grub/ieee1275/ofdisk.h>
 #include <grub/ieee1275/ieee1275.h>
 #include <grub/offsets.h>
+#include <grub/ieee1275/ofnet.h>
 
 /* The minimal heap size we can live with. */
 #define HEAP_MIN_SIZE          (unsigned long) (2 * 1024 * 1024)
@@ -223,13 +224,14 @@ grub_machine_init (void)
   grub_ssize_t actual;
 
   grub_ieee1275_init ();
-
+  
   grub_console_init ();
 #ifdef __i386__
   grub_get_extended_memory ();
 #endif
   grub_claim_heap ();
   grub_ofdisk_init ();
+  grub_ofnet_init();
 
   /* Process commandline.  */
   if (grub_ieee1275_get_property (grub_ieee1275_chosen, "bootargs", &args,
index 5693f3be0760f0f648cd3c62778a008ae89ee1f6..337fc4b7e533165499c0debad945aba69b743e45 100644 (file)
 #include <grub/misc.h>
 #include <grub/mm.h>
 #include <grub/ieee1275/ieee1275.h>
+#include <grub/ieee1275/ofnet.h>
 
 enum grub_ieee1275_parse_type
 {
   GRUB_PARSE_FILENAME,
   GRUB_PARSE_PARTITION,
+  GRUB_PARSE_DEVICE
 };
 
 /* Walk children of 'devpath', calling hook for each.  */
@@ -366,12 +368,14 @@ grub_ieee1275_parse_args (const char *path, enum grub_ieee1275_parse_type ptype)
            ret = grub_strndup (args, (grub_size_t)(comma - args));
        }
     }
-  else
+
+  else if (!grub_strcmp ("network", type))
+    {
+      if (ptype == GRUB_PARSE_DEVICE)
+        ret = grub_strdup(device);
+    }
+  else  
     {
-      /* XXX Handle net devices by configuring & registering a grub_net_dev
-        here, then return its name?
-        Example path: "net:<server ip>,<file name>,<client ip>,<gateway
-        ip>,<bootp retries>,<tftp retries>".  */
       grub_printf ("Unsupported type %s for device %s\n", type, device);
     }
 
@@ -381,6 +385,12 @@ fail:
   return ret;
 }
 
+char *
+grub_ieee1275_get_aliasdevname (const char *path)
+{
+  return grub_ieee1275_parse_args (path, GRUB_PARSE_DEVICE);
+}
+
 char *
 grub_ieee1275_get_filename (const char *path)
 {
@@ -432,3 +442,51 @@ grub_halt (void)
   grub_ieee1275_interpret ("power-off", 0);
   grub_ieee1275_interpret ("poweroff", 0);
 }
+
+static const struct
+{
+  char *name;
+  int offset;
+}
+
+bootp_response_properties[] = 
+{
+  { .name = "bootp-response", .offset = 0 },
+  { .name = "dhcp-response", .offset = 0 },
+  { .name = "bootpreply-packet", .offset = 0x2a },
+};
+
+#define SIZE(X) ( sizeof (X) / sizeof(X[0]))
+
+grub_bootp_t 
+grub_getbootp( void )
+{
+  grub_bootp_t packet = grub_malloc(sizeof *packet);
+  void *bootp_response = NULL; 
+  grub_ssize_t size;
+  unsigned int i;
+ // grub_ieee1275_finddevice ("/chosen", &grub_ieee1275_chosen);
+  for  ( i = 0; i < SIZE(bootp_response_properties); i++)
+  {
+    if (grub_ieee1275_get_property_length (grub_ieee1275_chosen, 
+                                  bootp_response_properties[i].name, &size)>=0)
+      break;
+  }
+
+  if ( size <0 )
+  {
+    grub_printf("Error to get bootp\n");
+    return NULL;
+  }
+
+  if (grub_ieee1275_get_property (grub_ieee1275_chosen, bootp_response_properties[i].name , bootp_response ,
+                                 size, 0) < 0)
+  {
+    grub_printf("Error to get bootp\n");
+    return NULL;
+  }
+
+  packet = (void *) ((int)bootp_response + bootp_response_properties[i].offset);
+  return packet;
+}
+
index 8b6c8a180b5da7687422e88195f9c7bd3b623c0f..3320c4a68f45c7d51d285be63c051025f7997e28 100644 (file)
@@ -95,14 +95,14 @@ grub_load_modules (void)
 
   grub_module_iterate (hook);
 }
-
+/*
 static void
 grub_load_config (void)
 {
   auto int hook (struct grub_module_header *);
   int hook (struct grub_module_header *header)
     {
-      /* Not an embedded config, skip.  */
+      / Not an embedded config, skip.  /
       if (header->type != OBJ_TYPE_CONFIG)
        return 0;
 
@@ -113,7 +113,7 @@ grub_load_config (void)
 
   grub_module_iterate (hook);
 }
-
+*/
 /* Write hook for the environment variables of root. Remove surrounding
    parentheses, if any.  */
 static char *
@@ -192,7 +192,7 @@ grub_main (void)
 
   grub_register_core_commands ();
 
-  grub_load_config ();
+  //grub_load_config ();
   grub_load_normal_mode ();
   grub_rescue_run ();
 }
index 5a246ffa55162504b89b69519d42fb976c3ea99e..fbd887ad2effda7d017fd45792c732f090b9fa25 100644 (file)
@@ -1,55 +1,21 @@
 #include <grub/net/ieee1275/interface.h>
+#include <grub/time.h>
 #include <grub/mm.h>
-
-grub_uint32_t get_server_ip (void)
-{
-  return bootp_pckt->siaddr;
-}
-
-grub_uint32_t get_client_ip (void)
-{
-  return bootp_pckt->yiaddr;
-}
-
-grub_uint8_t* get_server_mac (void)
-{
-  grub_uint8_t *mac; 
-  mac = grub_malloc (6 * sizeof(grub_uint8_t));
-  mac[0] = 0x00 ;
-  mac[1] = 0x11 ;
-  mac[2] = 0x25 ; 
-  mac[3] = 0xca ;  
-  mac[4] = 0x1f ;  
-  mac[5] = 0x01 ;  
-
-  return mac;
-
-}
-
-grub_uint8_t* get_client_mac (void)
-{
-  grub_uint8_t *mac;
-  
-  mac = grub_malloc (6 * sizeof (grub_uint8_t));
-  mac[0] = 0x0a ;
-  mac[1] = 0x11 ;
-  mac[2] = 0xbd ;
-  mac[3] = 0xe3 ; 
-  mac[4] = 0xe3 ;   
-  mac[5] = 0x04 ;
-
-  return mac;
-}  
+#include <grub/net/ethernet.h>
+#include <grub/net/ip.h>
+#include <grub/net/arp.h>
+#include <grub/net/netbuff.h>
+#include <grub/ieee1275/ofnet.h>
 
 static grub_ieee1275_ihandle_t handle;
 int card_open (void)
 {
 
   grub_ieee1275_open (grub_net->dev , &handle);
-    return 1;//error
+    return 0;
 
 }
+
 int card_close (void)
 {
 
@@ -59,22 +25,74 @@ int card_close (void)
 }
 
 
-int send_card_buffer (void *buffer,int buff_len)
+int send_card_buffer (struct grub_net_buff *pack)
 {
   
-  int actual; 
-
-  grub_ieee1275_write (handle,buffer,buff_len,&actual);
+  int actual;
+  //grub_printf("packet size transmited: %d\n",pack->tail - pack->data);
+  grub_ieee1275_write (handle,pack->data,pack->tail - pack->data,&actual);
+//  grub_printf("actual transmited %d\n",actual);
  
   return actual; 
 }
 
-int get_card_buffer (void *buffer,int buff_len)
+int get_card_packet (struct grub_net_buff *pack __attribute__ ((unused)))
 {
 
-  int actual; 
-
-  grub_ieee1275_read (handle,buffer,buff_len,&actual);
-  
-  return actual; 
+  int actual;
+  char *datap; 
+  struct iphdr *iph;
+  struct etherhdr *eth;
+  struct arphdr *arph;
+  pack->data = pack->tail =  pack->head;
+  datap = pack->data; 
+  do
+  {
+    grub_ieee1275_read (handle,datap,sizeof (*eth),&actual);
+   // if (actual <= 0)
+     // grub_millisleep(10);
+
+  }while (actual <= 0);
+  eth = (struct etherhdr *) datap;
+  datap += sizeof(*eth);
+  // grub_printf("ethernet eth->dst %x:%x:%x:%x:%x:%x\n",eth->dst[0],
+  //        eth->dst[1],eth->dst[2],eth->dst[3],eth->dst[4],eth->dst[5]);
+ //  grub_printf("ethernet eth->src %x:%x:%x:%x:%x:%x\n",eth->src[0],eth->src[1],
+ //         eth->src[2],eth->src[3],eth->src[4],eth->src[5]);
+//  grub_printf ("eth.type 0x%x\n",eth->type);
+
+  switch (eth->type)
+  {
+    case 0x806:
+
+      grub_ieee1275_read (handle,datap,sizeof (*arph),&actual);
+      arph = (struct arphdr *) datap;
+      
+      grub_netbuff_put (pack,sizeof (*eth) + sizeof (*arph));
+    break;
+    case 0x800:
+      grub_ieee1275_read (handle,datap,sizeof (*iph),&actual);
+      iph = (struct iphdr *) datap;
+      datap += sizeof(*iph);
+
+     // grub_printf("ip.src 0x%x\n",iph->src);
+     // grub_printf("ip.dst 0x%x\n",iph->dest);
+     // grub_printf("ip.len 0x%x\n",iph->len);
+     // grub_printf("ip.protocol 0x%x\n",iph->protocol);
+    
+      grub_ieee1275_read (handle,datap,iph->len - sizeof (*iph),&actual);
+       
+    
+      grub_netbuff_put (pack,sizeof (*eth) + iph->len);
+    break;
+    case 0x86DD:
+      grub_printf("Ipv6 not yet implemented.\n"); 
+    break;
+    default:
+      grub_printf("Unknow  packet %x\n",eth->type); 
+    break;
+  }
+//  grub_printf("packsize %d\n",pack->tail - pack->data);
+  return 0;// sizeof (eth) + iph.len; 
 }