Date: Fri, 27 Apr 2007 15:25:07 GMT From: Alexey Tarasov <taleks@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 118882 for review Message-ID: <200704271525.l3RFP7tA009526@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=118882 Change 118882 by taleks@taleks_th on 2007/04/27 15:24:14 Updated to be more style compliant Affected files ... .. //depot/projects/soc2007/taleks-pxe_http/pxe_conv.c#2 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_conv.h#2 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_core.c#4 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_core.h#4 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_http.c#2 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_icmp.c#3 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_icmp.h#2 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_ip.c#3 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_ip.h#2 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_mem.c#2 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_mem.h#2 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_mutex.c#2 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_mutex.h#2 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_sock.c#2 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_sock.h#2 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_tcp.h#2 edit Differences ... ==== //depot/projects/soc2007/taleks-pxe_http/pxe_conv.c#2 (text+ko) ==== @@ -1,18 +1,20 @@ #include "pxe_conv.h" +inline uint32_t +le2be32(uint32_t x) +{ - -inline uint32_t le2be32(uint32_t x) { - - return ((0x000000ff & x) << 24) | - ((0x0000ff00 & x) << 8) | - ((0x00ff0000 & x) >> 8) | - ((0xff000000 & x) >> 24 ); + return ((0x000000ff & x) << 24)| + ((0x0000ff00 & x) << 8) | + ((0x00ff0000 & x) >> 8) | + ((0xff000000 & x) >> 24 ); } -inline uint16_t le2be16(uint16_t x) { +inline uint16_t +le2be16(uint16_t x) +{ - return ((0x00ff & x) << 8) | - ((0xff00 & x) >> 8); + return ((0x00ff & x) << 8) | + ((0xff00 & x) >> 8); } ==== //depot/projects/soc2007/taleks-pxe_http/pxe_conv.h#2 (text+ko) ==== @@ -4,19 +4,17 @@ #include <stdint.h> /* - here I'm assumming PXE code is started on x86 arch, - so host machine arch uses little endian byte order -*/ + * here I'm assumming PXE code is started on x86 arch, + * so host machine arch uses little endian byte order + */ -/* change order for 32bit unsigned int*/ +/* change order for 32bit unsigned int */ uint32_t le2be32(uint32_t x); -/* change order for 16bit unsigned int*/ +/* change order for 16bit unsigned int */ uint16_t le2be16(uint16_t x); -/* - in fact the same functions -*/ +/* in fact the same functions */ #define be2le32 le2be32 #define be2le16 le2be16 ==== //depot/projects/soc2007/taleks-pxe_http/pxe_core.c#4 (text+ko) ==== @@ -1,84 +1,86 @@ #include <stand.h> #include <string.h> -#include "pxe_core.h" -#include "pxe_mem.h" -#include "pxe_ip.h" -#include "pxe_mutex.h" #include "btxv86.h" #include "pxe.h" +#include "pxe_core.h" +#include "pxe_ip.h" +#include "pxe_mem.h" +#include "pxe_mutex.h" /* PXE API calls here will be made in same way as in pxeboot. - the only difference - installation of isr, that was not needed in pxe.c. - main problem is that, v86 monitors reflects interrupts, - we need to change IDT, for correct irq and call pxe_core_isr() from it. -*/ + * the only difference - installation of isr, that was not needed in pxe.c. + * main problem is that, v86 monitors reflects interrupts, + * we need to change IDT, for correct irq and call pxe_core_isr() from it. + */ /* NOTE: to think about using of this buffers */ #define PXE_BUFFER_SIZE 0x2000 #define PXE_TFTP_BUFFER_SIZE 512 static char scratch_buffer[PXE_BUFFER_SIZE]; static char data_buffer[PXE_BUFFER_SIZE]; -static pxenv_t *pxenv_p = NULL; /* PXENV+ */ -static pxe_t *pxe_p = NULL; /* !PXE */ -static BOOTPLAYER bootplayer; /* PXE Cached information. */ +static pxenv_t *pxenv_p = NULL; /* PXENV+ */ +static pxe_t *pxe_p = NULL; /* !PXE */ +static BOOTPLAYER bootplayer; /* PXE Cached information. */ /* defined in pxetramp.s */ -extern u_int16_t __bangpxeseg; -extern u_int16_t __bangpxeoff; -extern void __bangpxeentry(void); -extern u_int16_t __pxenvseg; -extern u_int16_t __pxenvoff; -extern void __pxenventry(void); +extern uint16_t __bangpxeseg; +extern uint16_t __bangpxeoff; +extern void __bangpxeentry(void); +extern uint16_t __pxenvseg; +extern uint16_t __pxenvoff; +extern void __pxenventry(void); -/**/ -pxe_packet core_packets[PXE_MAX_PACKETS]; -pxe_protocol_call core_protocol[256]; -pxe_mutex core_mutex={0,0}; +/* pxe core structures*/ +pxe_packet core_packets[PXE_MAX_PACKETS]; /* buffered packets */ +pxe_protocol_call core_protocol[256]; /* protocol's callback fuctions */ +pxe_mutex core_mutex = {0, 0}; /* mutex used in packet allocation */ /* NIC info */ -pxe_ipaddr nic_ip={0}; +pxe_ipaddr nic_ip = {0}; -uint32_t packets_dropped=0; -uint32_t packets_sent=0; -uint32_t packets_received=0; +/* core packet statistics */ +uint32_t packets_dropped = 0; +uint32_t packets_sent = 0; +uint32_t packets_received = 0; -int pxe_core_init() { +int +pxe_core_init() +{ +/* int i = 1; /* packet index during initialization loop */ + int counter = 0; + uint8_t checksum = 0; + uint8_t *checkptr = NULL; -/* int i=1; /* packet index during initialization loop */ - int counter=0; - uint8_t checksum=0; - uint8_t *checkptr=NULL; - t_PXENV_GET_CACHED_INFO *gci_p=NULL; + t_PXENV_GET_CACHED_INFO *gci_p = NULL; - pxe_memset(core_packets, 0, sizeof(core_packets)); - pxe_memset(core_protocol, 0, sizeof(core_protocol)); - nic_ip.ip=0; + pxe_memset(core_packets, 0, sizeof(core_packets)); + pxe_memset(core_protocol, 0, sizeof(core_protocol)); + nic_ip.ip = 0; - /* creating 2-linked list of packets */ -/* for (; i<PXE_MAX_PACKETS; ++i) { - core_packets[i].prev=&core_packets[i-1]; - core_packets[i-1].next=&core_packets[i]; - } + /* creating 2-linked list of packets */ +/* for (; i < PXE_MAX_PACKETS; ++i) { + core_packets[i].prev = &core_packets[i-1]; + core_packets[i-1].next = &core_packets[i]; + } */ - /* 1. determine PXE API entry point */ + /* 1. determine PXE API entry point */ - /* - pxe_env is originally is got by pxe_enable() call from - void - pxe_enable(void *pxeinfo) { - pxenv_p = (pxenv_t *)pxeinfo; - pxe_p = (pxe_t *)PTOV(pxenv_p->PXEPtr.segment * 16 + - pxenv_p->PXEPtr.offset); - pxe_call = NULL; - } - - in my case, I must decide how to get this. May be it's best way - to use same mechanism. or, if I'll not use BTX code, it'll be - provided other way. So a plenty of things to think. - - */ + /* + * pxe_env is originally is got by pxe_enable() call from + * void + * pxe_enable(void *pxeinfo) { + * pxenv_p = (pxenv_t *)pxeinfo; + * pxe_p = (pxe_t *)PTOV(pxenv_p->PXEPtr.segment * 16 + + * pxenv_p->PXEPtr.offset); + * pxe_call = NULL; + * } + * + * in my case, I must decide how to get this. May be it's best way + * to use same mechanism. or, if I'll not use BTX code, it'll be + * provided other way. So a plenty of things to think. + */ if(pxenv_p == NULL) return (0); @@ -114,7 +116,6 @@ * PXENV+ passed, so use that if !PXE is not available or * the checksum fails. */ - pxe_call = pxenv_call; if (pxenv_p->Version >= 0x0200) { for (;;) { if (bcmp((void *)pxe_p->Signature, S_SIZE("!PXE"))) { @@ -130,7 +131,7 @@ pxe_p = NULL; break; } - pxe_call = bangpxe_call; +/* pxe_call = bangpxe_call;*/ break; } } @@ -149,7 +150,7 @@ */ gci_p = (t_PXENV_GET_CACHED_INFO *) scratch_buffer; bzero(gci_p, sizeof(*gci_p)); - gci_p->PacketType = PXENV_PACKET_TYPE_BINL_REPLY; + gci_p->PacketType = PXENV_PACKET_TYPE_BINL_REPLY; pxe_core_call(PXENV_GET_CACHED_INFO); @@ -162,53 +163,63 @@ bcopy(PTOV((gci_p->Buffer.segment << 4) + gci_p->Buffer.offset), &bootplayer, gci_p->BufferSize); - /* 2. install isr */ - pxe_core_install_isr(); + /* 2. install isr */ + pxe_core_install_isr(); - /* 3. additional start UNDI */ + /* 3. additional start UNDI */ - return 1; + return (1); } -void pxe_core_install_isr() { +void +pxe_core_install_isr() +{ + } -void pxe_core_remove_isr() { +void +pxe_core_remove_isr() +{ + } -int pxe_core_shutdown() { +int +pxe_core_shutdown() +{ + int i = 1; - int i=1; + for (; i < PXE_MAX_PACKETS; ++i) { - for (; i<PXE_MAX_PACKETS; ++i) { + if (core_packets[i].data) + pxe_free(core_packets[i].data); + } - if (core_packets[i].data) - pxe_free(core_packets[i].data); - } + /* 1. uninstall isr */ + pxe_core_remove_isr(); - /* 1. uninstall isr */ - pxe_core_remove_isr(); - - /* 2. shutdown PXE */ + /* 2. shutdown PXE */ t_PXENV_UNLOAD_STACK *unload_stack_p = (t_PXENV_UNLOAD_STACK *)scratch_buffer; + t_PXENV_UNDI_SHUTDOWN *undi_shutdown_p = (t_PXENV_UNDI_SHUTDOWN *)scratch_buffer; pxe_core_call(PXENV_UNDI_SHUTDOWN); pxe_core_call(PXENV_UNLOAD_STACK); - return 1; + return (1); } /* - function code is taken from bangpxe_call(), /sys/boot/libi386/pxe.c - needs pxetramp.s wrapper and vm86int() support. - I'll see later , may be it's simplier to do own v86 monitor, - than using provided with BTX. -*/ -void pxe_core_call(int func) { + * function code is taken from bangpxe_call(), /sys/boot/libi386/pxe.c + * needs pxetramp.s wrapper and vm86int() support. + * I'll see later , may be it's simplier to do own v86 monitor, + * than using provided with BTX. + */ +void +pxe_core_call(int func) +{ bzero(&v86, sizeof(v86)); bzero(data_buffer, sizeof(data_buffer)); @@ -225,211 +236,226 @@ v86.ctl = V86_FLAGS; } -int pxe_core_transmit(pxe_packet* pack) { +int +pxe_core_transmit(pxe_packet *pack) +{ - /* UNDI transmit ip packet call*/ + /* UNDI transmit ip packet call*/ - return 0; + return (0); } /* flushes pending, aborted, wrong and etc packets */ -int pxe_core_flush_packets() { +int +pxe_core_flush_packets() +{ + int i = 0; - int i=0; + for (; i < PXE_MAX_PACKETS; ++i) { + pxe_ip *iphdr=(pxe_ip *)(core_packets[i].data); - for (; i<PXE_MAX_PACKETS; ++i) { + if (iphdr == NULL) { /* dummy packet */ + continue; + } - pxe_ip* iphdr=(pxe_ip*)(core_packets[i].data); + if (core_protocol[iphdr->protocol]) { /* protocol registered */ + core_protocol[iphdr->protocol](&core_packets[i], + PXE_CORE_CHECK, NULL); + } + } - if (!iphdr) { /* dummy packet */ + return (1); +} - continue; - } +void +pxe_core_isr() +{ + int buffer_size = 0; /* total size of packet*/ + int protocol = 0; /* protocol */ + int recieved = 0; /* bytes received to buffer */ - if (core_protocol[iphdr->protocol]) { /* protocol registered */ + void *frame_data = NULL;/* pointer to frame data */ + int frame_size = 0; /* size of frame */ - core_protocol[iphdr->protocol](&core_packets[i], PXE_CORE_CHECK, NULL); - } - } + pxe_packet *pack=NULL; /* allocated packet */ + pxe_packet dummy_pack; /* temporary struct, used to mimic + * real packet struct + */ - return 1; -} + /* + * TODO: UNDI get buffer size & etc + */ -void pxe_core_isr() { - /* - TODO: UNDI get buffer size & etc - */ + /* we are yet not interested in non-ip packets */ - int buffer_size=0; /* total size of packet*/ - int protocol=0; /* protocol */ - int recieved=0; /* bytes received to buffer */ + if (protocol != PXE_PROTOCOL_IP) { + ++packets_dropped; + return; + } - void* frame_data=NULL;/* pointer to frame data */ - int frame_size=0; /* size of frame */ - - pxe_packet* pack=NULL; /* allocated packet */ - pxe_packet dummy_pack; /* temporary struct, used to mimic real packet struct*/ - - /* we are yet not interested in non-ip packets */ + /* checking first fragment, this may help to avoid memory allocation + * and memblock copy + */ - if (protocol!=PXE_PROTOCOL_IP) { - ++packets_dropped; - return; - } - - /* checking first fragment, this may help to avoid memory allocation and memblock copy */ /* if (buffer_size==frame_size) { - pxe_ip* iphdr=(pxe_ip*)frame_data; + pxe_ip *iphdr = (pxe_ip *)frame_data; - dummy_pack.protocol=protocol; - dummy_pack.state=PXE_PACKET_STATE_USING; - dummy_pack.data=frame_data; - dummy_pack.data_size=frame_size; - dummy_pack.user_data=NULL; + dummy_pack.protocol = protocol; + dummy_pack.state = PXE_PACKET_STATE_USING; + dummy_pack.data = frame_data; + dummy_pack.data_size = frame_size; + dummy_pack.user_data = NULL; /* TODO: calc ip checksum / if (core_protocol[iphdr->protocol]) { - - if (core_protocol[iphdr->protocol](&dummy_pack, PXE_CORE_FRAG, NULL)) { - return; - } - - } + if (core_protocol[iphdr->protocol](&dummy_pack, PXE_CORE_FRAG, + NULL)) { + return; + } + } */ - pack=pxe_core_alloc_packet(buffer_size); + pack = pxe_core_alloc_packet(buffer_size); - if (!pack) { + if (pack == NULL) { + pxe_core_flush_packets(); - pxe_core_flush_packets(); + /* trying to get free packets by sending and dropping */ + pack = pxe_core_alloc_packet(buffer_size); - /* trying to get free packets by sending and dropping */ - pack=pxe_core_alloc_packet(buffer_size); + /* failed to alloc packet, dropping packet */ + if (pack == NULL) { + ++packets_dropped; + return; + } + } - if (!pack) { /* failed to alloc packet, dropping packet */ - ++packets_dropped; - return; - } - } + /* pointing user_data to beginning of data. + * It's used by pxe_core_receive() during receiving packet. + */ + pack->user_data = pack->data; + while (recieved < buffer_size) { + /* + * UNDI get frame + */ - /* pointing user_data to beginning of data. - It's used by pxe_core_receive() during receiving packet. - */ - pack->user_data=pack->data; + frame_size=0; - while (recieved<buffer_size) { + pxe_core_recieve(pack, frame_data, frame_size); - /* - UNDI get frame - */ - frame_size=0; + recieved += frame_size; + } - pxe_core_recieve(pack, frame_data, frame_size); + pack->user_data = NULL; + ++packets_received; - recieved+=frame_size; - } + pxe_ip *iphdr=(pxe_ip *)pack->data; - pack->user_data=NULL; - ++packets_received; + /* TODO: calc ip checksum */ + pack->protocol = protocol; - pxe_ip* iphdr=(pxe_ip*)pack->data; + if (core_protocol[iphdr->protocol]) { /* protocol registered */ + if (core_protocol[iphdr->protocol](pack, PXE_CORE_HANDLE, + NULL)) { + return; + } + } - /* TODO: calc ip checksum */ - pack->protocol=protocol; - - if (core_protocol[iphdr->protocol]) { /* protocol registered */ - - if (core_protocol[iphdr->protocol](pack, PXE_CORE_HANDLE, NULL)) { - return; - } - } - - /* no such protocol registered or protocol not interested in it */ - pxe_core_drop(pack); + /* no such protocol registered or protocol not interested in it */ + pxe_core_drop(pack); } /* - recieves in packet data -*/ -int pxe_core_recieve(pxe_packet* pack, void* frame_data, size_t frame_size) { + * recieves in packet data + */ +int +pxe_core_recieve(pxe_packet *pack, void *frame_data, size_t frame_size) +{ - /* check to be sure */ - if (pack->user_data==NULL) - pack->user_data=pack->data; + /* check to be sure */ + if (pack->user_data == NULL) + pack->user_data = pack->data; - /* sanity check */ - if ( (pack->user_data-pack->data) +frame_size > pack->data_size) - return 0; /* This must not ever be*/ + /* sanity check */ + if ( (pack->user_data - pack->data) + frame_size > pack->data_size) + return (0); /* This must not ever be*/ - pxe_memcpy(pack->user_data, frame_data, frame_size); + pxe_memcpy(pack->user_data, frame_data, frame_size); - return 1; + return (1); } /* - allocates packet, creates buffer for data if necessary -*/ -pxe_packet* pxe_core_alloc_packet(size_t packet_size) { + * allocates packet, creates buffer for data if necessary + */ +pxe_packet * +pxe_core_alloc_packet(size_t packet_size) +{ + int i = 1; /* packet index */ - int i=1; /* packet index */ + pxe_mutex_own(&core_mutex, PXE_OWNER_CORE); - pxe_mutex_own(&core_mutex, PXE_OWNER_CORE); + /* searching free packets structures */ + for (; i < PXE_MAX_PACKETS; ++i) { + if (core_packets[i].state == PXE_PACKET_STATE_FREE) { + /* packet structure seems to be free */ + /* mark it busy */ + core_packets[i].state = PXE_PACKET_STATE_USING; - /* searching free packets structures */ - for (; i<PXE_MAX_PACKETS; ++i) { + if (core_packets[i].data_size < packet_size) { + /* packet contains less memmory than needed */ + void *data = pxe_alloc(packet_size); + pxe_free(core_packets[i].data); + core_packets[i].data = data; - if (core_packets[i].state==PXE_PACKET_STATE_FREE) { /* packet structure seems to be free */ + /* failed to allocate enough memory for packet */ + if (data == NULL) { + core_packets[i].data_size = 0; + return (NULL); + } - core_packets[i].state=PXE_PACKET_STATE_USING; /* mark it busy */ + core_packets[i].data_size = packet_size; + } - if (core_packets[i].data_size<packet_size) { /* packet contains less memmory than needed */ + pxe_mutex_free(&core_mutex, PXE_OWNER_CORE); + return &core_packets[i]; + } + } - pxe_free(core_packets[i].data); - - void* data=pxe_alloc(packet_size); - core_packets[i].data=data; - - if (!data) { /* failed to allocate enough memory for packet */ - core_packets[i].data_size=0; - return NULL; - } - - core_packets[i].data_size=packet_size; - } - - pxe_mutex_free(&core_mutex, PXE_OWNER_CORE); - return &core_packets[i]; - } - - } - - pxe_mutex_free(&core_mutex, PXE_OWNER_CORE); - return NULL; + pxe_mutex_free(&core_mutex, PXE_OWNER_CORE); + return (NULL); } /* - drops choosed packet -*/ -void pxe_core_drop(pxe_packet* pack) { + * drops choosed packet + */ +void +pxe_core_drop(pxe_packet *pack) +{ - pxe_mutex_own(&core_mutex, PXE_OWNER_CORE); - pack->state=PXE_PACKET_STATE_FREE; - ++packets_dropped; - pxe_mutex_free(&core_mutex, PXE_OWNER_CORE); + pxe_mutex_own(&core_mutex, PXE_OWNER_CORE); + pack->state = PXE_PACKET_STATE_FREE; + ++packets_dropped; + pxe_mutex_free(&core_mutex, PXE_OWNER_CORE); } + /* - registers protocol in protocols table -*/ -void pxe_core_register(uint8_t proto, pxe_protocol_call proc) { + * registers protocol in protocols table + */ +void +pxe_core_register(uint8_t proto, pxe_protocol_call proc) +{ core_protocol[proto]=proc; } -uint32_t pxe_get_myip32() { +uint32_t +pxe_get_myip32() +{ return nic_ip.ip; } ==== //depot/projects/soc2007/taleks-pxe_http/pxe_core.h#4 (text+ko) ==== @@ -9,36 +9,37 @@ */ /* - contains wrappers for UNDI functions -*/ + * contains wrappers for UNDI functions + */ -#define PXE_MAX_PACKETS 32 +#define PXE_MAX_PACKETS 32 -#define PXE_PACKET_STATE_FREE 0 -#define PXE_PACKET_STATE_USING 1 -#define PXE_PACKET_STATE_RECIEVED 2 -#define PXE_PACKET_STATE_SENT 3 -#define PXE_PACKET_STATE_PENDING 4 -#define PXE_PACKET_STATE_ABORTED 5 +#define PXE_PACKET_STATE_FREE 0 +#define PXE_PACKET_STATE_USING 1 +#define PXE_PACKET_STATE_RECIEVED 2 +#define PXE_PACKET_STATE_SENT 3 +#define PXE_PACKET_STATE_PENDING 4 +#define PXE_PACKET_STATE_ABORTED 5 /* - structure, used in queueing packets in pxe_core + * structure, used in queueing packets in pxe_core */ -typedef struct { +typedef struct pxe_packet { /* pxe_packet* next; /* NOT IMPLEMENTED: two-linked list */ /* pxe_packet* prev; /* NOT IMPLEMENTED: two-linked list */ - uint8_t protocol; /* protocol, used in packet */ uint8_t state; /* state of packet (PXE_PACKET_STATE_ ... ) */ - void* data; /* pointer to buffer with packet data*/ + void* data; /* pointer to buffer with packet data */ size_t data_size; /* size of packet data */ - void* user_data; /* pointer to user data. used by higher level protocols */ -} pxe_packet; + void* user_data; /* pointer to user data. + * used by higher level protocols + */ +} PXE_PACKET; #define PXE_PROTOCOL_UNKNOWN 0 #define PXE_PROTOCOL_IP 1 @@ -53,19 +54,19 @@ int pxe_core_shutdown(); /* sends packet to a network */ -int pxe_core_transmit(pxe_packet* pack); +int pxe_core_transmit(pxe_packet *pack); /* commits that packet will not be used */ -void pxe_core_commit(pxe_packet* pack); +void pxe_core_commit(pxe_packet *pack); /* allocates buffer for packet */ -pxe_packet* pxe_core_alloc_packet(size_t packet_size); +pxe_packet *pxe_core_alloc_packet(size_t packet_size); /* interrupt handler function, that used to get new packets */ void pxe_core_isr(); /* calls PXE/UNDI API, registers of processor must be filled in with - appropriate values. + * appropriate values. */ void pxe_core_call(int func); @@ -76,10 +77,10 @@ void pxe_core_remove_isr(); /* stores data in packet */ -int pxe_core_recieve(pxe_packet* pack, void* data, size_t size); +int pxe_core_recieve(pxe_packet *pack, void *data, size_t size); /* drops allocated packet, updates drop count */ -void pxe_core_drop(pxe_packet* pack); +void pxe_core_drop(pxe_packet *pack); /* debug function that shows different information about usage */ void pxe_core_stats(); @@ -87,7 +88,8 @@ #define PXE_CORE_HANDLE 0x0 #define PXE_CORE_CHECK 0x1 #define PXE_CORE_FRAG 0x2 -typedef int (*pxe_protocol_call)(pxe_packet* pack, uint8_t function, void* data); +typedef int (*pxe_protocol_call)(pxe_packet *pack, uint8_t function, void *data); + /* registers protocol */ void pxe_core_register(uint8_t proto, pxe_protocol_call proc); ==== //depot/projects/soc2007/taleks-pxe_http/pxe_http.c#2 (text+ko) ==== @@ -1,20 +1,21 @@ #include <stand.h> + #include "pxe_core.h" +#include "pxe_icmp.h" #include "pxe_ip.h" -#include "pxe_icmp.h" -int pxe_test_main() { +int +pxe_test_main() +{ + pxe_ipaddr ip; + ip.ip=0xC0A80001; printf("pxe icmp dummy test.\n"); pxe_core_init(); pxe_icmp_init(); - pxe_ipaddr ip; - - ip.ip=0xC0A80001; - pxe_ping(&ip, 0); - return 0; + return (0); } ==== //depot/projects/soc2007/taleks-pxe_http/pxe_icmp.c#3 (text+ko) ==== @@ -1,164 +1,176 @@ #include <stand.h> + +#include "pxe_conv.h" +#include "pxe_core.h" +#include "pxe_icmp.h" #include "pxe_ip.h" -#include "pxe_icmp.h" -#include "pxe_core.h" -#include "pxe_conv.h" + /* used in echo replying */ -static pinging=0; +static pinging = 0; -int pxe_icmp_callback(pxe_packet* pack, uint8_t function, void* data) { +int +pxe_icmp_callback(pxe_packet *pack, uint8_t function, void *data) +{ + /* we don't store icmp packets, so they cannot steal memory + * in pxe core packet table + */ - if (function==PXE_CORE_CHECK) { - /* we don't store icmp packets, so they cannot steal memory - in pxe core packet table */ - return 0; - } + if (function == PXE_CORE_CHECK) { + return (0); + } - /* PXE_CORE_HANDLE - to handle packet - PXE_CORE_FRAG - to handle fragment of packet, may be useful for fast - dropping of invalid packet. - */ + /* PXE_CORE_HANDLE - to handle packet + * PXE_CORE_FRAG - to handle fragment of packet, may be useful + * for fast dropping of invalid packet. + */ + /* icmp header*/ + pxe_ip *iphdr = pack->data; + size_t iphdr_len = (iphdr->ver_ihl & 0x0f) * 4; + size_t data_size = iphdr->length - iphdr_len - sizeof(pxe_ip); + pxe_icmp *icmphdr = pack->data + sizeof(pxe_ip) + iphdr_len; - /* icmp header*/ - pxe_ip* iphdr=pack->data; - size_t iphdr_len=(iphdr->ver_ihl & 0x0f)*4; - size_t data_size=iphdr->length-iphdr_len-sizeof(pxe_ip); - pxe_icmp* icmphdr=pack->data+sizeof(pxe_ip)+iphdr_len; + /* TODO: verify checksum */ - /* TODO: verify checksum */ + /* reply */ + pxe_packet *pack_out = NULL; + pxe_ip *reply_iphdr = NULL; + pxe_icmp *reply_icmphdr = NULL; + size_t reply_size = sizeof(pxe_ip) + sizeof(pxe_icmp) + data_size; - /* reply */ - pxe_packet* pack_out=NULL; - pxe_ip* reply_iphdr=NULL; - pxe_icmp* reply_icmphdr=NULL; - size_t reply_size=sizeof(pxe_ip)+sizeof(pxe_icmp)+data_size; - - /* we are interested only in echo related packets*/ - switch(icmphdr->code) { - case PXE_ICMP_ECHO_REQUEST: - case PXE_ICMP_ECHO_REPLY: - /* case PXE_ICMP_DEST_UNREACHABLE: - case PXE_ICMP_REDIRECT_MESSAGE: + /* we are interested only in echo related packets*/ + switch(icmphdr->code) { + case PXE_ICMP_ECHO_REQUEST: + case PXE_ICMP_ECHO_REPLY: + /* case PXE_ICMP_DEST_UNREACHABLE: + case PXE_ICMP_REDIRECT_MESSAGE: */ - break; + break; + default: + return (0); /* instruct pxe core to drop packet*/ + }; - default: - return 0; /* instruct pxe core to drop packet*/ - }; + if (icmphdr->code == PXE_ICMP_ECHO_REPLY) { + if (pinging == be2le32(iphdr->src_ip)) + printf("\necho reply from %x, seq=%ld.", + iphdr->src_ip, icmphdr->seq_num); + else /* we are not interested in this reply*/ + printf("\nlame echo reply from %x, seq=%ld.", + iphdr->src_ip, icmphdr->seq_num); + return (0); + } + /* all we need now is echo reply */ - if (icmphdr->code==PXE_ICMP_ECHO_REPLY) { + pxe_packet* pack_out = pxe_core_alloc_packet(reply_size); - if (pinging==be2le32(iphdr->src_ip)) - printf("\necho reply from %x, seq=%ld.", iphdr->src_ip, icmphdr->seq_num); - else /* we are not interested in this reply*/ - printf("\nlame echo reply from %x, seq=%ld.", iphdr->src_ip, icmphdr->seq_num); - return 0; - } - /* all we need now is echo reply */ - pxe_packet* pack_out=pxe_core_alloc_packet(reply_size); + if (pack == NULL) { + /* TO THINK: failed to allocate packet, + * may be it's better to use + * statically allocated packet. + */ + return 0; + } - if (!pack) { /* TO THINK: failed to allocate packet, - may be it's better to use - statically allocated packet. */ + reply_iphdr = (pxe_ip *)pack_out->data; + reply_icmphdr = (pxe_icmp *)(reply_iphdr + 1); - return 0; - } + reply_icmphdr->type = PXE_ICMP_ECHO_REPLY; - reply_iphdr=(pxe_ip*)pack_out->data; - reply_icmphdr=(pxe_icmp*)(reply_iphdr+1); + /* copying same values */ + reply_icmphdr->code = icmphdr->code; + reply_icmphdr->seq_num = icmphdr->seq_num; + reply_icmphdr->packet_id = icmphdr->reply_icmphdr; + reply_icmphdr->checksum = 0; + reply_icmphdr->checksum = + ~(le2be16(pxe_ip_checksum(reply_icmphdr, sizeof(pxe_icmp)))); - reply_icmphdr->type=PXE_ICMP_ECHO_REPLY; + pxe_ip_hdr(pack_out->data, iphdr->src_ip, 0x01, reply_size, 0); - /* copying same values */ + /* copying all data from request packet to reply packet, + * starting after headers + */ + pxe_memcpy(reply_icmphdr + 1, pack->data + iphdr_len + sizeof(pxe_icmp), + data_size); - reply_icmphdr->code=icmphdr->code; >>> TRUNCATED FOR MAIL (1000 lines) <<<
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200704271525.l3RFP7tA009526>