From owner-p4-projects@FreeBSD.ORG Sun May 13 15:46:15 2007 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 1156316A406; Sun, 13 May 2007 15:46:15 +0000 (UTC) X-Original-To: perforce@FreeBSD.org Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id CDA0016A404 for ; Sun, 13 May 2007 15:46:14 +0000 (UTC) (envelope-from taleks@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [69.147.83.41]) by mx1.freebsd.org (Postfix) with ESMTP id BCBF113C447 for ; Sun, 13 May 2007 15:46:14 +0000 (UTC) (envelope-from taleks@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.8/8.13.8) with ESMTP id l4DFkE7R085391 for ; Sun, 13 May 2007 15:46:14 GMT (envelope-from taleks@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.8/8.13.8/Submit) id l4DFkEKe085388 for perforce@freebsd.org; Sun, 13 May 2007 15:46:14 GMT (envelope-from taleks@FreeBSD.org) Date: Sun, 13 May 2007 15:46:14 GMT Message-Id: <200705131546.l4DFkEKe085388@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to taleks@FreeBSD.org using -f From: Alexey Tarasov To: Perforce Change Reviews Cc: Subject: PERFORCE change 119772 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 13 May 2007 15:46:15 -0000 http://perforce.freebsd.org/chv.cgi?CH=119772 Change 119772 by taleks@taleks_th on 2007/05/13 15:46:00 Cosmetic changes, made all compilable together, added simple makefile. Affected files ... .. //depot/projects/soc2007/taleks-pxe_http/Makefile#1 add .. //depot/projects/soc2007/taleks-pxe_http/pxe_arp.c#2 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_arp.h#2 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_core.c#7 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_core.h#7 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_icmp.c#5 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_icmp.h#4 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_ip.c#4 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_ip.h#3 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_isr.S#3 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_isr.h#2 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_mutex.c#3 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_mutex.h#3 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_sock.c#3 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_sock.h#3 edit Differences ... ==== //depot/projects/soc2007/taleks-pxe_http/pxe_arp.c#2 (text+ko) ==== @@ -5,37 +5,54 @@ #include "pxe_core.h" #include "pxe_mem.h" -static pxe_arp_entry arp_table[MAX_ARP_ENTRIES]; -static pxe_arp_pack_data packet_to_send; +static PXE_ARP_ENTRY arp_table[MAX_ARP_ENTRIES]; +static PXE_ARP_PACK_DATA packet_to_send; static int arp_usage = 0; +/* + * pxe_arp_init() - initialisation of used by this module structures + * in: + * none + * out: + * none + */ void pxe_arp_init() { - pxe_memset(&packet_to_send, 0, sizeof(pxe_arp_pack_data) ); + pxe_memset(&packet_to_send, 0, sizeof(PXE_ARP_PACK_DATA) ); /* now body.target_hwaddr filled with zero, which means broadcast MAC */ pxe_memset(arp_table, 0, sizeof(arp_table)); /* filling packet_to_send, it will not change ever */ - packet_to_send.hdr.hwtype = le2be16(ETH_TYPE); + packet_to_send.hdr.hwtype = le2be16(ETHER_TYPE); packet_to_send.hdr.ptype = le2be16(PXE_PTYPE_IP); packet_to_send.hdr.hsize = 6; /* Ethernet MAC size */ packet_to_send.hdr.psize = 4; /* ip4 size */ packet_to_send.hdr.operation = PXE_ARPOP_REQUEST; - + /* filling source related data, client ip & MAC */ pxe_memcpy(pxe_get_mymac(), packet_to_send.body.src_hwaddr, 6); - packet_to_send.body.src_paddr=pxe_get_myip32(); + packet_to_send.body.src_paddr = le2be32(pxe_get_myip32()); } +/* + * 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 + * 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, void *data) { - const pxe_arp_pack_data *arp_reply = (const pxe_arp_pack_data *)pack->data; + const PXE_ARP_PACK_DATA *arp_reply = (const PXE_ARP_PACK_DATA *)pack->data; - if (arp_reply.hdr.operation != PXE_ARPOP_REPLY) /* we don't need answer for requests. May be. */ + if (arp_reply->hdr.operation != PXE_ARPOP_REPLY) /* we don't need answer for requests. May be. */ return 0; /* if arp_usage exceeds MAX_ARP_ENTRIES, occurs rewriting of earlier placed ARP entries. @@ -44,19 +61,27 @@ * is full. In fact, we don't need many entries. Only two: one for gateway, one for DNS-server * or for proxy server. Default arp_table size is 8. It seems more than enough. */ - pxe_memcpy(&arp_reply.body.src_hwaddr, &arp_table[arp_usage % MAX_ARP_ENTRIES].mac, 6); - arp_table[arp_usage % MAX_ARP_ENTRIES].ip4 = arp_reply.body. + pxe_memcpy(&arp_reply->body.src_hwaddr, &arp_table[arp_usage % MAX_ARP_ENTRIES].mac, 6); + arp_table[arp_usage % MAX_ARP_ENTRIES].ip4.ip = be2le32(arp_reply->body.src_paddr); ++arp_usage; return 0; /* inform pxe_get_packet() we don't need this packet more. */ } +/* + * pxe_arp_send_whois() - sends ARP request packet for given ip, received packets are + * handled in pxe_arp_protocol() + * in: + * ip - target ip, for which to find MAC + * out: + * none + */ void pxe_arp_send_whois(uint32_t ip) { - pxe_packet pack; + PXE_PACKET pack; - pack.data_size = sizeof(pxe_arp_pack_data); + pack.data_size = sizeof(PXE_ARP_PACK_DATA); pack.data = &packet_to_send; packet_to_send.body.target_paddr = le2be32(ip); @@ -66,19 +91,37 @@ } } +/* + * pxe_arp_table_search() - searches entry in ARP table for given ip + * in: + * ip - ip, for which to search MAC + * out: + * NULL - not found such entry in arp_table + * not NULL - pointer to MAC address + */ const MAC_ADDR * pxe_arp_table_search(uint32_t ip) { + int entry = 0; + + for (; entry < MAX_ARP_ENTRIES; ++entry) { - for (int entry = 0; entry < MAX_ARP_ENTRIES; ++entry) { - if (arp_table[entry].ip4.ip == ip) - return &arp_table[entry]; + return &arp_table[entry].mac; } return NULL; } +/* + * pxe_arp_ip4mac() - returns MAC for given ip if it's found in arp_table, + * otherwise - performs request sending + * in: + * ip - ip, for which to search MAC + * out: + * NULL - not found such entry in arp_table + * not NULL - pointer to MAC address + */ const MAC_ADDR * pxe_arp_ip4mac(uint32_t ip) { @@ -88,7 +131,7 @@ const MAC_ADDR *res = pxe_arp_table_search(ip); if (res != NULL) - return res; + return (res); pxe_arp_send_whois(ip); @@ -100,7 +143,7 @@ * arp_table updated */ if (res != NULL) { - return res; + return (res); } }; @@ -111,7 +154,7 @@ printf("."); #endif --trysLeft; - if (0 == trysLeft) { /* have not recieved anything, return nothing */ + if (trysLeft == 0) { /* have not recieved anything, return nothing */ printf("ARP sending timeout.\n"); return (NULL); @@ -124,4 +167,7 @@ sleep(1); --timeToDie; } -}+ + /* never getting here*/ + return (NULL); +} ==== //depot/projects/soc2007/taleks-pxe_http/pxe_arp.h#2 (text+ko) ==== @@ -12,49 +12,53 @@ #include "pxe_core.h" #include "pxe_ip.h" +/* max MAC<->ip4 bindings to store */ #define MAX_ARP_ENTRIES 4 +/* max try count to send/recieve ARP request/reply */ +#define PXE_MAX_ARP_TRY 5 +/* max timeout in seconds */ +#define PXE_TIME_TO_DIE 60 typedef struct pxe_arp_entry { - pxe_ipaddr ip4; + PXE_IPADDR ip4; MAC_ADDR mac; } PXE_ARP_ENTRY; -/* NULL if cannot find such entry in ARP table */ +/* initialisation routine */ +void pxe_arp_init(); +/* find MAC by provided ip */ const MAC_ADDR* pxe_arp_ip4mac(uint32_t ip); -int pxe_arp_protocol(pxe_packet *pack, uint8_t function, void *data); +/* protocol handler for received packets */ +int pxe_arp_protocol(PXE_PACKET *pack, uint8_t function, void *data); +/* ARP packet types */ #define PXE_ARPOP_REQUEST 1 #define PXE_ARPOP_REPLY 2 +/* protocol types */ #define PXE_PTYPE_IP 0x0800 /* IP4 protocol, used in ARP request */ /* NOTE: here will be realised ARP for Ethernet and IP4 */ -struct pxe_arp_packet { - uint16_t hwtype; /* hardware type */ +typedef struct pxe_arp_packet { + uint16_t hwtype; /* hardware type */ uint16_t ptype; /* protocol type */ uint8_t hsize; /* size of hardware address */ uint8_t psize; /* size of protocol adress */ uint16_t operation; -} PXE_ARP_PACKET; +} __packed PXE_ARP_PACKET; -struct pxe_arp_packet_eth4 { +typedef struct pxe_arp_packet_eth4 { uint8_t src_hwaddr[6]; /* source hardware address */ - uint8_t src_paddr[4]; /* source protocol address */ + uint32_t src_paddr; /* source protocol address */ uint8_t target_hwaddr[6]; /* target hardware address if known */ - uint8_t target_paddr[4]; /* target protocol address if known */ -} PXE_ARP_PACKET_ETH4 + uint32_t target_paddr; /* target protocol address if known */ +} __packed PXE_ARP_PACKET_ETH4; -struct pxe_arp_pack_data { - pxe_arp_packet hdr; - pxe_arp_packet_eth4 body; -} PXE_ARP_PACK_DATA +typedef struct pxe_arp_pack_data { + PXE_ARP_PACKET hdr; + PXE_ARP_PACKET_ETH4 body; +} __packed PXE_ARP_PACK_DATA; -/* max try count to send/recieve ARP request/reply */ -#define PXE_MAX_ARP_TRY 5 -/* max timeout in seconds */ -#define PXE_TIME_TO_DIE 60 - -void pxe_arp_init(); -#endif+#endif ==== //depot/projects/soc2007/taleks-pxe_http/pxe_core.c#7 (text+ko) ==== @@ -18,8 +18,8 @@ /* 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 uint8_t scratch_buffer[PXE_BUFFER_SIZE]; +static uint8_t 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. */ @@ -33,12 +33,12 @@ extern void __pxenventry(void); /* pxe core structures*/ -pxe_packet core_packets[PXE_MAX_PACKETS]; /* buffered packets */ +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 */ +PXE_MUTEX core_mutex = {0, 0}; /* mutex used in packet allocation */ /* NIC info */ -pxe_ipaddr nic_ip = {0}; +PXE_IPADDR nic_ip = {0}; MAC_ADDR nic_mac; /* may be init it also by zero? */ /* core packet statistics */ @@ -170,9 +170,9 @@ /* 3. additional start UNDI */ /* saving information about NIC */ - nic_ip.ip=bootplayer.yip; /* my ip */ + nic_ip.ip = be2le32(bootplayer.yip); /* my ip */ /* my MAC */ - pxe_memcpy(&nic_mac, bootplayer.CAddr, MAC_ADDR_LEN); + pxe_memcpy(&nic_mac, &bootplayer.CAddr, MAC_ADDR_LEN); return (1); } @@ -217,7 +217,6 @@ v86.ctl = V86_ADDR | V86_CALLF | V86_FLAGS; v86.addr = (VTOPSEG(__isr_install) << 16) | VTOPOFF(__isr_install); - v86.ebx = func; v86int(); v86.ctl = V86_FLAGS; #else @@ -251,8 +250,7 @@ bzero(&v86, sizeof(v86)); v86.ctl = V86_ADDR | V86_CALLF | V86_FLAGS; - v86.addr = (VTOPSEG(__isr_uninstall) << 16) | VTOPOFF(__isr_uninstall); - v86.ebx = func; + v86.addr = (VTOPSEG(__isr_remove) << 16) | VTOPOFF(__isr_remove); v86int(); v86.ctl = V86_FLAGS; @@ -313,15 +311,15 @@ } int -pxe_core_transmit(pxe_packet *pack) +pxe_core_transmit(PXE_PACKET *pack) { - /* NOTE:all provided data must be in base segment of PXE, + /* NOTE:all provided data must be in base memory, * if it's not here, it must be copied here (TO IMPLEMENT) */ t_PXENV_UNDI_TRANSMIT *undi_send = (t_PXENV_UNDI_TRANSMIT *)scratch_buffer; - bzero(undi_send, sizeof(*undi_info)); + bzero(undi_send, sizeof(*undi_send)); t_PXENV_UNDI_TBD tbd; tbd.ImmedLength = pack->data_size; /* packet length */ @@ -332,7 +330,7 @@ undi_send->Protocol = pack->protocol; undi_send->DestAddr.segment = VTOPSEG(pack->dest_mac); undi_send->DestAddr.offset = VTOPOFF(pack->dest_mac); - undi_send->TBD.segment = VTOPSEG(&tbd); /* SEGOFF16 to xmit block data*/ + undi_send->TBD.segment = VTOPSEG(&tbd); /* SEGOFF16 to xmit block data */ undi_send->TBD.offset = VTOPOFF(&tbd); /* NOTE: is it needed? we use only immediate block */ @@ -340,15 +338,15 @@ /* we've inited undi_info with zero, so two lines below are not needed */ /* tbd.DataBlk[0].TDRsvdByte = 0; /* reserved */ /* tbd.DataBlk[1].TDRsvdByte = 0; /* reserved */ - tbd.DataBlk[0].TDDataLen=tbd.ImmedLength; /* size of packet*/ - tbd.DataBlk[0].TDPtrType = 1; /* segment:offset type */ - tbd.DataBlk[0].TDDataPtr.segment = VTOPSEG(pack->data);; - tbd.DataBlk[0].TDDataPtr.offset = VTOPOFF(pack->data);; + tbd.DataBlock[0].TDDataLen=tbd.ImmedLength; /* size of packet*/ + tbd.DataBlock[0].TDPtrType = 1; /* segment:offset type */ + tbd.DataBlock[0].TDDataPtr.segment = VTOPSEG(pack->data);; + tbd.DataBlock[0].TDDataPtr.offset = VTOPOFF(pack->data);; - pxe_core_call(PXENV_UNDI_TRANSMIT_PACKET); + pxe_core_call(PXENV_UNDI_TRANSMIT); if (undi_send->Status != 0) { - printf("pxe_core_transmit(): failed %x\n", undi_info->Status); + printf("pxe_core_transmit(): failed %x\n", undi_send->Status); return (0); } @@ -362,7 +360,7 @@ int i = 0; for (; i < PXE_MAX_PACKETS; ++i) { - pxe_ip *iphdr=(pxe_ip *)(core_packets[i].data); + PXE_IP_HDR *iphdr=(PXE_IP_HDR *)(core_packets[i].data); if (iphdr == NULL) { /* dummy packet */ continue; @@ -399,7 +397,7 @@ bzero(undi_isr, sizeof(*undi_isr)); - undi_isr->FuncFlag=PXENV_UNDI_ISR_IN_START; + undi_isr->FuncFlag = PXENV_UNDI_ISR_IN_START; pxe_core_call(PXENV_UNDI_ISR); if (undi_isr->Status != 0) { /* pxe_core_call() failed */ @@ -470,7 +468,7 @@ } /* - * recieves one packet, if there is any waiting in receiving queue. + * recieves all packets, if there is any waiting in receiving queue. * in: * none * out: @@ -493,14 +491,14 @@ int drop_flag = 0; int processed_packets = 0; - pxe_packet *pack=NULL; /* allocated packet */ - pxe_packet dummy_pack; /* temporary struct, used to mimic + PXE_PACKET *pack=NULL; /* allocated packet */ + PXE_PACKET dummy_pack; /* temporary struct, used to mimic * real packet struct */ if (__pxe_isr_occured == 0) /* there are no packets for us to handle */ return (0); - __pxe_isr_occured = 0; + __pxe_isr_occured = 0; /* reset flag */ t_PXENV_UNDI_ISR *undi_isr = (t_PXENV_UNDI_ISR *)scratch_buffer; @@ -508,7 +506,7 @@ bzero(undi_isr, sizeof(*undi_isr)); /* starting packet receive cycle */ - /* NOTE: pxe_core_recv_packet() name is similar tp pxe_core_get_packet(), + /* NOTE: pxe_core_recv_packets() name is similar tp pxe_core_get_packet(), * may be renaming is needed. */ int func = PXENV_UNDI_ISR_IN_PROCESS; @@ -542,7 +540,7 @@ if (!drop_flag) { - pxe_ip *iphdr = (pxe_ip *)frame_data; + PXE_IP_HDR *iphdr = (PXE_IP_HDR *)frame_data; dummy_pack.protocol = protocol; dummy_pack.state = PXE_PACKET_STATE_USING; @@ -555,9 +553,9 @@ pxe_arp_protocol(&dummy_pack, PXE_CORE_FRAG, NULL); ++processed_packets; - /* aasume ARP packet always in opne fragment */ + /* aasume ARP packet always in one fragment */ - func = PXE_UNDI_ISR_IN_GET_NEXT; + func = PXENV_UNDI_ISR_IN_GET_NEXT; goto packet_start; } @@ -579,7 +577,10 @@ /* trying to get free packets by sending and dropping */ pack = pxe_core_alloc_packet(buffer_size); - /* failed to alloc packet, dropping packet */ + /* failed to alloc packet, dropping packet + * NOTE: may be good idea, simply abort current receive cycle, + * and wait if some protocol will free packet + */ if (pack == NULL) { ++packets_dropped; drop_flag = 1; @@ -598,7 +599,7 @@ while (received < buffer_size) { - if (!pxe_core_get_packet(PXENV_UNDI_ISR_GET_NEXT, undi_isr)) + if (!pxe_core_get_packet(PXENV_UNDI_ISR_IN_GET_NEXT, undi_isr)) break; frame_size = undi_isr->FrameLength; @@ -625,7 +626,7 @@ pack->user_data = NULL; ++packets_received; - pxe_ip *iphdr=(pxe_ip *)pack->data; + PXE_IP_HDR *iphdr=(PXE_IP_HDR *)pack->data; /* TODO: calc ip checksum */ pack->protocol = protocol; @@ -640,19 +641,19 @@ ++processed_packets; /* received one or more packets, but need check if there are any others */ - func = PXE_UNDI_ISR_IN_GET_NEXT; + func = PXENV_UNDI_ISR_IN_GET_NEXT; goto packet_start; /* never getting here */ - return (0); + return (0); } /* * recieves in packet data */ int -pxe_core_recieve(pxe_packet *pack, void *frame_data, size_t frame_size) +pxe_core_recieve(PXE_PACKET *pack, void *frame_data, size_t frame_size) { /* check to be sure */ @@ -671,7 +672,7 @@ /* * allocates packet, creates buffer for data if necessary */ -pxe_packet * +PXE_PACKET * pxe_core_alloc_packet(size_t packet_size) { int i = 1; /* packet index */ @@ -694,6 +695,7 @@ /* failed to allocate enough memory for packet */ if (data == NULL) { core_packets[i].data_size = 0; + pxe_mutex_free(&core_mutex, PXE_OWNER_CORE); return (NULL); } @@ -713,7 +715,7 @@ * drops choosed packet */ void -pxe_core_drop(pxe_packet *pack) +pxe_core_drop(PXE_PACKET *pack) { pxe_mutex_own(&core_mutex, PXE_OWNER_CORE); @@ -742,6 +744,6 @@ const MAC_ADDR* pxe_get_mymac() { - return &nic_mac; + return (const MAC_ADDR *)&nic_mac; } ==== //depot/projects/soc2007/taleks-pxe_http/pxe_core.h#7 (text+ko) ==== @@ -4,6 +4,7 @@ #include #include +#include "pxe.h" /* PXE structures and function codes #include "sys/boot/libi386/pxe.h" */ @@ -32,7 +33,7 @@ uint8_t protocol; /* protocol, used in packet */ uint8_t state; /* state of packet (PXE_PACKET_STATE_ ... ) */ - + void* data; /* pointer to buffer with packet data */ size_t data_size; /* size of packet data */ @@ -56,17 +57,18 @@ 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(); -/* recieves one packet if it's waiting */ + +/* recieves all packets if it's waiting in queue, and calls protocols if needed */ int pxe_core_recv_packets(); /* calls PXE/UNDI API, registers of processor must be filled in with @@ -81,10 +83,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(); @@ -92,13 +94,14 @@ #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 ip_proto, pxe_protocol_call proc); /* returns NIC ip */ uint32_t pxe_get_myip32(); + /* returns NIC MAC */ const MAC_ADDR *pxe_get_mymac(); ==== //depot/projects/soc2007/taleks-pxe_http/pxe_icmp.c#5 (text+ko) ==== @@ -10,7 +10,7 @@ static pinging = 0; int -pxe_icmp_callback(pxe_packet *pack, uint8_t function, void *data) +pxe_icmp_callback(PXE_PACKET *pack, uint8_t function, void *data) { /* we don't store icmp packets, so they cannot steal memory @@ -27,18 +27,18 @@ */ /* icmp header*/ - pxe_ip *iphdr = pack->data; + PXE_IP_HDR *iphdr = (PXE_IP_HDR *)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; + size_t data_size = iphdr->length - iphdr_len - sizeof(PXE_IP_HDR); + PXE_ICMP_HDR *icmphdr = (PXE_ICMP_HDR *)(pack->data + sizeof(PXE_IP_HDR) + iphdr_len); /* 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; + PXE_PACKET *pack_out = NULL; + PXE_IP_HDR *reply_iphdr = NULL; + PXE_ICMP_HDR *reply_icmphdr = NULL; + size_t reply_size = sizeof(PXE_IP_HDR) + sizeof(PXE_ICMP_HDR) + data_size; /* we are interested only in echo related packets*/ switch(icmphdr->code) { @@ -63,35 +63,35 @@ } /* all we need now is echo reply */ - pxe_packet* pack_out = pxe_core_alloc_packet(reply_size); + pack_out = pxe_core_alloc_packet(reply_size); - if (pack == NULL) { + if (pack_out == NULL) { /* TO THINK: failed to allocate packet, * may be it's better to use * statically allocated packet. */ - return 0; + return (0); } - reply_iphdr = (pxe_ip *)pack_out->data; - reply_icmphdr = (pxe_icmp *)(reply_iphdr + 1); + reply_iphdr = (PXE_IP_HDR *)pack_out->data; + reply_icmphdr = (PXE_ICMP_HDR *)(reply_iphdr + 1); reply_icmphdr->type = PXE_ICMP_ECHO_REPLY; /* copying same values */ reply_icmphdr->code = icmphdr->code; reply_icmphdr->seq_num = icmphdr->seq_num; - reply_icmphdr->packet_id = icmphdr->reply_icmphdr; + reply_icmphdr->packet_id = icmphdr->packet_id; reply_icmphdr->checksum = 0; reply_icmphdr->checksum = - ~(le2be16(pxe_ip_checksum(reply_icmphdr, sizeof(pxe_icmp)))); + ~(le2be16(pxe_ip_checksum(reply_icmphdr, sizeof(PXE_ICMP_HDR)))); pxe_ip_hdr(pack_out->data, iphdr->src_ip, 0x01, reply_size, 0); /* copying all data from request packet to reply packet, * starting after headers */ - pxe_memcpy(reply_icmphdr + 1, pack->data + iphdr_len + sizeof(pxe_icmp), + pxe_memcpy(reply_icmphdr + 1, pack->data + iphdr_len + sizeof(PXE_ICMP_HDR), data_size); pxe_core_transmit(pack_out); @@ -116,15 +116,15 @@ } int -pxe_ping(pxe_ipaddr *ip, int count) +pxe_ping(PXE_IPADDR *ip, int count) { int scount = 0; /* creating packet */ - size_t pack_size = sizeof(pxe_ip) + sizeof(pxe_icmp) + 32; - pxe_packet *pack = pxe_core_alloc_packet(pack_size); - pxe_ip *iphdr = NULL; - pxe_icmp *icmphdr = NULL; + size_t pack_size = sizeof(PXE_IP_HDR) + sizeof(PXE_ICMP_HDR) + 32; + PXE_PACKET *pack = pxe_core_alloc_packet(pack_size); + PXE_IP_HDR *iphdr = NULL; + PXE_ICMP_HDR *icmphdr = NULL; if (pack == NULL) { /* failed to alloc packet */ return (0); @@ -133,8 +133,8 @@ printf("\nping: %x, bytes=32", ip->ip); pinging = ip->ip; - iphdr = (pxe_ip *)pack->data; - icmphdr = (pxe_icmp *)(pack->data + sizeof(pxe_ip)); + iphdr = (PXE_IP_HDR *)pack->data; + icmphdr = (PXE_ICMP_HDR *)(pack->data + sizeof(PXE_IP_HDR)); /* base icmp header side*/ icmphdr->type = PXE_ICMP_ECHO_REQUEST; @@ -150,7 +150,7 @@ */ /* ip header side */ - pxe_ip_hdr(pack->data, ip->ip, 0x01, pack_size, 0); + pxe_create_ip_hdr(pack->data, ip->ip, 0x01, pack_size, 0); while (scount < count) { @@ -160,8 +160,8 @@ /* recalc for every packet */ icmphdr->checksum = 0; - reply_icmphdr->checksum = - ~(le2be16(pxe_ip_checksum(icmphdr, sizeof(pxe_icmp)))); + icmphdr->checksum = + ~(le2be16(pxe_ip_checksum(icmphdr, sizeof(PXE_ICMP_HDR)))); pxe_core_transmit(pack); @@ -173,4 +173,4 @@ pinging = 0; return (scount); -}+} ==== //depot/projects/soc2007/taleks-pxe_http/pxe_icmp.h#4 (text+ko) ==== @@ -10,13 +10,13 @@ */ /* ICMP header */ -typedef struct pxe_icmp { +typedef struct pxe_icmp_hdr { uint8_t type; /* type of ICMP packet */ uint8_t code; /* code, used to identify session */ uint16_t checksum; /* ICMP header checksum */ uint16_t packet_id; /* for echo */ uint16_t seq_num; /* for echo */ -} PXE_ICMP; +} __packed PXE_ICMP_HDR; /* pxe_ping - send icmp echo request packets to host * in: @@ -25,7 +25,7 @@ * out: * successfull recieved echo's count */ -int pxe_ping(pxe_ipaddr *ip, int count); +int pxe_ping(PXE_IPADDR *ip, int count); /* pxe_icmp_init - inits icmp protocol * in: ==== //depot/projects/soc2007/taleks-pxe_http/pxe_ip.c#4 (text+ko) ==== @@ -28,10 +28,10 @@ * it may be useful later, but now it's just unused. */ void -pxe_ip_hdr(void* data, uint32_t dst_ip, uint8_t protocol, +pxe_create_ip_hdr(void* data, uint32_t dst_ip, uint8_t protocol, uint16_t size, uint16_t opts_size) { - pxe_ip *iphdr = (pxe_ip *)data; + PXE_IP_HDR *iphdr = (PXE_IP_HDR *)data; iphdr->checksum = 0; iphdr->length = size; @@ -50,8 +50,8 @@ * 0x5 [header length = 20 bytes, no opts] */ iphdr->ver_ihl = 0x45; - iphdr->ver_ihl += (opts_size >> 2) + iphdr->ver_ihl += (opts_size >> 2); iphdr->checksum = - ~le2be16(pxe_ip_chksum(data, sizeof(pxe_ip) + opts_size)); + ~le2be16(pxe_ip_chksum(data, sizeof(PXE_IP_HDR) + opts_size)); } ==== //depot/projects/soc2007/taleks-pxe_http/pxe_ip.h#3 (text+ko) ==== @@ -5,12 +5,12 @@ #include /* - * IP related code + * IP related declarations * reference: RFC791 */ /* IPv4 header */ -typedef struct pxe_ip { +typedef struct pxe_ip_hdr { uint8_t ver_ihl; /* version & IHL (size / 4 octets)*/ uint8_t tos; /* type of service */ @@ -22,7 +22,7 @@ uint16_t checksum; /* header checksum */ uint32_t src_ip; /* source ip address */ uint32_t dst_ip; /* destination ip address */ -} PXE_ICMP; +} __packed PXE_IP_HDR; /* IPv4 address */ typedef struct pxe_ipaddr { @@ -30,14 +30,14 @@ uint32_t ip; uint8_t octet[4]; }; -} PXE_IPADDR; +} __packed PXE_IPADDR; /* calculates checksum */ uint16_t pxe_ip_checksum(const void *data, size_t size); /* fills ip header data */ -void pxe_ip_hdr(void *data, uint32_t dst_ip, uint8_t protocol, uint16_t size, +void pxe_create_ip_hdr(void *data, uint32_t dst_ip, uint8_t protocol, uint16_t size, uint16_t opts_size); #endif // PXE_IP_H_INCLUDED ==== //depot/projects/soc2007/taleks-pxe_http/pxe_isr.S#3 (text+ko) ==== @@ -137,7 +137,7 @@ pushf # push flags /* - * here is calling of chained interrupt handler. Don't think it' srelly needed now + * here is calling of chained interrupt handler. Don't think it's really needed now ** * pushw %es * movw chained_irq_off+2, %ax @@ -303,7 +303,7 @@ mask_int.1: movw %bx, %cx andw $0x07, %cx - movw $0x1, %bl + movb $0x1, %bl shlb %cl, %bl andb original_mask, %bl # get the original bit for this irq ==== //depot/projects/soc2007/taleks-pxe_http/pxe_isr.h#2 (text+ko) ==== @@ -9,4 +9,6 @@ extern uint16_t __pxe_entry_off; /* PXE! API entry offset */ extern uint16_t __pxe_entry_seg; /* PXE! API entry segment */ -#endif+ extern void __isr_install(); + extern void __isr_remove(); +#endif ==== //depot/projects/soc2007/taleks-pxe_http/pxe_mutex.c#3 (text+ko) ==== @@ -4,7 +4,7 @@ * dummy implementation. Not atomic -> really dummy */ int -pxe_mutex_own(pxe_mutex *mutex, uint32_t owner) +pxe_mutex_own(PXE_MUTEX *mutex, uint32_t owner) { if (mutex->owned == PXE_MUTEX_OWNED) { @@ -22,7 +22,7 @@ } int -pxe_mutex_free(pxe_mutex *mutex, uint32_t owner) +pxe_mutex_free(PXE_MUTEX *mutex, uint32_t owner) { if (mutex->owned == PXE_MUTEX_FREE) @@ -37,13 +37,13 @@ } int -pxe_mutex_wait(pxe_mutex *mutex, uint32_t owner) +pxe_mutex_wait(PXE_MUTEX *mutex, uint32_t owner) { if (mutex->owner == owner) return (1); - /* hope for simebody will free mutex */ + /* hope for somebody will free mutex */ while ((mutex->owned == PXE_MUTEX_OWNED)) {} return (1); ==== //depot/projects/soc2007/taleks-pxe_http/pxe_mutex.h#3 (text+ko) ==== @@ -6,7 +6,7 @@ #include "pxe_mutex.h" /* - * synchronization primitives. + * synchronization primitives. NOT USED in real mode (all synchronous) */ typedef struct pxe_mutex { @@ -20,8 +20,8 @@ #define PXE_MUTEX_OWNED 0x01 #define PXE_MUTEX_FREE 0x00 -int pxe_mutex_own(pxe_mutex *mutex, uint32_t owner); -int pxe_mutex_free(pxe_mutex *mutex, uint32_t owner); -int pxe_mutex_wait(pxe_mutex *mutex, uint32_t owner); +int pxe_mutex_own(PXE_MUTEX *mutex, uint32_t owner); +int pxe_mutex_free(PXE_MUTEX *mutex, uint32_t owner); +int pxe_mutex_wait(PXE_MUTEX *mutex, uint32_t owner); #endif // PXE_MUTEX_H_INCLUDED ==== //depot/projects/soc2007/taleks-pxe_http/pxe_sock.c#3 (text+ko) ==== @@ -3,7 +3,7 @@ #include "pxe_tcp.h" -pxe_socket pxe_sockets[PXE_DEFAULT_SOCKETS]; +PXE_SOCKET pxe_sockets[PXE_DEFAULT_SOCKETS]; int pxe_sockets_init() @@ -64,7 +64,7 @@ int pxe_recv(int socket, void *buf, size_t buflen) { - pxe_socket* sock = &pxe_sockets[socket]; + PXE_SOCKET *sock = &pxe_sockets[socket]; if (sock->sendbuffer.leftbuf < buflen) { } ==== //depot/projects/soc2007/taleks-pxe_http/pxe_sock.h#3 (text+ko) ==== @@ -25,17 +25,17 @@ } PXE_BUFFER; typedef struct pxe_socket { - pxe_buffer send_buffer; - pxe_buffer recv_buffer; + PXE_BUFFER send_buffer; + PXE_BUFFER recv_buffer; uint32_t sent; uint32_t recv; uint8_t state; - pxe_ipaddr local_ip; + PXE_IPADDR local_ip; uint16_t local_port; - pxe_ipaddr remote_ip; + PXE_IPADDR remote_ip; uint16_t remote_port; uint32_t last_time_sent;