Use the correct address types in net.c.
implement ntoa ipv4 function.
This commit is contained in:
parent
10830203a0
commit
9a9cee4e43
5 changed files with 97 additions and 23 deletions
|
@ -22,11 +22,8 @@
|
||||||
#include <grub/dl.h>
|
#include <grub/dl.h>
|
||||||
#include <grub/command.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_err_t
|
||||||
grub_net_resolve_address (struct grub_net_network_layer_protocol **prot,
|
grub_net_resolve_address (struct grub_net_network_layer_protocol **prot,
|
||||||
char *name,
|
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"));
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected"));
|
||||||
|
|
||||||
FOR_NET_NETWORK_LEVEL_INTERFACES (inter)
|
FOR_NET_NETWORK_LEVEL_INTERFACES (inter)
|
||||||
if (grub_strcmp (inter->name, args[1]))
|
if ( !grub_strcmp (inter->name, args[1]))
|
||||||
break;
|
break;
|
||||||
if (inter == NULL)
|
if (inter == NULL)
|
||||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("address not found"));
|
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_err_t err;
|
||||||
grub_net_network_layer_address_t addr;
|
grub_net_network_layer_address_t addr;
|
||||||
struct grub_net_network_layer_interface *inter;
|
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)
|
if (argc != 4)
|
||||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("four arguments expected"));
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("four arguments expected"));
|
||||||
|
|
||||||
FOR_NET_CARDS (card)
|
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;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_printf("Out of the loop.\n");
|
||||||
|
grub_printf("card address = %x\n", (int) card);
|
||||||
|
|
||||||
if (card == NULL)
|
if (card == NULL)
|
||||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("card not found"));
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("card not found"));
|
||||||
|
|
||||||
|
grub_printf("protocols loop.\n");
|
||||||
FOR_NET_NETWORK_LEVEL_PROTOCOLS (prot)
|
FOR_NET_NETWORK_LEVEL_PROTOCOLS (prot)
|
||||||
if (grub_strcmp (prot->name, args[2]))
|
if ( !grub_strcmp (prot->name, args[2]))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (card == NULL)
|
grub_printf("end protocols loop.\n");
|
||||||
|
|
||||||
|
if (prot == NULL)
|
||||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("protocol not found"));
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("protocol not found"));
|
||||||
|
|
||||||
err = grub_net_resolve_address_in_protocol (prot, args[3], &addr);
|
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);
|
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;
|
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),
|
for (prev = &grub_net_routes, route = *prev; route; prev = &((*prev)->next),
|
||||||
route = *prev)
|
route = *prev)
|
||||||
if (grub_strcmp (route->name, args[0]) == 0)
|
if ( !grub_strcmp (route->name, args[0]) == 0)
|
||||||
{
|
{
|
||||||
*prev = route->next;
|
*prev = route->next;
|
||||||
grub_free (route->name);
|
grub_free (route->name);
|
||||||
|
@ -232,7 +250,7 @@ grub_cmd_addroute (struct grub_command *cmd __attribute__ ((unused)),
|
||||||
N_("Unrecognised address %s"), args[1]);
|
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;
|
grub_err_t err;
|
||||||
route->is_gateway = 1;
|
route->is_gateway = 1;
|
||||||
|
@ -251,7 +269,7 @@ grub_cmd_addroute (struct grub_command *cmd __attribute__ ((unused)),
|
||||||
route->is_gateway = 0;
|
route->is_gateway = 0;
|
||||||
|
|
||||||
FOR_NET_NETWORK_LEVEL_INTERFACES (inter)
|
FOR_NET_NETWORK_LEVEL_INTERFACES (inter)
|
||||||
if (grub_strcmp (inter->name, args[2]))
|
if ( !grub_strcmp (inter->name, args[2]))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (!inter)
|
if (!inter)
|
||||||
|
|
|
@ -31,6 +31,8 @@ struct grub_net_card;
|
||||||
|
|
||||||
struct grub_net_card_driver
|
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 (*init) (struct grub_net_card *dev);
|
||||||
grub_err_t (*fini) (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);
|
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. */
|
/* Underlying protocol. */
|
||||||
struct grub_net_network_layer_protocol *protocol;
|
struct grub_net_network_layer_protocol *protocol;
|
||||||
struct grub_net_card *card;
|
struct grub_net_card *card;
|
||||||
union grub_net_network_layer_address address;
|
grub_net_network_layer_address_t address;
|
||||||
void *data;
|
void *data;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -121,7 +123,7 @@ grub_net_session_recv (struct grub_net_session *session, void *buf,
|
||||||
return session->protocol->recv (session, buf, size);
|
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
|
static inline void
|
||||||
grub_net_network_layer_interface_register (struct grub_net_network_layer_interface *inter)
|
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)
|
#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
|
static inline void
|
||||||
grub_net_route_register (struct grub_net_route *route)
|
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)
|
#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
|
static inline void
|
||||||
grub_net_card_register (struct grub_net_card *card)
|
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)
|
#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)
|
#define FOR_NET_NETWORK_LEVEL_PROTOCOLS(var) for ((var) = grub_net_network_layer_protocols; (var); (var) = (var)->next)
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#ifndef GRUB_PROTOCOL_HEADER
|
#ifndef GRUB_PROTOCOL_HEADER
|
||||||
#define GRUB_PROTOCOL_HEADER
|
#define GRUB_PROTOCOL_HEADER
|
||||||
#include <grub/err.h>
|
#include <grub/err.h>
|
||||||
|
#include <grub/mm.h>
|
||||||
#include <grub/net/interface.h>
|
#include <grub/net/interface.h>
|
||||||
#include <grub/net/netbuff.h>
|
#include <grub/net/netbuff.h>
|
||||||
#include <grub/net/type_net.h>
|
#include <grub/net/type_net.h>
|
||||||
|
@ -60,7 +61,7 @@ struct grub_net_network_layer_protocol
|
||||||
grub_uint16_t type; /* IANA Ethertype */
|
grub_uint16_t type; /* IANA Ethertype */
|
||||||
//grub_network_layer_protocol_id_t id;
|
//grub_network_layer_protocol_id_t id;
|
||||||
grub_err_t (*ntoa) (char *name, grub_net_network_layer_address_t *addr);
|
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_err_t (*net_ntoa) (char *name,
|
||||||
grub_net_network_layer_netaddress_t *addr);
|
grub_net_network_layer_netaddress_t *addr);
|
||||||
char * (*net_aton) (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);
|
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;
|
typedef struct grub_net_protocol *grub_net_protocol_t;
|
||||||
void grub_net_application_layer_protocol_register (struct grub_net_application_layer_protocol *prot);
|
void grub_net_application_layer_protocol_register (struct grub_net_application_layer_protocol *prot);
|
||||||
|
|
|
@ -18,16 +18,16 @@ typedef enum
|
||||||
}grub_net_protocol_id_t;
|
}grub_net_protocol_id_t;
|
||||||
|
|
||||||
|
|
||||||
typedef union grub_net_network_layer_address
|
typedef union grub_net_network_layer_netaddress
|
||||||
{
|
{
|
||||||
grub_uint32_t ipv4;
|
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 {
|
struct {
|
||||||
grub_uint32_t base;
|
grub_uint32_t base;
|
||||||
int masksize;
|
int masksize;
|
||||||
} ipv4;
|
} ipv4;
|
||||||
} grub_net_network_layer_address_t;
|
} grub_net_network_layer_netaddress_t;
|
||||||
#endif
|
#endif
|
||||||
|
|
38
net/ip.c
38
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);
|
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);
|
rc = arp_resolve(inf, trans_net_inf->inner_layer, &nl_target_addr, &ll_target_addr);
|
||||||
grub_free(nl_target_addr.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;
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
rc = trans_net_inf->inner_layer->link_prot->send(inf,trans_net_inf->inner_layer,nb,ll_target_addr, IP_ETHERTYPE);
|
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);
|
grub_free(ll_target_addr.addr);
|
||||||
|
@ -113,13 +115,45 @@ recv_ip_packet (struct grub_net_network_layer_interface *inf,
|
||||||
return 0;
|
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 =
|
static struct grub_net_network_layer_protocol grub_ipv4_protocol =
|
||||||
{
|
{
|
||||||
.name = "ipv4",
|
.name = "ipv4",
|
||||||
.id = GRUB_NET_IPV4_ID,
|
.id = GRUB_NET_IPV4_ID,
|
||||||
.type = IP_ETHERTYPE,
|
.type = IP_ETHERTYPE,
|
||||||
.send = send_ip_packet,
|
.send = send_ip_packet,
|
||||||
.recv = recv_ip_packet
|
.recv = recv_ip_packet,
|
||||||
|
.ntoa = ipv4_ntoa
|
||||||
};
|
};
|
||||||
|
|
||||||
void ipv4_ini(void)
|
void ipv4_ini(void)
|
||||||
|
|
Loading…
Reference in a new issue