implement ntoa ipv4 function.
#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,
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"));
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);
}
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;
}
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);
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;
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)
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);
/* 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;
};
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)
#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)
#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)
}
#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)
#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>
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);
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);
}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
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);
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)