From owner-p4-projects@FreeBSD.ORG Tue Aug 7 16:17:01 2007 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 9E18D16A41B; Tue, 7 Aug 2007 16:17:01 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 5A80B16A419 for ; Tue, 7 Aug 2007 16:17:01 +0000 (UTC) (envelope-from taleks@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 5084013C491 for ; Tue, 7 Aug 2007 16:17:01 +0000 (UTC) (envelope-from taleks@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id l77GH1Vl086691 for ; Tue, 7 Aug 2007 16:17:01 GMT (envelope-from taleks@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id l77GH0or086686 for perforce@freebsd.org; Tue, 7 Aug 2007 16:17:00 GMT (envelope-from taleks@FreeBSD.org) Date: Tue, 7 Aug 2007 16:17:00 GMT Message-Id: <200708071617.l77GH0or086686@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 124834 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: Tue, 07 Aug 2007 16:17:02 -0000 http://perforce.freebsd.org/chv.cgi?CH=124834 Change 124834 by taleks@taleks_th on 2007/08/07 16:16:08 all: most of all ip4 related uint32_t replaced by PXE_IPADDR. May be usefuil n future. pxe_dhcp: updated pxe_dhcp_query() in case of bootp() call. pxe_core: removed unused functions, updated pxe_core_init(), returned static buffers support. loader.rc: added as example of .rc-script, used during testing of RAM drive loading. Affected files ... .. //depot/projects/soc2007/taleks-pxe_http/Makefile#13 edit .. //depot/projects/soc2007/taleks-pxe_http/httpfs.c#6 edit .. //depot/projects/soc2007/taleks-pxe_http/libi386_mod/Makefile#1 add .. //depot/projects/soc2007/taleks-pxe_http/libi386_mod/pxe.c#3 edit .. //depot/projects/soc2007/taleks-pxe_http/loader_mod/loader.rc#1 add .. //depot/projects/soc2007/taleks-pxe_http/pxe_arp.c#15 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_arp.h#10 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_await.c#4 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_connection.c#12 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_connection.h#9 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_core.c#25 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_core.h#21 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_dhcp.c#8 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_dhcp.h#8 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_dns.c#7 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_dns.h#6 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_filter.c#8 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_filter.h#6 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_http.c#10 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_http.h#7 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_icmp.c#14 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_icmp.h#9 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_ip.c#15 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_ip.h#10 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_segment.c#10 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_sock.c#18 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_sock.h#16 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_tcp.c#13 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_udp.c#10 edit .. //depot/projects/soc2007/taleks-pxe_http/pxe_udp.h#7 edit Differences ... ==== //depot/projects/soc2007/taleks-pxe_http/Makefile#13 (text+ko) ==== @@ -34,4 +34,7 @@ #CFLAGS+= -DPXE_HTTP_DEBUG #CFLAGS+= -DPXE_HTTP_DEBUG_HELL +# define to get more PXE related code and testing functions +CFLAGS+= -DPXE_MORE + .include ==== //depot/projects/soc2007/taleks-pxe_http/httpfs.c#6 (text+ko) ==== @@ -87,7 +87,7 @@ pxe_memset(httpfile, 0, sizeof(PXE_HTTP_HANDLE)); - httpfile->ip = pxe_get_ip32(PXE_IP_WWW); + pxe_memcpy(pxe_get_ip(PXE_IP_WWW), &httpfile->addr, sizeof(PXE_IPADDR)); httpfile->offset = 0; httpfile->socket = -1; @@ -100,10 +100,7 @@ /* TODO: may be implement getting name by PTR resource records */ - PXE_IPADDR server; - server.ip = httpfile->ip; - - httpfile->servername = strdup(inet_ntoa(server.ip)); + httpfile->servername = strdup(inet_ntoa(httpfile->addr.ip)); if (httpfile->servername == NULL) { handle_cleanup(httpfile); ==== //depot/projects/soc2007/taleks-pxe_http/libi386_mod/pxe.c#3 (text+ko) ==== @@ -201,13 +201,17 @@ } - if (pxe_get_ip32(PXE_IP_ROOT) == 0) { + const PXE_IPADDR *addr = pxe_get_ip(PXE_IP_ROOT); + + if (addr->ip == 0) { #ifdef PXE_BOOTP_USE_LIBSTAND pxe_dhcp_query(0); - if (pxe_get_ip32(PXE_IP_ROOT) == 0) - pxe_set_ip32(PXE_IP_ROOT, - pxe_get_ip32(PXE_IP_SERVER)); + addr = pxe_get_ip(PXE_IP_ROOT); + + if (addr->ip == 0) + pxe_set_ip(PXE_IP_ROOT, + pxe_get_ip(PXE_IP_SERVER)); #endif if (!rootpath[1]) @@ -220,9 +224,12 @@ if (i && i != FNAME_SIZE && rootpath[i] == ':') { rootpath[i++] = '\0'; - if (inet_addr(&rootpath[0]) != INADDR_NONE) - pxe_set_ip32(PXE_IP_ROOT, - inet_addr(&rootpath[0])); + if (inet_addr(&rootpath[0]) != INADDR_NONE) { + + PXE_IPADDR root_addr; + root_addr.ip = inet_addr(&rootpath[0]); + pxe_set_ip(PXE_IP_ROOT, &root_addr); + } pxe_memcpy(&rootpath[i], &temp[0], strlen(&rootpath[i])+1); @@ -233,7 +240,7 @@ struct in_addr tmp_in; - tmp_in.s_addr = pxe_get_ip32(PXE_IP_ROOT); + tmp_in.s_addr = pxe_get_ip(PXE_IP_ROOT)->ip; #ifdef PXE_DEBUG printf("pxe_open: server addr: %s\n", inet_ntoa(tmp_in)); @@ -241,17 +248,17 @@ setenv("boot.nfsroot.server", inet_ntoa(tmp_in), 1); - tmp_in.s_addr = pxe_get_ip32(PXE_IP_GATEWAY); + tmp_in.s_addr = pxe_get_ip(PXE_IP_GATEWAY)->ip; setenv("boot.netif.gateway", inet_ntoa(tmp_in), 1); #ifdef PXE_DEBUG printf("pxe_open: server path: %s\n", rootpath); printf("pxe_open: gateway ip: %s\n", inet_ntoa(tmp_in)); #endif - tmp_in.s_addr = pxe_get_ip32(PXE_IP_MY); + tmp_in.s_addr = pxe_get_ip(PXE_IP_MY)->ip; setenv("boot.netif.ip", inet_ntoa(tmp_in), 1); - tmp_in.s_addr = pxe_get_ip32(PXE_IP_NETMASK); + tmp_in.s_addr = pxe_get_ip(PXE_IP_NETMASK)->ip; setenv("boot.netif.netmask", inet_ntoa(tmp_in), 1); sprintf(temp, "%6D", pxe_get_mymac(), ":"); @@ -260,11 +267,11 @@ setenv("boot.nfsroot.path", rootpath, 1); #ifdef PXEHTTP_UDP_FOR_LIBSTAND - gateip.s_addr = pxe_get_ip32(PXE_IP_GATEWAY); - rootip.s_addr = pxe_get_ip32(PXE_IP_ROOT); - netmask = pxe_get_ip32(PXE_IP_NETMASK); - myip.s_addr = pxe_get_ip32(PXE_IP_MY); - nameip.s_addr = pxe_get_ip32(PXE_IP_NAMESERVER); + gateip.s_addr = pxe_get_ip(PXE_IP_GATEWAY)->ip; + rootip.s_addr = pxe_get_ip(PXE_IP_ROOT)->ip; + netmask = pxe_get_ip(PXE_IP_NETMASK)->ip; + myip.s_addr = pxe_get_ip(PXE_IP_MY)->ip; + nameip.s_addr = pxe_get_ip(PXE_IP_NAMESERVER)->ip; #endif } } @@ -328,7 +335,10 @@ t_PXENV_UDP_OPEN *udpopen_p = (t_PXENV_UDP_OPEN *)scratch_buffer; bzero(udpopen_p, sizeof(*udpopen_p)); - udpopen_p->src_ip = pxe_get_ip32(PXE_IP_MY); + + const PXE_IPADDR *my = pxe_get_ip(PXE_IP_MY); + udpopen_p->src_ip = my->ip; + pxe_core_call(PXENV_UDP_OPEN); if (udpopen_p->status != 0) { @@ -365,13 +375,14 @@ #ifdef PXE_DEBUG printf("pxe_netif_init(): called.\n"); #endif - uint8_t* mac = pxe_get_mymac(); + uint8_t *mac = pxe_get_mymac(); int i; for (i = 0; i < 6; ++i) desc->myea[i] = mac[i]; - - desc->xid = pxe_get_ip32(PXE_IP_MY); + + const PXE_IPADDR *my = pxe_get_ip(PXE_IP_MY); + desc->xid = my->ip; } static int @@ -458,8 +469,11 @@ inet_ntoa(h->destip), ntohs(h->destport)); #endif void *ipdata = pkt - sizeof(PXE_UDP_PACKET); + + PXE_IPADDR dst; + dst.ip = h->destip.s_addr; - if (!pxe_udp_send(ipdata, h->destip.s_addr, ntohs(h->destport), + if (!pxe_udp_send(ipdata, &dst, ntohs(h->destport), ntohs(h->myport), len + sizeof(PXE_UDP_PACKET))) { printf("sendudp(): failed\n"); ==== //depot/projects/soc2007/taleks-pxe_http/pxe_arp.c#15 (text+ko) ==== @@ -68,11 +68,13 @@ /* 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_ip32(PXE_IP_MY); + + const PXE_IPADDR *addr = pxe_get_ip(PXE_IP_MY);; + packet_to_send.body.src_paddr = addr->ip; /* filling entry for own ip/mac*/ pxe_memcpy(pxe_get_mymac(), arp_table[MAX_ARP_ENTRIES].mac, 6); - arp_table[MAX_ARP_ENTRIES].ip4.ip = pxe_get_ip32(PXE_IP_MY); + arp_table[MAX_ARP_ENTRIES].addr.ip = addr->ip; /* setting broadcast target address */ pxe_memset(packet_to_send.body.target_hwaddr, 0xff, 6); @@ -96,7 +98,7 @@ for (; entry < MAX_ARP_ENTRIES + 1; ++entry) { - if (arp_table[entry].ip4.ip == ip) { + if (arp_table[entry].addr.ip == ip) { uint8_t *mac = &arp_table[entry].mac[0]; #ifdef PXE_ARP_DEBUG_HELL @@ -124,21 +126,18 @@ for (; entry < limit; ++entry) { - PXE_IPADDR ip; - uint8_t *mac = arp_table[entry].mac; - ip.ip = arp_table[entry].ip4.ip; - - if ( (ip.ip == 0) || (mac == NULL) ) + if ( (arp_table[entry].addr.ip == 0) || + (arp_table[entry].mac == NULL) ) continue; - printf("%d.%d.%d.%d\t%2x:%2x:%2x:%2x:%2x:%2x\n", - ip.octet[0], ip.octet[1], ip.octet[2], ip.octet[3], - mac[0], mac[1], mac[2], mac[3], mac[4], mac[5] - ); + printf("%s\t%6D\n", + inet_ntoa(arp_table[entry].addr.ip), + arp_table[entry].mac, ":"); } } -#endif +#endif /* PXE_MORE */ + /* * pxe_arp_protocol() - process received arp packet, this function is called in * style of pxe_protocol_call function type, but last @@ -162,12 +161,14 @@ uint8_t *mac_src = arp_reply->body.src_hwaddr; uint8_t *mac_dst = arp_reply->body.target_hwaddr; PXE_IPADDR ip4_src; - PXE_IPADDR ip4_dst; + PXE_IPADDR ip4_dst; + + const PXE_IPADDR *addr = pxe_get_ip(PXE_IP_MY); ip4_src.ip = arp_reply->body.src_paddr; ip4_dst.ip = arp_reply->body.target_paddr; - if (ip4_src.ip == pxe_get_ip32(PXE_IP_MY)) { + if (ip4_src.ip == addr->ip) { /* got broadcast send by us */ #ifdef PXE_ARP_DEBUG_HELL printf("arp request from myself ignored.\n"); @@ -176,21 +177,15 @@ } #ifdef PXE_ARP_DEBUG - printf("arp request from %x:%x:%x:%x:%x:%x/%d.%d.%d.%d\n\t" - " to: %x:%x:%x:%x:%x:%x/%d.%d.%d.%d\n", - mac_src[0], mac_src[1], mac_src[2], - mac_src[3], mac_src[4], mac_src[5], - ip4_src.octet[0], ip4_src.octet[1], - ip4_src.octet[2], ip4_src.octet[3], - mac_dst[0], mac_dst[1], mac_dst[2], - mac_dst[3], mac_dst[4], mac_dst[5], - ip4_dst.octet[0], ip4_dst.octet[1], - ip4_dst.octet[2], ip4_dst.octet[3] - ); + printf("arp request from %6D/%s\n\t", + mac_src, ":", inet_ntoa(ip4_src.ip)); + + printf("to: %6D/%s\n", + mac_dst, ":", inet_ntoa(ip4_dst.ip)); #endif /* somebody is looking for us */ - if (ip4_dst.ip == arp_table[MAX_ARP_ENTRIES].ip4.ip) { + if (ip4_dst.ip == arp_table[MAX_ARP_ENTRIES].addr.ip) { pxe_memcpy(arp_reply->body.src_hwaddr, packet_to_send.body.target_hwaddr, 6); @@ -262,7 +257,7 @@ 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 = + arp_table[arp_usage % MAX_ARP_ENTRIES].addr.ip = arp_reply->body.src_paddr; ++arp_usage; @@ -325,7 +320,7 @@ switch (function) { case PXE_AWAIT_STARTTRY: /* handle start of new try */ - if (!pxe_arp_send_whois(wait_data->ip)) { + if (!pxe_arp_send_whois(wait_data->addr.ip)) { /* failed to send request, try once more * after waiting a little */ @@ -338,7 +333,7 @@ /* check if ARP protocol was called and * arp_table updated */ - res = pxe_arp_table_search(wait_data->ip); + res = pxe_arp_table_search(wait_data->addr.ip); if (res != NULL) { wait_data->mac = res; return (PXE_AWAIT_COMPLETED); @@ -370,9 +365,9 @@ * not NULL - pointer to MAC address */ const MAC_ADDR * -pxe_arp_ip4mac(uint32_t ip) +pxe_arp_ip4mac(const PXE_IPADDR *addr) { - const MAC_ADDR *res = pxe_arp_table_search(ip); + const MAC_ADDR *res = pxe_arp_table_search(addr->ip); if (res != NULL) return (res); @@ -381,7 +376,7 @@ #endif PXE_ARP_WAIT_DATA wait_data; - wait_data.ip = ip; + wait_data.addr.ip = addr->ip; wait_data.mac = NULL; pxe_await(pxe_arp_await, PXE_MAX_ARP_TRY, PXE_TIME_TO_DIE, &wait_data); ==== //depot/projects/soc2007/taleks-pxe_http/pxe_arp.h#10 (text+ko) ==== @@ -52,7 +52,7 @@ #define PXE_ARP_SNIFF typedef struct pxe_arp_entry { - PXE_IPADDR ip4; + PXE_IPADDR addr; MAC_ADDR mac; } PXE_ARP_ENTRY; @@ -61,7 +61,7 @@ void pxe_arp_init(); /* find MAC by provided ip */ -const MAC_ADDR *pxe_arp_ip4mac(uint32_t ip); +const MAC_ADDR *pxe_arp_ip4mac(const PXE_IPADDR *addr); /* protocol handler for received packets */ int pxe_arp_protocol(PXE_PACKET *pack, uint8_t function); @@ -99,7 +99,7 @@ } __packed PXE_ARP_PACK_DATA; typedef struct pxe_arp_wait_data { - uint32_t ip; + PXE_IPADDR addr; const MAC_ADDR *mac; } PXE_ARP_WAIT_DATA; ==== //depot/projects/soc2007/taleks-pxe_http/pxe_await.c#4 (text+ko) ==== @@ -116,4 +116,3 @@ */ return (0); } - ==== //depot/projects/soc2007/taleks-pxe_http/pxe_connection.c#12 (text+ko) ==== @@ -252,11 +252,11 @@ connection->dst_port = filter->src_port; connection->src_port = filter->dst_port; - connection->dst_ip = filter->src_ip; + connection->dst.ip = filter->src.ip; connection->next_recv = 0; /* NOTE: need to make more correct initial number */ - connection->iss = (filter->src_ip + filter->dst_ip) + + connection->iss = (filter->src.ip + filter->dst.ip) + (uint32_t)pxe_get_secs(); connection->next_send = connection->iss; @@ -688,4 +688,4 @@ connection->iss, connection->irs); } } -#endif+#endif /* PXE_MORE */ ==== //depot/projects/soc2007/taleks-pxe_http/pxe_connection.h#9 (text+ko) ==== @@ -79,7 +79,7 @@ uint16_t src_port; /* source port */ uint16_t dst_port; /* destination port */ - uint32_t dst_ip; /* destination ip */ + PXE_IPADDR dst; /* destination ip */ PXE_BUFFER *recv; /* recieve buffer */ PXE_BUFFER *send; /* send buffer */ ==== //depot/projects/soc2007/taleks-pxe_http/pxe_core.c#25 (text+ko) ==== @@ -46,22 +46,22 @@ * the only difference - installation of isr, that was not needed in pxe.c. */ -/* calls PXE/UNDI API, registers of processor must be filled in with - * appropriate values. - */ -/* static int pxe_core_call(int func); */ /* stores data in packet */ static int pxe_core_recieve(PXE_PACKET *pack, void *data, size_t size); uint8_t *scratch_buffer = NULL; uint8_t *data_buffer = NULL; +#ifdef PXE_CORE_STATIC_BUFFERS +static uint8_t static_scratch_buffer[PXE_BUFFER_SIZE]; +static uint8_t static_data_buffer[PXE_BUFFER_SIZE]; +#endif + #ifdef PXE_EXCLUSIVE static uint8_t exclusive_protocol = 0; #endif static pxenv_t *pxenv = NULL; /* PXENV+ */ static pxe_t *pxe = NULL; /* !PXE */ -/* static BOOTPLAYER* bootplayer; /* pointer PXE Cached information. */ /* pxe core structures*/ /* current processing packet */ @@ -76,61 +76,6 @@ static int pxe_state = PXE_DOWN; -/* pxe_core_undi_startup() - performs UNDI startup call during pxe_core_init() - * in: - * none - * out: - * 1 - success - * 0 - failed - */ -int -pxe_core_undi_startup() -{ - t_PXENV_UNDI_STARTUP *undi_startup = - (t_PXENV_UNDI_STARTUP *)scratch_buffer; - -#ifdef PXE_CORE_DEBUG - printf("pxe_core_undi_startup(): started\n"); -#endif - - undi_startup->Status = 0; - - int status = pxe_core_call(PXENV_UNDI_STARTUP); - - if (!status) - printf("pxe_core_undi_startup(): status 0x%x\n", - undi_startup->Status); - - return (status); -} - -/* pxe_core_undi_init() - performs UNDI initialization - * in: - * none - * out: - * 1 - success - * 0 - failed - */ -int pxe_core_undi_init() -{ - t_PXENV_UNDI_INITIALIZE *undi_init = - (t_PXENV_UNDI_INITIALIZE *)scratch_buffer; - -#ifdef PXE_CORE_DEBUG - printf("pxe_core_undi_init(): started\n"); -#endif - - pxe_memset(undi_init, 0, sizeof(t_PXENV_UNDI_INITIALIZE)); - - int status = pxe_core_call(PXENV_UNDI_INITIALIZE); - - if (!status) - printf("pxe_core_undi_init(): status 0x%x\n", - undi_init->Status); - - return (status); -} - /* pxe_core_init() - performs initialization of all PXE related code * in: * pxenv_p - pointer to PXENV+ structure @@ -162,6 +107,7 @@ pxenv = pxenv_p; pxe = pxe_p; +#ifndef PXE_CORE_STATIC_BUFFERS /* 0. initing scratch and data buffers */ data_buffer = pxe_alloc(PXE_BUFFER_SIZE); @@ -175,7 +121,10 @@ pxe_free(data_buffer); return (0); } - +#else + data_buffer = static_data_buffer; + scratch_buffer = static_scratch_buffer; +#endif /* 1. determine PXE API entry point */ if(pxenv_p == NULL) return (0); @@ -262,9 +211,9 @@ /* getting Boot Server Discovery reply */ /* pointer to PXE Cached information. */ - BOOTPLAYER* bootplayer = data_buffer; + BOOTPLAYER* bootplayer = (BOOTPLAYER *)data_buffer; + gci_p->PacketType = PXENV_PACKET_TYPE_BINL_REPLY; - gci_p->BufferSize = sizeof(BOOTPLAYER); gci_p->Buffer.segment = VTOPSEG(bootplayer); gci_p->Buffer.offset = VTOPOFF(bootplayer); @@ -302,30 +251,37 @@ } /* showing information about NIC */ - PXE_IPADDR nic_ip; - - nic_ip.ip = bootplayer->yip; /* my ip */ - printf("my ip: %d.%d.%d.%d\n", - nic_ip.octet[0], nic_ip.octet[1], nic_ip.octet[2], nic_ip.octet[3]); + PXE_IPADDR addr; + addr.ip = bootplayer->yip; /* my ip */ + + printf("my ip: %s\n", inet_ntoa(addr.ip)); /* my MAC */ pxe_memcpy(&bootplayer->CAddr, &nic_mac, MAC_ADDR_LEN); printf("my MAC: %6D\n", nic_mac, ":"); /* setting default ips*/ - pxe_set_ip32(PXE_IP_MY, bootplayer->yip); /* nic ip */ - pxe_set_ip32(PXE_IP_SERVER, bootplayer->sip); /* boot server ip */ + pxe_set_ip(PXE_IP_MY, &addr); /* nic ip */ + + addr.ip = bootplayer->sip; /* boot server ip */ + pxe_set_ip(PXE_IP_SERVER, &addr); + + /* setting next to default ip (boot server ip) */ + /* nameserver ip*/ + pxe_set_ip(PXE_IP_NAMESERVER, &addr); + /* gateway ip */ + pxe_set_ip(PXE_IP_GATEWAY, &addr); + - /* nameserver ip, default to 192.168.0.1 */ - pxe_set_ip32(PXE_IP_NAMESERVER, 0x0100a8c0); - /* gateway ip, default to 192.168.0.1 */ - pxe_set_ip32(PXE_IP_GATEWAY, 0x0100a8c0); + /* web server */ + addr.ip = 0; + pxe_set_ip(PXE_IP_WWW, &addr); + + addr.ip = 0xffffffff; /* netmask, default to 255.255.255.0 */ - pxe_set_ip32(PXE_IP_NETMASK, 0x00ffffff); + pxe_set_ip(PXE_IP_NETMASK, &addr); /* broadcast address, default to 255.255.255.255 */ - pxe_set_ip32(PXE_IP_BROADCAST, 0xffffffff); - /* web server */ - pxe_set_ip32(PXE_IP_WWW, 0x0); + pxe_set_ip(PXE_IP_BROADCAST, &addr); /* initing modules */ pxe_arp_init(); @@ -345,7 +301,7 @@ pxe_dhcp_query(bootplayer->ident); #endif /* initing route tables, using DHCP reply data */ - pxe_ip_route_init(pxe_get_ip32(PXE_IP_GATEWAY)); + pxe_ip_route_init(pxe_get_ip(PXE_IP_GATEWAY)); #ifdef PXE_CORE_DEBUG printf("pxe_core_init(): ended.\n"); @@ -492,13 +448,14 @@ t_PXENV_UNDI_SHUTDOWN *undi_shutdown_p = (t_PXENV_UNDI_SHUTDOWN *)scratch_buffer; - -/* pxe_core_call(PXENV_UNDI_SHUTDOWN); +/* + pxe_core_call(PXENV_UNDI_SHUTDOWN); pxe_core_call(PXENV_UNLOAD_STACK); */ +#ifndef PXE_CORE_STATIC_BUFFERS pxe_free(scratch_buffer); pxe_free(data_buffer); - +#endif /* make pxe_core_call() unavailable */ pxe_state = PXE_DOWN; @@ -1030,22 +987,22 @@ return (const MAC_ADDR *)&nic_mac; } -/* pxe_get_ip32() - returns ip related data, specified by id parameter +/* pxe_get_ip() - returns ip related data, specified by id parameter * in: * id - id of needed data (PXE_IP_ constants) * out: * associated with this id value */ -uint32_t -pxe_get_ip32(uint8_t id) +const PXE_IPADDR * +pxe_get_ip(uint8_t id) { if (id < PXE_IP_MAX) - return (core_ips[id].ip); + return (&core_ips[id]); return (0); } -/* pxe_set_ip32() - sets ip related data, specified by id parameter +/* pxe_set_ip() - sets ip related data, specified by id parameter * in: * id - id of needed data (PXE_IP_ constants) * new_ip - new uint32_t data @@ -1053,10 +1010,10 @@ * none */ void -pxe_set_ip32(uint8_t id, uint32_t new_ip) +pxe_set_ip(uint8_t id, const PXE_IPADDR *new_ip) { if (id < PXE_IP_MAX) { - core_ips[id].ip = new_ip; + pxe_memcpy(new_ip, &core_ips[id], sizeof(PXE_IPADDR)); } } ==== //depot/projects/soc2007/taleks-pxe_http/pxe_core.h#21 (text+ko) ==== @@ -37,9 +37,16 @@ #include #include "../libi386/pxe.h" +#include "pxe_ip.h" #define PXE_BUFFER_SIZE 0x0800 +/* define to use statically allocated buffers */ +#define PXE_CORE_STATIC_BUFFERS + +/* packet states for packets, used by pxe_core. + * Currently (only one packet at any time) - is unused. + */ #define PXE_PACKET_STATE_FREE 0 #define PXE_PACKET_STATE_USING 1 @@ -134,8 +141,8 @@ #define PXE_IP_WWW 7 #define PXE_IP_ROOT 7 #define PXE_IP_MAX 8 -uint32_t pxe_get_ip32(uint8_t id); -void pxe_set_ip32(uint8_t id, uint32_t ip); +const PXE_IPADDR *pxe_get_ip(uint8_t id); +void pxe_set_ip(uint8_t id, const PXE_IPADDR *ip); /* returns time in seconds */ time_t pxe_get_secs(); ==== //depot/projects/soc2007/taleks-pxe_http/pxe_dhcp.c#8 (text+ko) ==== @@ -29,6 +29,7 @@ #include "pxe_core.h" #include "pxe_dhcp.h" +#include "pxe_ip.h" #ifdef PXE_BOOTP_USE_LIBSTAND #include @@ -96,19 +97,19 @@ case PXE_DHCP_OPT_NETMASK: printf("netmask: %d.%d.%d.%d\n", *(p + 1), *(p + 2), *(p + 3), *(p + 4)); - result->netmask = *((uint32_t *)(p + 1)); + result->netmask.ip = *((uint32_t *)(p + 1)); break; case PXE_DHCP_OPT_ROUTER: printf("first router: %d.%d.%d.%d\n", *(p + 1), *(p + 2), *(p + 3), *(p + 4)); - result->gw = *((uint32_t *)(p + 1)); + result->gw.ip = *((uint32_t *)(p + 1)); break; case PXE_DHCP_OPT_NAMESERVER: printf("first nameserver: %d.%d.%d.%d\n", *(p + 1), *(p + 2), *(p + 3), *(p + 4)); - result->ns = *((uint32_t *)(p + 1)); + result->ns.ip = *((uint32_t *)(p + 1)); break; case PXE_DHCP_OPT_TYPE: @@ -122,7 +123,7 @@ case PXE_DHCP_OPT_WWW_SERVER: printf("www server ip: %d.%d.%d.%d\n", *(p + 1), *(p + 2), *(p + 3), *(p + 4)); - result->www = *((uint32_t *)(p + 1)); + result->www.ip = *((uint32_t *)(p + 1)); break; case PXE_DHCP_OPT_ROOTPATH: @@ -154,7 +155,7 @@ case PXE_DHCP_OPT_BROADCAST_IP: printf("broadcast: %d.%d.%d.%d\n", *(p + 1), *(p + 2), *(p + 3), *(p + 4)); - result->bcast_addr = *((uint32_t *)(p + 1)); + result->bcast_addr.ip = *((uint32_t *)(p + 1)); break; case PXE_DHCP_OPT_ID: @@ -205,7 +206,9 @@ dhcp_hdr->hops = 0; dhcp_hdr->secs = 0; dhcp_hdr->xid = wait_data->xid; - dhcp_hdr->ciaddr = pxe_get_ip32(PXE_IP_MY); + + const PXE_IPADDR *my = pxe_get_ip(PXE_IP_MY); + dhcp_hdr->ciaddr = my->ip; dhcp_hdr->magic = htonl(PXE_MAGIC_DHCP); pxe_memcpy(pxe_get_mymac(), dhcp_hdr->chaddr, dhcp_hdr->hlen); @@ -233,10 +236,10 @@ options = add_option(options, PXE_DHCP_OPT_TYPE, &message_type, 1); /* requesting for my ip */ - uint32_t client_ip = pxe_get_ip32(PXE_IP_MY); + const PXE_IPADDR *client_ip = pxe_get_ip(PXE_IP_MY); options = add_option(options, PXE_DHCP_OPT_REQUEST_IP, - &client_ip, sizeof(client_ip)); + &(client_ip->ip), sizeof(client_ip->ip)); /* end of options */ options = add_option(options, PXE_DHCP_OPT_END, NULL, 0); @@ -258,7 +261,10 @@ return (0); } - if (send_size != pxe_sendto(socket, PXE_IP_BCAST, PXE_DHCP_SERVER_PORT, + PXE_IPADDR bcast; + bcast.ip = PXE_IP_BCAST; + + if (send_size != pxe_sendto(socket, &bcast, PXE_DHCP_SERVER_PORT, wait_data->data, send_size)) { printf("dhcp_send_request(): failed to send DHCP request.\n"); @@ -314,20 +320,20 @@ } /* if successfuly parsed, setting appropriate ip data */ - if (opts_result.ns) - pxe_set_ip32(PXE_IP_NAMESERVER, opts_result.ns); + if (opts_result.ns.ip) + pxe_set_ip(PXE_IP_NAMESERVER, &opts_result.ns); - if (opts_result.gw) - pxe_set_ip32(PXE_IP_GATEWAY, opts_result.gw); + if (opts_result.gw.ip) + pxe_set_ip(PXE_IP_GATEWAY, &opts_result.gw); - if (opts_result.netmask) - pxe_set_ip32(PXE_IP_NETMASK, opts_result.netmask); + if (opts_result.netmask.ip) + pxe_set_ip(PXE_IP_NETMASK, &opts_result.netmask); - if (opts_result.bcast_addr) - pxe_set_ip32(PXE_IP_BROADCAST, opts_result.bcast_addr); + if (opts_result.bcast_addr.ip) + pxe_set_ip(PXE_IP_BROADCAST, &opts_result.bcast_addr); - if (opts_result.www) - pxe_set_ip32(PXE_IP_WWW, opts_result.www); + if (opts_result.www.ip) + pxe_set_ip(PXE_IP_WWW, &opts_result.www); if (opts_result.rootpath[0]) strcpy(PXENFSROOTPATH, opts_result.rootpath); @@ -423,10 +429,28 @@ printf("pxe_dhcp_query(): starting libstand bootp()\n"); bootp(pxe_sock, BOOTP_PXE); - pxe_set_ip32(PXE_IP_NAMESERVER, nameip.s_addr); - pxe_set_ip32(PXE_IP_GATEWAY, gateip.s_addr); - pxe_set_ip32(PXE_IP_NETMASK, netmask); - pxe_set_ip32(PXE_IP_ROOT, rootip.s_addr); + /* setting pxe_core variables */ + PXE_IPADDR addr; + + addr.ip = nameip.s_addr; + pxe_set_ip(PXE_IP_NAMESERVER, &addr); + + addr.ip = netmask; + pxe_set_ip(PXE_IP_NETMASK, &addr); + + addr.ip = rootip.s_addr; + pxe_set_ip(PXE_IP_ROOT, &addr); + + /* "network route". direct connect for those addresses */ + pxe_ip_route_add(pxe_get_ip(PXE_IP_MY), netmask, NULL); + + addr.ip = gateip.s_addr; + pxe_set_ip(PXE_IP_GATEWAY, &addr); + + /* need update gateway information, cause it's already set to default */ + pxe_ip_route_default(&addr); + + } #endif /* PXE_BOOTP_USE_LIBSTAND */ ==== //depot/projects/soc2007/taleks-pxe_http/pxe_dhcp.h#8 (text+ko) ==== @@ -37,7 +37,7 @@ /* define if want use bootp() instead of functions, provided by * pxe_dhcp module */ -/* #define PXE_BOOTP_USE_LIBSTAND */ +#define PXE_BOOTP_USE_LIBSTAND /* DHCP request/reply packet header */ typedef struct pxe_dhcp_hdr { @@ -123,11 +123,11 @@ } PXE_DHCP_WAIT_DATA; typedef struct pxe_dhcp_parse_result { - uint32_t netmask; - uint32_t bcast_addr; - uint32_t ns; - uint32_t gw; - uint32_t www; + PXE_IPADDR netmask; + PXE_IPADDR bcast_addr; + PXE_IPADDR ns; + PXE_IPADDR gw; + PXE_IPADDR www; char rootpath[256]; uint8_t message_type; } PXE_DHCP_PARSE_RESULT; ==== //depot/projects/soc2007/taleks-pxe_http/pxe_dns.c#7 (text+ko) ==== @@ -33,6 +33,8 @@ #include "pxe_ip.h" #include "pxe_sock.h" +static PXE_DNS_WAIT_DATA static_wait_data; + /* write_question_for()- writes labels for provided domain name * in: * question - where to write @@ -85,18 +87,19 @@ /* create_dns_packet()- creates DNS request packet * in: - * name - domain name to resolve - * data - buffer for request packet. - * max_size - size of buffer [NOT IMPLEMENTED] + * wd - pointer to wait data structure * id - request id to distinguish requests * out: * 0 - failed * >0 - size of created packet */ int -create_dns_packet(char *name, void *data, int max_size, uint16_t id, - uint16_t query_type) +create_dns_packet(PXE_DNS_WAIT_DATA *wd, uint16_t id, uint16_t query_type) { + char *name = wd->name; + void *data = wd->data; + int max_size = wd->size; + PXE_DNS_REQUEST_HDR *request = (PXE_DNS_REQUEST_HDR *)data; pxe_memset(request, 0, sizeof(PXE_DNS_REQUEST_HDR)); @@ -175,17 +178,19 @@ /* parse_dns_reply() - parses reply from DNS server * in: - * data - pointer to buffer, containing packet data - * size - buffer size - * name - domain name to resolve - * canme - where to store cname if found. + * wd - pointer to waiting data structure * out: * 0 - parsing failed, or packet has no information about our domain - * ip - success, 32bit ip4 address + * 1 - success, wait_data->result contains ip */ -uint32_t -parse_dns_reply(uint8_t* data, int size, char *name, uint16_t id, uint8_t *cname) +int +parse_dns_reply(PXE_DNS_WAIT_DATA *wd) { + uint8_t *data = wd->data; + int size = wd->size; + char *name = wd->name; + uint16_t id = wd->id; + uint8_t *cname = wd->cname; cname[0] = 0; @@ -331,19 +336,15 @@ } /* answer points to rdata = ip4 */ - PXE_IPADDR ret; - - ret.octet[0] = answer[0]; - ret.octet[1] = answer[1]; - ret.octet[2] = answer[2]; - ret.octet[3] = answer[3]; + + wd->result.octet[0] = answer[0]; + wd->result.octet[1] = answer[1]; + wd->result.octet[2] = answer[2]; + wd->result.octet[3] = answer[3]; #ifdef PXE_DEBUG - printf(" = %d.%d.%d.%d\n", - ret.octet[0], ret.octet[1], - ret.octet[2], ret.octet[3] - ); + printf(" = %s\n", inet_ntoa(wd->result.ip)); #endif - return ret.ip; + return (1); } #ifdef PXE_DEBUG @@ -433,8 +434,8 @@ return (0); } - uint16_t size = create_dns_packet(wait_data->name, wait_data->data, - wait_data->size, wait_data->id, PXE_DNS_QUERY_A); + uint16_t size = create_dns_packet(wait_data, wait_data->id, + PXE_DNS_QUERY_A); if (size == 0) { printf("dns_request(): failed to create request.\n"); @@ -442,7 +443,7 @@ return (0); } - if (size != pxe_sendto(socket, pxe_get_ip32(PXE_IP_NAMESERVER), 53, + if (size != pxe_sendto(socket, pxe_get_ip(PXE_IP_NAMESERVER), 53, wait_data->data, size)) { printf("dns_request(): failed to send DNS request.\n"); @@ -494,12 +495,9 @@ printf("dns_await(): Received DNS reply (%d bytes).\n", size); >>> TRUNCATED FOR MAIL (1000 lines) <<<