]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
Use the correct address types in net.c.
authorManoel R. Abranches <mrabran@br.ibm.com>
Wed, 15 Sep 2010 16:00:51 +0000 (13:00 -0300)
committerManoel R. Abranches <mrabran@br.ibm.com>
Wed, 15 Sep 2010 16:00:51 +0000 (13:00 -0300)
implement ntoa ipv4 function.

commands/net.c
include/grub/net.h
include/grub/net/protocol.h
include/grub/net/type_net.h
net/ip.c

index b8ceb36f4c665a10b980b2c0aea3dae4ec105722..2558a309bde5f332fb2ed77b2143aa3940fcc653 100644 (file)
 #include <grub/dl.h>
 #include <grub/command.h>
 
-struct grub_net_route *grub_net_routes = NULL;
-struct grub_net_network_layer_interface *grub_net_network_layer_interfaces = NULL;
-struct grub_net_card *grub_net_cards = NULL;
-struct grub_net_network_layer_protocol *grub_net_network_layer_protocols = NULL;
 
+/*Find which protocol understands the given address*/
 grub_err_t
 grub_net_resolve_address (struct grub_net_network_layer_protocol **prot,
                          char *name,
@@ -102,7 +99,7 @@ grub_cmd_deladdr (struct grub_command *cmd __attribute__ ((unused)),
     return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected"));
 
   FOR_NET_NETWORK_LEVEL_INTERFACES (inter)
-    if (grub_strcmp (inter->name, args[1]))
+    if ( !grub_strcmp (inter->name, args[1]))
       break;
   if (inter == NULL)
     return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("address not found"));
@@ -124,21 +121,36 @@ grub_cmd_addaddr (struct grub_command *cmd __attribute__ ((unused)),
   grub_err_t err;
   grub_net_network_layer_address_t addr;
   struct grub_net_network_layer_interface *inter;
+  grub_printf("Enter add addr function.\n");
+
+  grub_printf("card list address  in net.c = %x\n", (int) grub_net_cards);
 
   if (argc != 4)
     return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("four arguments expected"));
   
   FOR_NET_CARDS (card)
-    if (grub_strcmp (card->name, args[1]))
+  {
+    grub_printf("card address = %x\n", (int) card);
+    grub_printf("card->name = %s\n",card->name);
+    grub_printf("args[1] = %s\n",args[1]);
+    if ( !grub_strcmp (card->name, args[1]))
       break;
+  }
+  
+  grub_printf("Out of the loop.\n");
+  grub_printf("card address = %x\n", (int) card);
+  
   if (card == NULL)
     return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("card not found")); 
 
+  grub_printf("protocols loop.\n");
   FOR_NET_NETWORK_LEVEL_PROTOCOLS (prot)
-    if (grub_strcmp (prot->name, args[2]))
+    if ( !grub_strcmp (prot->name, args[2]))
       break;
 
-  if (card == NULL)
+  grub_printf("end protocols loop.\n");
+
+  if (prot == NULL)
     return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("protocol not found")); 
 
   err = grub_net_resolve_address_in_protocol (prot, args[3], &addr);
@@ -163,6 +175,12 @@ grub_cmd_addaddr (struct grub_command *cmd __attribute__ ((unused)),
     }
   grub_net_network_layer_interface_register (inter);
 
+  FOR_NET_NETWORK_LEVEL_INTERFACES (inter)
+  {
+    grub_printf("inter->name = %s\n",inter->name);
+    grub_printf("inter->address = %x\n",(int) (inter->address.ipv4));
+  
+  }
   return GRUB_ERR_NONE;
 }
 
@@ -178,7 +196,7 @@ grub_cmd_delroute (struct grub_command *cmd __attribute__ ((unused)),
   
   for (prev = &grub_net_routes, route = *prev; route; prev = &((*prev)->next),
         route = *prev)
-    if (grub_strcmp (route->name, args[0]) == 0)
+    if ( !grub_strcmp (route->name, args[0]) == 0)
       {
        *prev = route->next;
        grub_free (route->name);
@@ -232,7 +250,7 @@ grub_cmd_addroute (struct grub_command *cmd __attribute__ ((unused)),
                         N_("Unrecognised address %s"), args[1]);
     }
 
-  if (grub_strcmp (args[2], "gw") == 0 && argc >= 4)
+  if ( !grub_strcmp (args[2], "gw") == 0 && argc >= 4)
     {
       grub_err_t err;
       route->is_gateway = 1;
@@ -251,7 +269,7 @@ grub_cmd_addroute (struct grub_command *cmd __attribute__ ((unused)),
       route->is_gateway = 0;
 
       FOR_NET_NETWORK_LEVEL_INTERFACES (inter)
-       if (grub_strcmp (inter->name, args[2]))
+       if ( !grub_strcmp (inter->name, args[2]))
          break;
 
       if (!inter)
index abb8a316734078f96dba4f14f626f1b589323e69..18779dabe308913ecfa8a645898cef103944f829 100644 (file)
@@ -31,6 +31,8 @@ struct grub_net_card;
 
 struct grub_net_card_driver
 {
+  struct grub_net_card_driver *next;
+  char *name;
   grub_err_t (*init) (struct grub_net_card *dev);
   grub_err_t (*fini) (struct grub_net_card *dev);
   grub_err_t (*send) (struct grub_net_card *dev,struct grub_net_buff *nb);
@@ -66,7 +68,7 @@ struct grub_net_network_layer_interface
   /* Underlying protocol.  */
   struct grub_net_network_layer_protocol *protocol;
   struct grub_net_card *card;
-  union grub_net_network_layer_address address;
+  grub_net_network_layer_address_t address;
   void *data;
 };
 
@@ -121,7 +123,7 @@ grub_net_session_recv (struct grub_net_session *session, void *buf,
   return session->protocol->recv (session, buf, size);
 }
 
-struct grub_net_network_layer_interface *grub_net_network_layer_interfaces;
+extern struct grub_net_network_layer_interface *EXPORT_VAR(grub_net_network_layer_interfaces);
 
 static inline void
 grub_net_network_layer_interface_register (struct grub_net_network_layer_interface *inter)
@@ -139,7 +141,7 @@ grub_net_network_layer_interface_unregister (struct grub_net_network_layer_inter
 
 #define FOR_NET_NETWORK_LEVEL_INTERFACES(var) for (var = grub_net_network_layer_interfaces; var; var = var->next)
 
-extern struct grub_net_route *grub_net_routes;
+extern struct grub_net_route *EXPORT_VAR(grub_net_routes);
 
 static inline void
 grub_net_route_register (struct grub_net_route *route)
@@ -157,7 +159,7 @@ grub_net_route_unregister (struct grub_net_route *route)
 
 #define FOR_NET_ROUTES(var) for (var = grub_net_routes; var; var = var->next)
 
-extern struct grub_net_card *grub_net_cards;
+extern struct grub_net_card *EXPORT_VAR(grub_net_cards);
 
 static inline void
 grub_net_card_register (struct grub_net_card *card)
@@ -174,7 +176,26 @@ grub_net_card_unregister (struct grub_net_card *card)
 }
 
 #define FOR_NET_CARDS(var) for (var = grub_net_cards; var; var = var->next)
+struct grub_net_card_driver *grub_net_card_drivers;
+
+static inline void
+grub_net_card_driver_register (struct grub_net_card_driver *driver)
+{
+  grub_list_push (GRUB_AS_LIST_P (&grub_net_card_drivers),
+                 GRUB_AS_LIST (driver));
+}
+
+static inline void
+grub_net_card_driver_unregister (struct grub_net_card_driver *driver)
+{
+  grub_list_remove (GRUB_AS_LIST_P (&grub_net_card_drivers),
+                   GRUB_AS_LIST (driver));
+}
+
+void ofdriver_ini(void);
+void ofdriver_fini(void);
 
+#define FOR_NET_CARD_DRIVERS(var) for (var = grub_net_card_drivers; var; var = var->next)
 
 #define FOR_NET_NETWORK_LEVEL_PROTOCOLS(var) for ((var) = grub_net_network_layer_protocols; (var); (var) = (var)->next)
 
index ffc3dd719f25f767feb8015eac47dede49100505..ce37404bc05b995850f3bcb0b1b4f04f1b908db7 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef GRUB_PROTOCOL_HEADER
 #define GRUB_PROTOCOL_HEADER
 #include <grub/err.h>
+#include <grub/mm.h>
 #include <grub/net/interface.h>
 #include <grub/net/netbuff.h>
 #include <grub/net/type_net.h>
@@ -60,7 +61,7 @@ struct grub_net_network_layer_protocol
   grub_uint16_t type; /* IANA Ethertype */
   //grub_network_layer_protocol_id_t id;
   grub_err_t (*ntoa) (char *name, grub_net_network_layer_address_t *addr);
-  char * (*aton) (union grub_net_network_layer_address addr);
+  char * (*aton) (grub_net_network_layer_address_t addr);
   grub_err_t (*net_ntoa) (char *name,
                          grub_net_network_layer_netaddress_t *addr);
   char * (*net_aton) (grub_net_network_layer_netaddress_t addr);
@@ -87,7 +88,7 @@ struct grub_net_link_layer_protocol
              grub_uint16_t ethertype);
 };
 
-extern struct grub_net_network_layer_protocol *grub_net_network_layer_protocols;
+extern struct grub_net_network_layer_protocol *EXPORT_VAR(grub_net_network_layer_protocols);
 
 typedef struct grub_net_protocol *grub_net_protocol_t;
 void grub_net_application_layer_protocol_register (struct grub_net_application_layer_protocol *prot);
index a1717d6a7591d068d6d9bce8dfda2baf8508e1f8..f159b1de03f1412e8eccb34c689cf05cbfdc6d45 100644 (file)
@@ -18,16 +18,16 @@ typedef enum
 }grub_net_protocol_id_t;
 
 
-typedef union grub_net_network_layer_address
+typedef union grub_net_network_layer_netaddress
 {
   grub_uint32_t ipv4;
-} grub_net_network_layer_netaddress_t;
+} grub_net_network_layer_address_t;
 
-typedef union grub_net_network_layer_netaddress
+typedef union grub_net_network_layer_address
 {
   struct {
     grub_uint32_t base;
     int masksize; 
   } ipv4;
-} grub_net_network_layer_address_t;
+} grub_net_network_layer_netaddress_t;
 #endif 
index 142f33e70335a64312dd897136de7c73586bde23..8237603f227b3251f269813720aa6efedfd37701 100644 (file)
--- a/net/ip.c
+++ b/net/ip.c
@@ -68,8 +68,10 @@ send_ip_packet (struct grub_net_network_layer_interface *inf,
   grub_memcpy(nl_target_addr.addr, &(iph->dest), nl_target_addr.len);
   rc = arp_resolve(inf, trans_net_inf->inner_layer, &nl_target_addr, &ll_target_addr);
   grub_free(nl_target_addr.addr);
-  if (rc != GRUB_ERR_NONE)
+  if (rc != GRUB_ERR_NONE){
+    grub_printf("Error in the ARP resolve.\n");
     return rc;
+  }
 
   rc = trans_net_inf->inner_layer->link_prot->send(inf,trans_net_inf->inner_layer,nb,ll_target_addr, IP_ETHERTYPE);
   grub_free(ll_target_addr.addr);
@@ -113,13 +115,45 @@ recv_ip_packet (struct grub_net_network_layer_interface *inf,
   return 0; 
 }
 
+
+static grub_err_t
+ipv4_ntoa (char *val, grub_net_network_layer_address_t *addr )
+{
+  grub_uint8_t *p = (grub_uint8_t *) addr;
+  unsigned long t;
+  int i;
+
+  for (i = 0; i < 4; i++)
+  {
+      t = grub_strtoul (val, (char **) &val, 0);
+      if (grub_errno)
+       return grub_errno;
+
+      if (t & ~0xff)
+       return grub_error (GRUB_ERR_OUT_OF_RANGE, "Invalid IP.");
+      
+      p[i] = (grub_uint8_t) t;
+      if (i != 3 && *val != '.')
+       return grub_error (GRUB_ERR_OUT_OF_RANGE, "Invalid IP.");
+      
+      val++;
+  }
+
+  val = val - 1;
+  if (*val != '\0')
+       return grub_error (GRUB_ERR_OUT_OF_RANGE, "Invalid IP.");
+  
+  return GRUB_ERR_NONE;
+}
+
 static struct grub_net_network_layer_protocol grub_ipv4_protocol =
 {
  .name = "ipv4",
  .id = GRUB_NET_IPV4_ID,
  .type = IP_ETHERTYPE,
  .send = send_ip_packet,
- .recv = recv_ip_packet
+ .recv = recv_ip_packet,
+ .ntoa = ipv4_ntoa 
 };
 
 void ipv4_ini(void)