Date: Mon, 9 Jul 2007 16:26:05 GMT From: Alexey Tarasov <taleks@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 123209 for review Message-ID: <200707091626.l69GQ5JR067632@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=123209 Change 123209 by taleks@taleks_th on 2007/07/09 16:25:29 all: changed pxe_protocol_call definition (removed unused data parameter), removed PXE_CORE_CHECK, small fixes of text formatting. pxe_buffer: fixed error caused corruption of data pxe_connection: changes in awaiting function in order to handle LAST_ACK state and speedup connection refused detect in handshaking. pxe_dhcp: added definition for www-server option. May be will be used to get address of web-server to work with. Affected files ... .. //depot/projects/soc2007/taleks-pxe_http/pxe_arp.c#10 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_arp.h#7 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_buffer.c#5 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_buffer.h#5 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_connection.c#6 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_core.c#19 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_core.h#15 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_dhcp.c#3 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_dhcp.h#3 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_icmp.c#10 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_ip.c#10 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_sock.c#13 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_sock.h#11 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_tcp.c#8 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_udp.c#7 edit Differences ... ==== //depot/projects/soc2007/taleks-pxe_http/pxe_arp.c#10 (text+ko) ==== @@ -116,23 +116,21 @@ /* * pxe_arp_protocol() - process received arp packet, this function is called in style - * of pxe_protocol_call function type, but last two parameters are unused + * of pxe_protocol_call function type, but last parameter is unused * in: * pack - rceived packet data * function - protocal function (will be always PXE_CORE_FRAG) - * data - always NULL * out: * always 0 - we are not interested in storing this packet in pxe_core queue */ int -pxe_arp_protocol(PXE_PACKET *pack, uint8_t function, void *data) +pxe_arp_protocol(PXE_PACKET *pack, uint8_t function) { #ifdef PXE_DEBUG_HELL printf("pxe_arp_protocol() started.\n"); #endif PXE_ARP_PACK_DATA *arp_reply = (PXE_ARP_PACK_DATA *)pack->raw_data; - if (arp_reply->hdr.operation == le2be16(PXE_ARPOP_REQUEST) ) { uint8_t *mac_src = arp_reply->body.src_hwaddr; @@ -208,7 +206,6 @@ if (NULL != kmac) { #ifdef PXE_DEBUG uint8_t *octet = (uint8_t *)&arp_reply->body.src_paddr; -/* uint8_t *mac = arp_reply->body.src_hwaddr; */ printf("MAC of %d.%d.%d.%d already known: %x:%x:%x:%x:%x:%x\n", octet[0], octet[1], octet[2], octet[3], (*kmac)[0], (*kmac)[1], (*kmac)[2], (*kmac)[3], (*kmac)[4], (*kmac)[5] @@ -324,7 +321,6 @@ const MAC_ADDR * pxe_arp_ip4mac(uint32_t ip) { - const MAC_ADDR *res = pxe_arp_table_search(ip); if (res != NULL) ==== //depot/projects/soc2007/taleks-pxe_http/pxe_arp.h#7 (text+ko) ==== @@ -37,7 +37,7 @@ const MAC_ADDR *pxe_arp_ip4mac(uint32_t ip); /* protocol handler for received packets */ -int pxe_arp_protocol(PXE_PACKET *pack, uint8_t function, void *data); +int pxe_arp_protocol(PXE_PACKET *pack, uint8_t function); /* ARP table statistics */ void pxe_arp_stats(); @@ -49,7 +49,6 @@ /* protocol types */ #define PXE_PTYPE_IP 0x0800 /* IP4 protocol, used in ARP request */ - /* NOTE: here will be realised ARP for Ethernet and IP4 */ typedef struct pxe_arp_packet { uint16_t hwtype; /* hardware type */ ==== //depot/projects/soc2007/taleks-pxe_http/pxe_buffer.c#5 (text+ko) ==== @@ -23,7 +23,6 @@ return (0); /* check if possible to place without cycling */ - if (buf->fstart < buf->fend) { /* possible to place without cycling */ pxe_memcpy(from, buf->data + buf->fstart, to_write); @@ -37,23 +36,14 @@ uint16_t part2 = to_write - part1; if (part1) - pxe_memcpy(from, buf->data + buf->fstart, part1); + pxe_memcpy(from, buf->data + buf->fstart, (part1 < to_write) ? part1 : to_write); if (part1 >= to_write) { buf->fstart += to_write; - - if (buf->fstart > buf->bufsize) { - printf("pxe_buffer_write(): internal error! fstart = %d", buf->fstart); - } } else { pxe_memcpy(from + part1, buf->data, part2); buf->fstart = part2; } - -#ifdef PXE_DEBUG_HELL - printf("pxe_buffer_write(): fstart %d, fend %d, bufsize %d\n\tpart1 %d, part2 %d, to_write %d (%d)\n", - buf->fstart, buf->fend, buf->bufsize, part1, part2, to_write, size); -#endif } buf->bufleft -= to_write; @@ -87,13 +77,14 @@ uint16_t bufsize = buf->bufsize; if (fstart <= fend) { /* two cases handling: |*s...e**|, |***se***| */ + /* right part of buffer */ uint16_t part1 = bufsize - fend; /* left part of buffer */ uint16_t part2 = to_read - part1; if (part1 && (to != NULL) ) - pxe_memcpy(buf->data + fend, to, part1); + pxe_memcpy(buf->data + fend, to, (part1 < to_read) ? part1 : to_read); if (part1 >= to_read) { buf->fend += to_read; @@ -153,13 +144,17 @@ if (buffer->data == NULL) return (0); } - buffer->bufsize = size; buffer->bufleft = size; buffer->fstart = 0; buffer->fend = size; - + +#ifdef PXE_DEBUG_HELL + printf("pxe_buffer_memalloc(): buffer 0x%x, data 0x%x.\n", + buffer, buffer->data, buffer->bufleft + ); +#endif return (1); } @@ -176,7 +171,8 @@ if (buffer->data == NULL) { /* already released */ return; } -#ifdef PXE_DEBUG + +#ifdef PXE_DEBUG_HELL printf("pxe_buffer_memfree(): buffer 0x%x, data 0x%x, bufleft: %d.\n", buffer, buffer->data, buffer->bufleft ); ==== //depot/projects/soc2007/taleks-pxe_http/pxe_buffer.h#5 (text+ko) ==== ==== //depot/projects/soc2007/taleks-pxe_http/pxe_connection.c#6 (text+ko) ==== @@ -88,24 +88,28 @@ tcp_await(uint8_t function, uint16_t try_number, uint32_t timeout, void *data) { PXE_TCP_WAIT_DATA *wait_data = (PXE_TCP_WAIT_DATA *)data; + PXE_TCP_CONNECTION *conn = wait_data->connection; switch(function) { case PXE_AWAIT_NEWPACKETS: /* check current state with needed to wait for */ - { - PXE_TCP_CONNECTION *conn = wait_data->connection; - if (wait_data->state == conn->state) + + if (wait_data->state <= conn->state) return (PXE_AWAIT_COMPLETED); - /* CLOSED at waiting means connections was breaked */ + /* CLOSED at waiting means connection was breaked */ if (conn->state == PXE_TCP_CLOSED) return (PXE_AWAIT_BREAK); - } - break; + + break; - case PXE_AWAIT_STARTTRY: /* nothing to do */ case PXE_AWAIT_FINISHTRY: + if (conn->state == PXE_TCP_CLOSED) + return (PXE_AWAIT_BREAK); + pxe_resend_check(wait_data->connection); break; + + case PXE_AWAIT_STARTTRY: /* nothing to do */ case PXE_AWAIT_END: default: break; @@ -225,7 +229,6 @@ return (1); } - /* if connection in established state - initiate active close */ if (!pxe_tcp_syssend(connection, PXE_TCP_FIN | PXE_TCP_ACK)) { printf("pxe_tcp_disconnect(): failed to send FIN.\n"); free_connection(connection); @@ -233,26 +236,32 @@ } /* update sequence number */ connection->next_send += 1; + + PXE_TCP_WAIT_DATA wait_data; + wait_data.connection = connection; - if (connection->state == PXE_TCP_ESTABLISHED) + if (connection->state == PXE_TCP_ESTABLISHED) { + /* active closing by our host */ connection->state = PXE_TCP_FIN_WAIT1; - - connection->state_out = PXE_TCP_FIN; #ifdef PXE_DEBUG printf("pxe_tcp_disconnect(): new state - FIN_WAIT_1\n"); #endif - PXE_TCP_WAIT_DATA wait_data; - wait_data.connection = connection; + wait_data.state = PXE_TCP_TIME_WAIT; - wait_data.state = PXE_TCP_TIME_WAIT; - - /* await TIME_WITE state. - * connection will fell in this state in pxe_tcp_callback(), - * TODO: add waiting of LAST_ACK also + } else { /* if connection breaked by remote host */ + wait_data.state = PXE_TCP_LAST_ACK; + } + + connection->state_out = PXE_TCP_FIN; + + + /* awaiting expected state to close connection + * connection will fell in this state in pxe_tcp_callback() */ - if (!pxe_await(tcp_await, 5, PXE_TCP_MSL / 5, &wait_data)) { /* failed to get to TIME_WAIT state */ + if (!pxe_await(tcp_await, 5, PXE_TCP_MSL / 5, &wait_data)) { /* failed to get expected state */ + free_connection(connection); - + if (connection->state != PXE_TCP_CLOSED) return (0); } @@ -347,7 +356,6 @@ } /* if we got here, then we need to finish current segment and alloc new segment */ - pxe_memcpy(data + sent_data, segment_data + segment->size, bufleft); segment->size += bufleft; sent_data += bufleft; @@ -501,8 +509,8 @@ PXE_BUFFER *buffer = connection->recv; - /* send ACK ony if we place for one segment at least */ - if (buffer->bufleft < buffer->bufsize / 2) { + /* send ACK ony if we place enough space */ + if (buffer->bufleft < buffer->bufsize / 3) { return (0); } ==== //depot/projects/soc2007/taleks-pxe_http/pxe_core.c#19 (text+ko) ==== @@ -11,15 +11,12 @@ #include "pxe_ip.h" #include "pxe_isr.h" #include "pxe_mem.h" -#include "pxe_mutex.h" #include "pxe_udp.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. */ -/* NOTE: to think about using of this buffers */ -#define PXE_BUFFER_SIZE 0x1000 static uint8_t scratch_buffer[PXE_BUFFER_SIZE]; static uint8_t data_buffer[PXE_BUFFER_SIZE]; static uint8_t exclusive_protocol = 0; @@ -27,14 +24,9 @@ static pxe_t *pxe = NULL; /* !PXE */ static BOOTPLAYER bootplayer; /* PXE Cached information. */ -/* TODO: to think if packets queue must be in pxe_core. - * It seems, it'll be used only by TCP - */ - /* pxe core structures*/ PXE_PACKET core_packet; /* current processing packet */ pxe_protocol_call core_protocol[256]; /* protocol's callback fuctions */ -PXE_MUTEX core_mutex = {0, 0}; /* mutex used in packet allocation */ /* NIC info */ MAC_ADDR nic_mac; /* may be init it also by zero? */ @@ -113,7 +105,6 @@ #ifdef PXE_DEBUG printf("pxe_core_init(): started (pxenv_p = 0x%x, pxe_p = 0x%x).\n", pxenv_p, pxe_p); #endif - int counter = 0; uint8_t checksum = 0; uint8_t *checkptr = NULL; @@ -255,9 +246,9 @@ pxe_set_ip32(PXE_IP_MY, bootplayer.yip); /* nic ip */ pxe_set_ip32(PXE_IP_SERVER, bootplayer.sip); /* boot server ip */ -/* pxe_set_ip32(PXE_IP_NAMESERVER, 0x0100a8c0); /* nameserver ip, default to 192.168.0.1 */ -/* pxe_set_ip32(PXE_IP_GATEWAY, 0x0100a8c0); /* gateway ip, default to 192.168.0.1 */ -/* pxe_set_ip32(PXE_IP_NETMASK, 0x00ffffff); /* gateway ip, default to 255.255.255.0 */ + pxe_set_ip32(PXE_IP_NAMESERVER, 0x0100a8c0); /* nameserver ip, default to 192.168.0.1 */ + pxe_set_ip32(PXE_IP_GATEWAY, 0x0100a8c0); /* gateway ip, default to 192.168.0.1 */ + pxe_set_ip32(PXE_IP_NETMASK, 0x00ffffff); /* gateway ip, default to 255.255.255.0 */ pxe_set_ip32(PXE_IP_BROADCAST, 0xffffffff); /* broadcast address, default to 255.255.255.255 */ /* initing modules */ @@ -395,7 +386,6 @@ int pxe_core_shutdown() { - int i = 1; if (core_packet.data) pxe_free(core_packet.data); @@ -404,7 +394,6 @@ pxe_core_remove_isr(); /* 2. shutdown PXE */ - t_PXENV_UNLOAD_STACK *unload_stack_p = (t_PXENV_UNLOAD_STACK *)scratch_buffer; @@ -462,8 +451,6 @@ int pxe_core_transmit(PXE_PACKET *pack) { - /* NOTE: is all provided data must be in base memory? - */ t_PXENV_UNDI_TRANSMIT *undi_send = (t_PXENV_UNDI_TRANSMIT *)scratch_buffer; @@ -475,11 +462,6 @@ tbd.ImmedLength = pack->data_size; /* packet length */ tbd.Xmit.segment = VTOPSEG(pack->data); /* immediate transmit buffer */ tbd.Xmit.offset = VTOPOFF(pack->data); /* segment & offset */ - -/* tbd.ImmedLength = pack->raw_size; - tbd.Xmit.segment = VTOPSEG(pack->raw_data); - tbd.Xmit.offset = VTOPOFF(pack->raw_data); -*/ tbd.DataBlkCount = 0 ; /* only immediate data */ undi_send->Protocol = pack->protocol; @@ -631,9 +613,9 @@ int protocol = 0; /* protocol */ int received = 0; /* bytes received to buffer */ - int frame_size = 0; /* size of frame */ - int drop_flag = 0; - int processed_packets = 0; + int frame_size = 0; /* size of frame */ + int drop_flag = 0; /* 1 if current packet must be dropped */ + int processed_packets = 0; /* total count of processed packets during call*/ PXE_PACKET *pack=NULL; /* allocated packet */ PXE_PACKET dummy_pack; /* temporary struct, used to mimic @@ -698,9 +680,10 @@ /* sanity check */ if (frame_size < PXE_BUFFER_SIZE) { - pxe_core_copy( undi_isr->Frame.segment, undi_isr->Frame.offset, +/* pxe_core_copy( undi_isr->Frame.segment, undi_isr->Frame.offset, VTOPSEG(data_buffer), VTOPOFF(data_buffer), frame_size); -/* pxe_memcpy(PTOV(undi_isr->Frame.segment * 16 + undi_isr->Frame.offset), data_buffer, frame_size); */ + */ + pxe_memcpy(PTOV(undi_isr->Frame.segment * 16 + undi_isr->Frame.offset), data_buffer, frame_size); } else { printf("pxe_core_recv_packets(): not enough buffer size (%d bytes) for frame size %d bytes.\n", PXE_BUFFER_SIZE, frame_size); @@ -729,7 +712,7 @@ if (protocol == PXE_PROTOCOL_ARP) { - pxe_arp_protocol(&dummy_pack, PXE_CORE_HANDLE, NULL); + pxe_arp_protocol(&dummy_pack, PXE_CORE_HANDLE); ++processed_packets; /* aasume ARP packet always in one fragment */ @@ -739,11 +722,11 @@ goto packet_start; } - /* TODO: calc ip checksum */ + /* TODO: calc ip checksum */ if ( (!core_protocol[iphdr->protocol]) || (!core_protocol[iphdr->protocol](&dummy_pack, - (buffer_size == frame_size) ? PXE_CORE_HANDLE : PXE_CORE_FRAG, NULL)) ) { + (buffer_size == frame_size) ? PXE_CORE_HANDLE : PXE_CORE_FRAG)) ) { drop_flag = 1; } else { @@ -773,8 +756,11 @@ frame_size = undi_isr->FrameLength; if (frame_size < PXE_BUFFER_SIZE) { - pxe_core_copy( undi_isr->Frame.segment, undi_isr->Frame.offset, +/* pxe_core_copy( undi_isr->Frame.segment, undi_isr->Frame.offset, VTOPSEG(data_buffer), VTOPOFF(data_buffer), frame_size); + */ + pxe_memcpy(PTOV(undi_isr->Frame.segment * 16 + undi_isr->Frame.offset), + data_buffer, frame_size); } else { printf("pxe_core_recv_packets(): not enough buffer size (%d bytes) for frame size %d bytes.", PXE_BUFFER_SIZE, frame_size); @@ -807,7 +793,7 @@ pack->protocol = protocol; if ( (!core_protocol[iphdr->protocol]) || - (!core_protocol[iphdr->protocol](pack, PXE_CORE_HANDLE, NULL)) ) { + (!core_protocol[iphdr->protocol](pack, PXE_CORE_HANDLE)) ) { /* protocol not interested in it */ pxe_core_drop(pack); } @@ -818,10 +804,6 @@ func = PXENV_UNDI_ISR_IN_GET_NEXT; -/* if (received == buffer_size) - return processed_packets; -*/ - goto packet_start; /* never getting here */ @@ -837,7 +819,7 @@ * 0 - failed * 1 - success */ -int +static int pxe_core_recieve(PXE_PACKET *pack, void *frame_data, size_t frame_size) { @@ -860,7 +842,6 @@ PXE_PACKET * pxe_core_alloc_packet(size_t packet_size) { - int i = 1; /* packet index */ if (core_packet.state == PXE_PACKET_STATE_FREE) { /* packet structure seems to be free */ @@ -874,7 +855,6 @@ pxe_free(core_packet.data); core_packet.raw_data = data; - /* failed to allocate enough memory for packet */ if (data == NULL) { core_packet.data_size = 0; @@ -896,16 +876,6 @@ } /* TODO: think if this function is useful - * commits choosed packet, free used structures - */ -void -pxe_core_commit(PXE_PACKET *pack) -{ - - pack->state = PXE_PACKET_STATE_FREE; -} - -/* TODO: think if this function is useful * drops choosed packet */ void @@ -913,7 +883,7 @@ { ++packets_dropped; - pxe_core_commit(pack); + pack->state = PXE_PACKET_STATE_FREE; } /* pxe_core_register() - registers protocol in protocols table @@ -932,7 +902,7 @@ /* pxe_core_exclusive() - sets protocol exclusive when receiving packets * in: - * proto - IP protocol number + * proto - protocol number (PXE_PROTOCOL_...) * out: * none */ @@ -1001,5 +971,5 @@ time(&secs); - return (secs); + return (secs); } ==== //depot/projects/soc2007/taleks-pxe_http/pxe_core.h#15 (text+ko) ==== @@ -11,22 +11,18 @@ * contains wrappers for UNDI functions */ -#define PXE_MAX_PACKETS 32 +#define PXE_BUFFER_SIZE 0x1000 #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 - /* size of media header, used in allocating memmory for packet */ #define MEDIAHDR_LEN_ETH 14 +/* packet type: broadcast and directed */ #define PXE_BCAST 1 #define PXE_SINGLE 0 /* - * structure, used in queueing packets in pxe_core + * structure, used to provide information about packet in pxe_core */ typedef struct pxe_packet { @@ -62,9 +58,6 @@ /* sends packet to a network */ int pxe_core_transmit(PXE_PACKET *pack); -/* commits that packet will not be used */ -void pxe_core_commit(PXE_PACKET *pack); - /* allocates buffer for packet */ PXE_PACKET *pxe_core_alloc_packet(size_t packet_size); @@ -77,7 +70,7 @@ /* calls PXE/UNDI API, registers of processor must be filled in with * appropriate values. */ -int pxe_core_call(int func); +static int pxe_core_call(int func); /* copies in real mode from one segment to another. */ void pxe_core_copy(uint16_t seg_from, uint16_t off_from, uint16_t seg_to, uint16_t off_to, uint16_t size); @@ -89,7 +82,7 @@ void pxe_core_remove_isr(); /* stores data in packet */ -int pxe_core_recieve(PXE_PACKET *pack, void *data, size_t size); +static 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); @@ -98,10 +91,9 @@ void pxe_core_stats(); #define PXE_CORE_HANDLE 0x0 -#define PXE_CORE_CHECK 0x1 -#define PXE_CORE_FRAG 0x2 -/* protocol callback function type*/ -typedef int (*pxe_protocol_call)(PXE_PACKET *pack, uint8_t function, void *data); +#define PXE_CORE_FRAG 0x1 +/* protocol callback function type */ +typedef int (*pxe_protocol_call)(PXE_PACKET *pack, uint8_t function); /* registers protocol */ void pxe_core_register(uint8_t ip_proto, pxe_protocol_call proc); ==== //depot/projects/soc2007/taleks-pxe_http/pxe_dhcp.c#3 (text+ko) ==== @@ -112,7 +112,13 @@ #ifdef PXE_DEBUG printf("domain name: %s\n", (p+1)); #endif - break; + break; + + case PXE_DHCP_OPT_WWW_SERVER: +#ifdef PXE_DEBUG + printf("server ip: %d.%d.%d.%d\n", *(p+1), *(p+2), *(p+3), *(p+4)); +#endif + break; default: printf("DHCP option %d is unknown (%d bytes ignored)\n", code, len); break; ==== //depot/projects/soc2007/taleks-pxe_http/pxe_dhcp.h#3 (text+ko) ==== @@ -78,6 +78,7 @@ #define PXE_DHCP_OPT_ID 54 #define PXE_DHCP_OPT_RENEWAL_TIME 58 #define PXE_DHCP_OPT_REBINDING_TIME 59 +#define PXE_DHCP_OPT_WWW_SERVER 72 #define PXE_DHCP_OPT_END 255 /* used in await function */ @@ -103,4 +104,5 @@ /* prints out known DHCP options */ void pxe_dhcp_parse_options(uint8_t *opts, uint16_t max_size, PXE_DHCP_PARSE_RESULT *res); + #endif ==== //depot/projects/soc2007/taleks-pxe_http/pxe_icmp.c#10 (text+ko) ==== @@ -17,25 +17,20 @@ * in: * pack - packet describing data * function- function, which must be performed - * data - additional data [unused] * out: * always 0 */ int -pxe_icmp_callback(PXE_PACKET *pack, uint8_t function, void *data) +pxe_icmp_callback(PXE_PACKET *pack, uint8_t function) { - /* we don't store icmp packets, so they cannot steal memory * in pxe core packet table */ - if (function == PXE_CORE_CHECK) { - return (0); + if (function == PXE_CORE_FRAG) { + return (1); } - /* PXE_CORE_HANDLE - to handle packet - */ - /* icmp header*/ PXE_IP_HDR *iphdr = (PXE_IP_HDR *)pack->data; size_t iphdr_len = (iphdr->ver_ihl & 0x0f) * 4; @@ -67,7 +62,6 @@ return (0); /* instruct pxe core to drop packet*/ }; - if (icmphdr->type == PXE_ICMP_ECHO_REPLY) { if ( (reply_number != seq_number) && (icmphdr->code != 0)) { @@ -87,12 +81,6 @@ if (pinging.ip == iphdr->src_ip) { -/* uint16_t sum_orig = icmphdr->checksum; - icmphdr->checksum = 0; - uint16_t sum = ~pxe_ip_checksum(icmphdr, sizeof(PXE_ICMP_HDR) + data_size); - - printf("checksums: 0x%x %s 0x%x\n", sum_orig, (sum_orig == sum) ? "==" : "!=", sum ); -*/ if (echo_flags) { printf("pxe_ping(): echo reply from %d.%d.%d.%d, seq=%ld ", pinging.octet[0], pinging.octet[1], @@ -107,7 +95,6 @@ /* all we need now is echo reply */ - /* using buffer of recieved packet to avoid additional memory copy operations */ reply_iphdr = (PXE_IP_HDR *)pack->data; @@ -137,7 +124,6 @@ int pxe_icmp_init() { - /* register protocol in pxe_core protocols table. */ pxe_core_register(PXE_ICMP_PROTOCOL, pxe_icmp_callback); @@ -155,11 +141,11 @@ int pxe_ping(PXE_IPADDR *ip, int count, int flags) { + seq_number = 0; last_accepted = 0xffff; echo_flags = flags; - /* creating data storage for packet */ uint8_t data[sizeof(PXE_IP_HDR) + sizeof(PXE_ICMP_HDR) + 32]; @@ -216,7 +202,6 @@ ++scount; break; } - } if ( (last_accepted != seq_number) && flags) ==== //depot/projects/soc2007/taleks-pxe_http/pxe_ip.c#10 (text+ko) ==== @@ -134,14 +134,12 @@ gw_ip.octet[0], gw_ip.octet[1], gw_ip.octet[2], gw_ip.octet[3] ); - for ( ; route_index < all_routes; ++route_index) { if ((route_table[route_index].net == net_ip.ip) && (route_table[route_index].gw == gw) && (route_table[route_index].mask == mask)) { - --all_routes; if (route_index == all_routes) @@ -157,7 +155,6 @@ route_table[shift_index].mask == route_table[shift_index + 1].mask; } - return (1); } @@ -262,13 +259,13 @@ const uint8_t *mac = (uint8_t *)pxe_arp_ip4mac(gw); - if (mac != NULL) - printf("%2x:%2x:%2x:%2x:%2x:%2x", - mac[0], mac[1], mac[2], mac[3], mac[4], mac[5] - ); - } - - printf("\n"); + if (mac != NULL) { + printf("%2x:%2x:%2x:%2x:%2x:%2x", + mac[0], mac[1], mac[2], mac[3], mac[4], mac[5] + ); + } + } + printf("\n"); } } ==== //depot/projects/soc2007/taleks-pxe_http/pxe_sock.c#13 (text+ko) ==== @@ -453,18 +453,24 @@ return (-1); } - PXE_SOCKET *sock = &pxe_sockets[socket]; - PXE_FILTER_ENTRY *filter = sock->filter; + PXE_SOCKET *sock = &pxe_sockets[socket]; + PXE_FILTER_ENTRY *filter = sock->filter; + int result = -1; if (filter->protocol == PXE_UDP_PROTOCOL) { - return pxe_udp_write(sock, buf, buflen); + result = pxe_udp_write(sock, buf, buflen); } else if (filter->protocol == PXE_TCP_PROTOCOL) { - return pxe_tcp_write(sock, buf, buflen); - } - printf("pxe_send(): only TCP and UDP sockets are implemented.\n"); + result = pxe_tcp_write(sock, buf, buflen); + + } else { + printf("pxe_send(): only TCP and UDP sockets are implemented.\n"); + } + + if (result > 0) + sock->sent += result; return (-1); } @@ -516,7 +522,7 @@ if (result != 0) break; - if (timer > PXE_SOCKET_TIMEOUT * 1000) + if (timer > PXE_SOCKET_TIMEOUT) break; if (filter->protocol == PXE_TCP_PROTOCOL) { @@ -533,6 +539,9 @@ delay(10000); } + if (result > 0) + sock->recv += result; + return (result); } ==== //depot/projects/soc2007/taleks-pxe_http/pxe_sock.h#11 (text+ko) ==== @@ -12,10 +12,10 @@ #define PXE_DEFAULT_SOCKETS 8 /* default count of waiting queue */ #define PXE_DEFAULT_WAITCOUNT 3 -/* socket timeout when receiving data, in seconds */ -#define PXE_SOCKET_TIMEOUT 30 +/* socket timeout when receiving data, in milliseconds */ +#define PXE_SOCKET_TIMEOUT 30000 /* timeout, after that force connection checking, in milliseconds */ -#define PXE_SOCKET_CHECK_TIMEOUT 200 +#define PXE_SOCKET_CHECK_TIMEOUT 100 /* socket states */ #define PXE_SOCKET_FREE 0x0 /* socket unused and free for allocating */ #define PXE_SOCKET_USED 0x1 /* socket structure used */ ==== //depot/projects/soc2007/taleks-pxe_http/pxe_tcp.c#8 (text+ko) ==== @@ -320,7 +320,7 @@ if (tcp_packet->tcphdr.flags & (PXE_TCP_SYN | PXE_TCP_FIN) ) connection->next_recv += 1; -/* printf("tcp_process_7(): ack = %d, seq = %d, seglen = %d\n", +/* printf("tcp_process_7(): seq = %d, ack = %d, seglen = %d\n", connection->next_recv - connection->irs, connection->next_send - connection->iss, seglen ); */ @@ -808,21 +808,17 @@ * in: * pack - packet description * function- function to perform - * data - additional data [unused] * out: * 1 - if packet is fragment and code is interested in it * 0 - if success or error */ int -pxe_tcp_callback(PXE_PACKET *pack, uint8_t function, void *data) +pxe_tcp_callback(PXE_PACKET *pack, uint8_t function) { PXE_TCP_PACKET *tcp_packet = pack->data; PXE_IPADDR from; PXE_IPADDR to; - if (function == PXE_CORE_CHECK) /* informm, we are not using pxe_core queue */ - return (0); - from.ip = tcp_packet->iphdr.src_ip; to.ip = tcp_packet->iphdr.dst_ip; ==== //depot/projects/soc2007/taleks-pxe_http/pxe_udp.c#7 (text+ko) ==== @@ -11,21 +11,17 @@ * in: * pack - packet description * function- function to perform - * data - additional data [unused] * out: * 1 - if packet is fragment and code is interested in it * 0 - if success or error */ int -pxe_udp_callback(PXE_PACKET *pack, uint8_t function, void *data) +pxe_udp_callback(PXE_PACKET *pack, uint8_t function) { PXE_UDP_PACKET *udp_packet = pack->data; PXE_IPADDR from; PXE_IPADDR to; - if (function == PXE_CORE_CHECK) /* informm, we are not using pxe_core queue */ - return (0); - from.ip = udp_packet->iphdr.src_ip; to.ip = udp_packet->iphdr.dst_ip; @@ -52,12 +48,8 @@ if (function == PXE_CORE_FRAG) /* informm, we are interested in whole packet*/ return (1); -/* uint16_t buf_free = sock->recv_buffer.bufleft; */ uint16_t data_size = pack->data_size - sizeof(PXE_UDP_PACKET); -/* if (buf_free < data_size) - return (0); -*/ PXE_BUFFER* recv_buffer = &sock->recv_buffer; PXE_UDP_DGRAM udp_dgram;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200707091626.l69GQ5JR067632>