{
- if (grub_strcmp (name, "network"))
+ if (grub_strcmp (name, "net"))
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "not a net disk");
disk->total_sectors = U64MAXSIZE;
int (*hook) (const char *filename,
const struct grub_dirhook_info *info) __attribute((unused)))
{
- if(grub_strcmp (device->disk->name,"network"))
+ if(grub_strcmp (device->disk->name,"net"))
{
return grub_error (GRUB_ERR_BAD_FS, "not an net filesystem");
}
//grub_addr_t addr;
if (name[0] == '/')
name++;
- if(grub_strcmp (file->device->disk->name,"network"))
+ if(grub_strcmp (file->device->disk->name,"net"))
{
return 1;
grub_netbuff_reserve (pack,80*1024);
file_size = app_interface->app_prot->get_file_size(NULL,stack,pack,(char *) name);
-
for (found_addr = 0x800000; found_addr < + 2000 * 0x100000; found_addr += 0x100000)
{
-// grub_printf("trying to claim %d bytes at 0x%x\n",file_size,found_addr);
if (grub_claimmap (found_addr , file_size) != -1)
break;
}
-// grub_printf("Claimed %d bytes at 0x%x\n",file_size,found_addr);
file->data = (void *) found_addr;
-// grub_printf("file->data = 0x%x\n",(int)file->data);
-// grub_printf("file_size = %d\n",file_size);
-// grub_printf("OPEN\n");
+
grub_netbuff_clear(pack);
grub_netbuff_reserve (pack,80*1024);
app_interface->app_prot->open (NULL,stack,pack,(char *) name);
- do {
- //if (app_interface->app_prot->recv (NULL,stack,pack) == GRUB_ERR_NONE)
-// grub_printf("RECEIVE PACKET\n");
+ do
+ {
grub_netbuff_clear(pack);
grub_netbuff_reserve (pack,80*1024);
app_interface->app_prot->recv (NULL,stack,pack);
if (grub_errno != GRUB_ERR_NONE)
- return grub_errno;
-// grub_printf("RECEIVED PACKET\n");
- // {
-// grub_printf("payload_size= %d\n",pack->tail - pack->data);
-// grub_printf("amount= %d\n",amount);
-// grub_printf("file_size= %d\n",file_size);
- datap = (char *)file->data + amount;
- amount += (pack->tail - pack->data);
-// grub_printf("datap = 0x%x\n",(int)datap );
- grub_memcpy(datap, pack->data, pack->tail - pack->data);
-// grub_printf("SEND ACK\n");
-
+ goto error;
+ if ((pack->tail - pack->data))
+ {
+ // file->data = grub_realloc(file->data,amount + pack->tail - pack->data);
+ datap = (char *)file->data + amount;
+ amount += (pack->tail - pack->data);
+ grub_memcpy(datap , pack->data, pack->tail - pack->data);
+ }
grub_netbuff_clear(pack);
grub_netbuff_reserve (pack,80*1024);
app_interface->app_prot->send_ack (NULL,stack,pack);
if (grub_errno != GRUB_ERR_NONE)
- return grub_errno;
-
-// grub_printf("SENT ACK\n");
- //}
- // file->data = grub_realloc(file->data,amount);
+ goto error;
}while (amount < file_size);
-// grub_printf("transfer complete\n");
- file->size = file_size;
-
-// grub_netbuff_free(pack);
- /*Start ARP header*/
- // arp.arpr.hwtype = 0x1; /* hardware type (must be ARPHRD_ETHER) */
- // arp.arpr.protocol = 0x0800; /* protocol type (must be ETH_P_IP) */
- // arp.arpr.hwlen = 0x6; /* hardware address length (must be 6) */
- // arp.arpr.protolen = 0x4; /* protocol address length (must be 4) */
- // arp.arpr.opcode = 0x1; /* ARP opcode */
-
-
- /*arp.arpr.shwaddr[0] =0x0a ;
- arp.arpr.shwaddr[1] =0x11 ;
- arp.arpr.shwaddr[2] =0xbd ;
- arp.arpr.shwaddr[3] =0xe3 ;
- arp.arpr.shwaddr[4] =0xe3 ;
- arp.arpr.shwaddr[5] =0x04 ;
- arp.arpr.sipaddr = dhcp_pckt -> yiaddr; */ /* sender's IP address */
- /*arp.arpr.thwaddr[0] =0;
- arp.arpr.thwaddr[1] =0;
- arp.arpr.thwaddr[2] =0;
- arp.arpr.thwaddr[3] =0;
- arp.arpr.thwaddr[4] =0;
- arp.arpr.thwaddr[5] =0;
- arp.arpr.tipaddr = dhcp_pckt -> siaddr; */ /* target's IP address */
- /*END ARP header */
+ file->size = file_size;
+
+ error:
+ grub_netbuff_free(pack);
return grub_errno;
}
#define UDP_PCKT 0x11
#define IP_PCKT 0x0800
+#define TIMEOUT_TIME_MS 3*1000
typedef enum
{
GRUB_NET_TFTP_ID,
#include <grub/net/netbuff.h>
#include <grub/net/interface.h>
#include <grub/net.h>
+#include <grub/time.h>
static grub_err_t
send_ethernet_packet (struct grub_net_network_layer_interface *inf __attribute__ ((unused)),
struct grub_net_network_link_interface *net_link_inf __attribute__ ((unused)) ,struct grub_net_buff *nb)
{
struct etherhdr *eth;
+ grub_uint64_t start_time, current_time;
+ start_time = grub_get_time_ms();
while (1)
{
get_card_packet (nb);
grub_netbuff_pull(nb,sizeof(*eth));
return 0;
}
+ current_time = grub_get_time_ms();
+ if (current_time - start_time > TIMEOUT_TIME_MS)
+ return grub_error (GRUB_ERR_TIMEOUT, "Time out.");
}
/* - get ethernet header
- verify if the next layer is the desired one.
{
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;
}
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)
{
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);
break;
case 0x86DD:
- grub_printf("!!!!!!!!!!!!!!!!!IPV6 packet received!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
grub_ieee1275_read (handle,datap,sizeof (*ip6h),&actual);
ip6h = (struct ip6hdr *) datap;
- grub_printf("ip6hdr->payload_len = %x\n",ip6h->payload_len);
- grub_printf("ip6hdr->nexthdr = %x\n",ip6h->nexthdr);
datap += sizeof(*ip6h);
grub_ieee1275_read (handle,datap,ip6h->payload_len - sizeof (*ip6h),&actual);
#include <grub/net.h>
#include <grub/net/netbuff.h>
#include <grub/mm.h>
+#include <grub/time.h>
struct grub_net_protocol *grub_ipv4_prot;
{
struct iphdr *iph;
+ grub_uint64_t start_time, current_time;
+ start_time = grub_get_time_ms();
while (1)
{
trans_net_inf->inner_layer->link_prot->recv(inf,trans_net_inf->inner_layer,nb);
grub_netbuff_pull(nb,sizeof(*iph));
return 0;
}
+
+ current_time = grub_get_time_ms();
+ if (current_time - start_time > TIMEOUT_TIME_MS)
+ return grub_error (GRUB_ERR_TIMEOUT, "Time out.");
}
/* grub_printf("ip.src 0x%x\n",iph->src);
grub_printf("ip.dst 0x%x\n",iph->dest);
grub_err_t grub_netbuff_push (struct grub_net_buff *net_buff ,grub_size_t len)
{
net_buff->data -= len;
-/* grub_printf("push len =%d\n",len);
- grub_printf("pack->head =%x\n",(unsigned int)net_buff->head);
- grub_printf("pack->data =%x\n",(unsigned int)net_buff->data);
- grub_printf("pack->tail =%x\n",(unsigned int)net_buff->tail);
- grub_printf("pack->end =%x\n",(unsigned int)net_buff->end);*/
if (net_buff->data < net_buff->head)
return grub_error (GRUB_ERR_OUT_OF_RANGE, "push out of the packet range.");
return GRUB_ERR_NONE;
grub_err_t grub_netbuff_free (struct grub_net_buff *net_buff)
{
- grub_free (net_buff);
+ grub_free (net_buff->head);
return 0;
}
grub_netbuff_push (nb,sizeof (*tftph));
udp_interf = (struct udp_interf *) app_interface->data;
- udp_interf->src = TFTP_CLIENT_PORT + rrq_count++;
+ udp_interf->src = TFTP_CLIENT_PORT;// + rrq_count++;
udp_interf->dst = TFTP_SERVER_PORT;
tftph = (struct tftphdr *) nb->data;
app_interface->trans_prot->send (inf,protstack->interface,nb);
/*Receive OACK*/
+ grub_netbuff_clear (nb);
+ grub_netbuff_reserve (nb,80*1024);
return app_interface->app_prot->recv(inf,protstack,nb);
}
{
tftp_open (inf, protocol_stack,nb, filename);
+ grub_netbuff_clear (nb);
+ grub_netbuff_reserve (nb,80*1024);
tftp_send_err (inf, protocol_stack,nb,"Abort transference.",0);
return tftp_file.size;
#include <grub/net/netbuff.h>
#include <grub/net/protocol.h>
#include <grub/net/interface.h>
+#include <grub/time.h>
static grub_err_t
send_udp_packet (struct grub_net_network_layer_interface *inf,
struct udphdr *udph;
struct udp_interf *udp_interf;
udp_interf = (struct udp_interf *) app_trans_inf->data;
-
+ grub_uint64_t start_time, current_time;
+ start_time = grub_get_time_ms();
while(1)
{
app_trans_inf->inner_layer->net_prot->recv(inf,app_trans_inf->inner_layer,nb);
return 0;
}
+ current_time = grub_get_time_ms();
+ if (current_time - start_time > TIMEOUT_TIME_MS)
+ return grub_error (GRUB_ERR_TIMEOUT, "Time out.");
+
}
}