<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>Alexey Tarasov's notes</title>
	<atom:link href="http://blogs.freebsdish.org/taleks/feed/" rel="self" type="application/rss+xml" />
	<link>http://blogs.freebsdish.org/taleks</link>
	<description>Blog about PXE and tcp implementation in preboot environment</description>
	<pubDate>Wed, 12 Sep 2007 12:28:27 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6</generator>
	<language>en</language>
			<item>
		<title>Time to stop relaxing</title>
		<link>http://blogs.freebsdish.org/taleks/2007/09/12/time-to-stop-relaxing/</link>
		<comments>http://blogs.freebsdish.org/taleks/2007/09/12/time-to-stop-relaxing/#comments</comments>
		<pubDate>Wed, 12 Sep 2007 12:28:27 +0000</pubDate>
		<dc:creator>taleks</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blogs.freebsdish.org/taleks/2007/09/12/time-to-stop-relaxing/</guid>
		<description><![CDATA[	About half of month I was doing nothing (actually vacations were planned, but they shifted once and shifted totally away at second time :)) I gave my second testing computer to brother, so I&#8217;m waiting when ordered notebook will come to doors of my home to continue developing.

	There are several major tasks to perform:

	1. Check [...]]]></description>
			<content:encoded><![CDATA[	<p>About half of month I was doing nothing (actually vacations were planned, but they shifted once and shifted totally away at second time :)) I gave my second testing computer to brother, so I&#8217;m waiting when ordered notebook will come to doors of my home to continue developing.</p>

	<p>There are several major tasks to perform:</p>

	<p>1. Check  why  gziped version of modules are not loaded correctly (rc and forth scripts&Acirc;&nbsp; e.g. loaded correctly). I&#8217;ve unwinded call stack from interact() to working with file systems, it seems there is no nothing criminal, but non-compressed versions of modules are not loaded after first 512 bytes read by file_read(). May be I&#8217;ve made somewhere incorrect define of macro.</p>

	<p>2.  To implement directory listing (parse html result of  server-reply). Main purpose to use same code for different listing types (detect numbers anf filenames between tags without actual parsing of html). After first view &#8211; this task seems solvable.</p>

	<p>3. To comment more accurately commits, that were changing libstand. May be I&#8217;ll add also another function there strnstr(), which behaviour is &#8220;emulated&#8221; now in not very good fashion in pxe_http module with usage of strstr() and manual adding of zero byte at end of readed from socket data.</p>

	<p>4. Work a little bit with assembler source. There is now unused code here and there is working, but may be not very correct <span class="caps">ISR</span> here. So, change it. Also, <span class="caps">PXE</span> call trap is duplicated  &#8211; so there may be small optimization.</p>

	<p>5.  Added to loader functions must be revised (some of them really useless, after testing is completed). Comment them.</p>

	<p>6. Write more solid documentation. And upgrade existing in some parts.</p>

	<p>I hope, I&#8217;ll start working at the end of week. After completing of this tasks earlier mentioned telnet client module will be started (may be this will need to make <span class="caps">PXE</span> sockets <span class="caps">API</span> more similar to common sockets, then it&#8217;ll be possible to use common telnet client code,  but without advanced terminal settings and signals support).</p>
 ]]></content:encoded>
			<wfw:commentRss>http://blogs.freebsdish.org/taleks/2007/09/12/time-to-stop-relaxing/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Successfully tested</title>
		<link>http://blogs.freebsdish.org/taleks/2007/08/19/successfully-tested/</link>
		<comments>http://blogs.freebsdish.org/taleks/2007/08/19/successfully-tested/#comments</comments>
		<pubDate>Sun, 19 Aug 2007 05:29:06 +0000</pubDate>
		<dc:creator>taleks</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blogs.freebsdish.org/taleks/2007/08/19/successfully-tested/</guid>
		<description><![CDATA[	Since last post were added&#194;&#160; loading of RAM-drive, using httpfs precaching and some other small updates and bugfixes, most of time was spent&#194;&#160; for testing.

	Now rootpath option is used to specify location of root on web server. Also, I&#8217;ve found that bootp() doesn&#8217;t sets nameip (it was not usually needed for NFS loader, it&#8217;s enough [...]]]></description>
			<content:encoded><![CDATA[	<p>Since last post were added&Acirc;&nbsp; loading of <span class="caps">RAM</span>-drive, using httpfs precaching and some other small updates and bugfixes, most of time was spent&Acirc;&nbsp; for testing.</p>

	<p>Now rootpath option is used to specify location of root on web server. Also, I&#8217;ve found that bootp() doesn&#8217;t sets nameip (it was not usually needed for <span class="caps">NFS</span> loader, it&#8217;s enough to specify IP of server and resolving is not required. But in case of web0servers, which may use virtual servers for different domains for same <span class="caps">IP </span>- it&#8217;s needed to know domain name, and nameserver option is needed) and thus gives problems for code to work, so by default own <span class="caps">DHCP</span> client is used. If&Acirc;&nbsp; not domain name but IP is specified in rootpath, then bootp() may be used.</p>

	<p>Loading of <span class="caps">RAM</span>-drive is optional, but was needed to test correct working of code. It&#8217;s done simply by adding few&Acirc;&nbsp; lines to loader.rc script. Actually, it&#8217;s possible use for example <span class="caps">NFS</span> after loading as root file system (by setting appropriate environment variables), but as long as pxe_http library code must be a little bit independent &#8211; best choice was to use <span class="caps">RAM</span>-drive (or additionaly to write kernel module for support httpfs. Last variant needed more time and knowledge, so it temporarily was thrown away).</p>

	<p><span class="caps">RAM</span> drive image was got from boot floppy image (mfsroot.gz). It contains needed for system installation files. So, after loading by pxe_http kernel+RAM drive&Acirc;&nbsp; it&#8217;s possible to install FreeBSD by choosing ftp as media source.</p>

	<p>While testing code in <span class="caps">LAN I</span>&#8217;ve found that loader trys to get file by small portions (maximum 4096 bytes per request). It is not very optimal, so about month ago I was thinking about simple caching mechanism and now it works. For this purpose, httpfs need access to socket receive buffer (this is done to reduce memory usage, so cached information is actually stored in socket buffer, main problem is in removing from buffer header and watching when cached data is empty). Such ability breaks abstraction of code layers, but raises up connection speed and reduces load of http server. While testing it lowered downloading time from about one minute to 25-30 seconds. After setting lower waiting time in pxe_await.h, code response to incoming packets become higher, and downloading is performed in 15-25 seconds at <span class="caps">LAN</span>.</p>

	<p>After caching was checked, I&#8217;ve started testing of code with remote server, that is really remote and situated in 12 hops from my home computer. Here was first surprise, <span class="caps">TCP</span> code was working really strange: some packets were never received. During debugging also bug with resending was fixed (segments were waiting to be acked bigger aequential number, then needed).</p>

	<p>So, packets were not receiving and code not worked in <span class="caps">WAN</span>. I&#8217;ve spent many hours trying to make it work. Ed (my mentor) said simple idea &#8211; to tcpdump on server side. Well, I don&#8217;t know why this idea have not appeared in my mind itself. tcpdump showed, that all is ok &#8211; packets from me correctly are coming to server, and from server to me are also sent, however not acked. Debugging of pxe_core showed that they are not reaching my <span class="caps">NIC</span>. I&#8217;ve started comparing two dumps and found rather interesting thing: only packets with segment size fuly filled to 1460 (default <span class="caps">TCP MSS</span> in pxe_http) were not transmitted correctly. I&#8217;ve changed <span class="caps">MSS</span> to 1260 (10 hops * 20 bytes is about 200 bytes&#8230;) and code started working correctly. Packets were sent with Don&#8217;t fragment IP flag, so I think somewhere on the path to me router dropped them cause couldn&#8217;t sent it not fragmented. May be it&#8217;s just my <span class="caps">ISP</span> side problem.</p>

	<p>After getting code working correctly in Internet, I&#8217;ve tested it on two different web servers (first uses Apache, second one &#8211; nginx), both worked correctly. And to make sure code is really working, I&#8217;ve managed my friend to try it from his home through <span class="caps">ADSL</span> modem (at my home, Internet is got through <span class="caps">VPN</span> via <span class="caps">ISP </span>Ethernet based network, so router at my home is second computer with pppoe client). It also worked.</p>

	<p>Last check was to test again <span class="caps">NFS</span> loader after some changes in pxe_open() function. It also worked, so finally code seems ready to be tested widely and tarball of current version of code will be sent as result of GSoC.</p>

	<p>Finally, I&#8217;ve wrote simple documentation,&Acirc;&nbsp; that may be useful for setting pxe_http to work or use it <span class="caps">API</span>. Well, it&#8217;s not covers every function of pxe_http code, but gives main information, needed to work with it.</p>

	<p>Next two weeks I&#8217;m planning get more information about ipv6, spend summer time and do nothing usefull at all, except fixing any simple bugs found in code. Later I&#8217;ll&Acirc;&nbsp; try to add ipv6 support for pxe_http and may be implement some other ideas.</p>
 ]]></content:encoded>
			<wfw:commentRss>http://blogs.freebsdish.org/taleks/2007/08/19/successfully-tested/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Boot-reboot..</title>
		<link>http://blogs.freebsdish.org/taleks/2007/08/01/boot-reboot/</link>
		<comments>http://blogs.freebsdish.org/taleks/2007/08/01/boot-reboot/#comments</comments>
		<pubDate>Wed, 01 Aug 2007 11:40:59 +0000</pubDate>
		<dc:creator>taleks</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blogs.freebsdish.org/taleks/2007/08/01/boot-reboot/</guid>
		<description><![CDATA[	Finally I&#8217;ve booted kernel on real machine without unexpected rebooting it in process of booting.

	While testing code, I&#8217;ve tried smaller buffers (16, 8, 4, and 2Kbytes were used) and tests figured out, that code with 4 and 2 kbytes is able to boot kernel on real machine, bigger buffers are working on virtual machines. Keeping [...]]]></description>
			<content:encoded><![CDATA[	<p>Finally I&#8217;ve booted kernel on real machine without unexpected rebooting it in process of booting.</p>

	<p>While testing code, I&#8217;ve tried smaller buffers (16, 8, 4, and 2Kbytes were used) and tests figured out, that code with 4 and 2 kbytes is able to boot kernel on real machine, bigger buffers are working on virtual machines. Keeping in mind fact that memory allocation/freeing is done most probably correctly (it&#8217;s done by libstand functions, that are trusted)   it was difficult to understand why smaller usage of memory for buffers gave such strange results.</p>

	<p>First investigation showed, that loader&#8217;s heap is allocated over <span class="caps">PXE</span> data (in base memory higher 8d000h). That was fixed (higher bound of heap was limited to address from which <span class="caps">PXE</span> data starts), but hadn&#8217;t solved the problem. Yeah, sad moment, I had faith that problem is in heap allocation. Next suggestion was that pxeboot is rather big binary. In fact, <span class="caps">PXE</span> specs recommend to make download of boot images in two steps: remote.0 and remote.1. Remote.0 placed at well-known 7c00h:0000 and must not exceed 32Kbytes (cause &#8220;32K size limit provides the advantage of being able to clean up and fail gracefully&#8221; (c) <span class="caps">PXE </span>Specification).  remote.0 determines if system is has adequate resources and downloads remote.1 (in specs to in extended memory at e98000h).&Acirc;&nbsp; Monolithic pxeboot is about 200K, with pxe_http above 240Kb. I don&#8217;t know if 32K size is strict requirement or not, pxelinux for example is about 12Kb.</p>

	<p>Well, &#8220;NFS loader works&#8221; I&#8217;ve thought and then reduced binary size by removing all pxe_http testing code and code related to support filesystems such as dos. It gave me nearely same size as usual for pxeboot. So, now http loaded kernel boots on my home machine.</p>

	<p>While working with <span class="caps">DHCP</span> client, I&#8217;ve found  that I&#8217;m doing same work, that was performed in bootp() call in libstand. I was not giving much attention to it, cause my code was working, but after binary reducing thought, that it&#8217;s good idea to use already available function. This function mainly depends on udpread/udpsend functions, that were earlier situated in libi386/pxe.c but commented by me while rewriting it&#8217;s code a little bit (commented cause it was using pxe_call and etc, that was removed by me form this file).</p>

	<p>It was not big deal to rewrite udpread/udpwrite to use pxe_http functions to read/send data, but for this purpose was done &#8220;default socket&#8221; mechanism for <span class="caps">UDP</span>. It&#8217;s done with aim not use sockets while calling udpread/udpsend, cause code, which uses them, don&#8217;t know about pxe_http sockets. To be more accurate, sending of udp packets doesn&#8217;t require socket, it&#8217;s enough to call pxe_udp_send(), but incoming packets are coming through filters mechanism and are delivered to appropriate socket buffer. Previously, all data that was filtered out &#8211; was going to trash bin, now it goes to &#8220;default socket&#8221;. and it&#8217;s possible to read from it as usual, using pxe_udp_read() function.</p>

	<p>So, bootp() began working good (except moment with updating of gateway/nameserver information, that I&#8217;ll fix in next few days). The main problem with it was, that bootp() may work only after opening of device, cause after that <span class="caps">NIC MAC</span> is known by code, that generates <span class="caps">BOOTP</span> packet. Normally, pxe_dhcp_query() &#8211; which is now may be wrapper for bootp() &#8211; is started from pxe_core_init(), and already knows own <span class="caps">MAC</span>. Well, I&#8217;ve returned pxe_dhcp_query() to pxe_open()  in case if not own <span class="caps">DHCP</span> client used (here was bootp() originally). And all began work correctly.</p>

	<p><span class="caps">NFS</span> code also uses udpread/udpsend functions, so it was rather logical to try <span class="caps">NFS</span> loader.  It also works.  It&#8217;s started working without any doubts. so it&#8217; uninteresting to tell anything about it.</p>

	<p>This made me possible to make conclusion that compatibility with old working <span class="caps">PXE</span> related code in libi386 is big enough.</p>

	<p>So, formally main goal of project is achieved. But there is more work to do:</p>

	<p>1.  load image of <span class="caps">RAM</span> drive and mount root to it, so booting process via http will be fully performed. Now it stopson stage of mounting of root file system.</p>

	<p>2. Understand where is problem with memory when I&#8217;ve used bigger buffers with big pxeboot binary. It&#8217;s rather interesting moment, cause I&#8217;ve no idea what might cause rebooting of prefectly loaded kernel in case of bigger buffer size for sockets earlier.</p>

	<p>3. Test all and update some code details (well, one of them is that root path is not used by http loader now).</p>

	<p>4. write finally whole documentation related to project. I&#8217;ve started to write it few times, but it wasn&#8217;t finished yet.</p>

	<p>5. choose notebook to buy.</p>

	<p>These are my tasks for next weeks.</p>
 ]]></content:encoded>
			<wfw:commentRss>http://blogs.freebsdish.org/taleks/2007/08/01/boot-reboot/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Kernel loaded</title>
		<link>http://blogs.freebsdish.org/taleks/2007/07/25/kernel-loaded/</link>
		<comments>http://blogs.freebsdish.org/taleks/2007/07/25/kernel-loaded/#comments</comments>
		<pubDate>Wed, 25 Jul 2007 13:55:04 +0000</pubDate>
		<dc:creator>taleks</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blogs.freebsdish.org/taleks/2007/07/25/kernel-loaded/</guid>
		<description><![CDATA[	httpfs now works. It uses pxe_http code to  open keep-alive connections to http-server. Also it ressurects it to life if connection is dead due server&#8217;s settings (e.g. timeout or exceeded max requests per connection). Need to think how to make requests optimal. Loader uses  4K buffers at request, may be I&#8217;ll add some [...]]]></description>
			<content:encoded><![CDATA[	<p>httpfs now works. It uses pxe_http code to  open keep-alive connections to http-server. Also it ressurects it to life if connection is dead due server&#8217;s settings (e.g. timeout or exceeded max requests per connection). Need to think how to make requests optimal. Loader uses  4K buffers at request, may be I&#8217;ll add some sort of caching mechanism for httpfs to reduce count of requests to server.</p>

	<p>So, it&#8217;s possible to use common commands of <span class="caps">BTX</span> such as &#8216;more&#8217;, &#8216;load&#8217;, &#8216;help&#8217;. I&#8217;ve played a lot with them while testing of http code, rather boring process. But after that one problem with interrupt handling in pxe_core was located. It seems, that end of interrupt is handled not correctly, so interrupt not occurs from time to time till some unrelated top pxe_core code finishes interrupt correctly. Problem is temporarily fixed by ignoring of <em></em>pxe_isr_occured flag and checking of available incoming frames in pxe_core_recv_packets() despite of value of this flag. Meanwhile <span class="caps">TCP</span> code was simplified by rewrtting it in pxe_tcp module, reducing code lines and function count. Testing showed it works identically to previous code, except one silly misprint, that was fixed in new variant of code.</p>

	<p>Anyway, it&#8217;s possible to load modules, kernel and etc. It&#8217;s interesting that loader tries to load gzipped variants of files first, so it performs four requests to server. E.g. we need &#8220;loader.rc&#8221;, theese files will be requested: &#8220;loader.rc.gz.split&#8221;, &#8220;loader.rc.gz&#8221;, &#8220;loader.rc.split&#8221;, &#8220;loader.rc&#8221;. It was unexpected and exceeded limits of filters and connections tables, cause connections felt to <span class="caps">TIME</span>_WAIT state (keep-alived connection were actively closed by client. Need to try in nearest future sending of &#8220;Connection: close&#8221; field in header to make passive connection closing at closing of file), no new connections were possible to establish. Well, I&#8217;ve added opportunity to free connections structures in this state  for establishing of new connections. It&#8217;s violates <span class="caps">RFC</span>, but helps keep relatively small amount of structures. If <span class="caps">PXE</span>_MAX_CONNECTIONS is set to big enough number, then <span class="caps">TCP</span> code behaviour is as expected in <span class="caps">RFC</span>.</p>

	<p>After changing loader.rc to something very simple, my home made kernel was loaded and &#8216;lsmod&#8217; showed a number of modules. But &#8216;boot&#8217; command failed (hang or panic depending on which virtual machine and real machine were used). It was frustrating &#8211; result is practically visible, but yet goal not achieved. I&#8217;ve tried loading of <span class="caps">RAM</span>-drives, but also failed.</p>

	<p>In bad mood of me normal loader.rc was started. The first surprise is that on VMWare machine I&#8217;m see normal booting process till time of mounting of root file system (which is unknown, cause not set by environment parameters in loader and /etc/fstab is empty in Apache&#8217;s DocumentRoot directory). Second surprise that another virtual machine hangs during loading of support.4th (according to Apache logs it&#8217;s read not completely, about 70-80%)  and my real machine just reboots while reading same file. Rather suspicous <img src='http://blogs.freebsdish.org/taleks/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> <br />
So next days I&#8217;ll be solving quest for finding why loading of support.4th, which have no nothing criminal in it, may cause such problems and exploring issue with lost somewhere interrupt.</p>
 ]]></content:encoded>
			<wfw:commentRss>http://blogs.freebsdish.org/taleks/2007/07/25/kernel-loaded/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Something looking like result</title>
		<link>http://blogs.freebsdish.org/taleks/2007/07/14/something-looking-like-result/</link>
		<comments>http://blogs.freebsdish.org/taleks/2007/07/14/something-looking-like-result/#comments</comments>
		<pubDate>Sat, 14 Jul 2007 17:14:47 +0000</pubDate>
		<dc:creator>taleks</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blogs.freebsdish.org/taleks/2007/07/14/something-looking-like-result/</guid>
		<description><![CDATA[	From the last post there were big steps ahead.

	Second variant of TCP code was good enough and I&#8217;ve even got result &#8216;tes&#8217; (3 letters of word &#8216;test&#8217;) on server side while testing. After some testing and improvments, whole buffer was transferred well, but there were no resending queue. It appeared in third variant.

	For that purposes [...]]]></description>
			<content:encoded><![CDATA[	<p>From the last post there were big steps ahead.</p>

	<p>Second variant of <span class="caps">TCP</span> code was good enough and I&#8217;ve even got result &#8216;tes&#8217; (3 letters of word &#8216;test&#8217;) on server side while testing. After some testing and improvments, whole buffer was transferred well, but there were no resending queue. It appeared in third variant.</p>

	<p>For that purposes was needed a small and cute packet allocation manager (receive buffer is still uses common cyclic buffer routines, but send data buffer is used by packet allocation manager). Effective memory allocation in case of variable size of packets is rather difficult task, so I was implementing other task &#8211; allocating of fixed size packets. Simple enough to implement it in short period of days. All packets were divided in two groups &#8211; &#8220;small&#8221; packets and &#8220;big&#8221; packets. Small packets are used for system messages (SYN, <span class="caps">FIN</span>, ACK without data, <span class="caps">RST</span>), big &#8211; are for data transmitting.</p>

	<p>How it works? Buffer space is divided in chunks with size equal to maximum size of &#8220;small&#8221; packet. It&#8217;s now 64 bytes (this is enough for IP, <span class="caps">TCP</span> header, <span class="caps">TCP</span> options  and segment description). Every chunk contains <span class="caps">TCP</span> related segment description (resending time and other).  Sequential chunks are gathered together in blocks. Block is used for allocating data for &#8220;big&#8221; packets and it&#8217;s size 512 bytes. So, memory manager just allocates blocks or chunks in place. Block may be exclusively be owned by one big segment or by count of small segments. Amazing, that it worked from the beginning without signifcant errors. Segment resending function uses segment description, so it&#8217;s possible to send segments allocated using other manager or just statically allocated (used in sending <span class="caps">RST</span> packets when there are no connection, thus there are no socket and thus there are no buffer and space to allocate chunks)</p>

	<p>So memory manager was ready and resending become pretty simple &#8211; just check resend time of segment and resend it. And I&#8217;ve started simple testing of code by sending blocks of generated sequences with identical initial generators on both sides of connection. And it worked perfectly till summar transferred data to one side was less then buffersize. Bigger amounts of data make code crazy, guard checks of memory allocator become very talkative and loved easily to fell to panic.  Few days of testing located problem part of code in buffers read/write code in some cases. After standalone tesing module for buffers all become correct and data started transferring well. First test was in trabsferring 8 MBytes of data (that exceeds defsault buffer size 32K). Good new was that data is going correctly: per byte checking showed no errors. Bad new was that speed was about 5-6Kbytes/s at FastEthernet. Really annoying to wait all this 8Mb to be transferred.</p>

	<p>The reason was simple &#8211;  after filling receiving buffer and getting small window size (less then default mss) server side was waiting about second or two before asking client side, is any free space now. So, one fix in pxe_recv(), which started checking connection by sending <span class="caps">ACK</span> every 100 ms if receving buffer have much free space, saved the Earth, pardon, project. Speed become 500K-1000K. Well, still is not best, but better than was, next speed up may be done by sending/recv&#8217;ing bigger blocks (in test it was byte by byte in order to check sequences are correct). Now there is another problem <img src='http://blogs.freebsdish.org/taleks/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> client code is very nasty if server is not sending anything, client bombs server with ACKs about big window ready to work. I need to think how to make client behavior more correct. At this point 80Mb of data were transferred correctly and relatively fast, so test was over with verdict &#8211; passed.</p>

	<p>It was so good, that even warned me a little bit. Time showed I was right, not all was so good. To be more accurate &#8211; connection breaking was handled incorrectly, when server initiated breaking (passive closing from client view on this situation). Some updates in tcp_disconnect() helped to solve problem and <span class="caps">LAST</span>_ACK, <span class="caps">CLOSE</span>_WAIT are now also handled in right way. At least I think so and tests prove it. This changing in disconnect function give also speed up bonus in active connection closing.</p>

	<p>But anyway, next version of <span class="caps">TCP</span> implementation is already in thoughts to simplify pxe_tcp module and reduce function count. May be some other changes will be done. E.g. I&#8217;m trying to reduce sending of <span class="caps">ACK</span> packets by using incremental <span class="caps">ACK </span>(now every incoming segment is confirmed). This already is performed in checking of &#8220;same&#8221; packets: every packet that is just copy of current, placed in queue, with older sequence number to <span class="caps">ACK</span> is removed from resending queue. It helps a little bit, but solution is still not good enough.</p>

	<p>Meanwhile I was doing http client, the only function of which was to fetch chosen file (I was testing on html-page)  from web-server. There was not anything special, except that I was sent again to read style(9) and implemented simple snprintf() in libstand by modyfing <acronym title="">PCHAR</acronym> macro. http receiving code was working, so next function implemented partial requesting of data. It&#8217;s rather simple, just adding of other field in header (assuming server supports such feature).  Main task to do here in future &#8211; don&#8217;t establish connection for every reading of part of file. Now it established at start of reading and closed after that.</p>

	<p>Next step, I forget about &#8211; filesystem. Well, for reasons I don&#8217;t know, I was thinking pxe.c is all that needed to change and files become getting itself from web server (by the way, www-server option was added to <span class="caps">DHCP</span>-client to get it ip). But it&#8217;s rather logical to separate filesystem and device. So, I was needed &#8211; make stub filesystem code. Using already available code it was simple &#8211; just call pxe_http module functions at needed time.</p>

	<p>So, next days I&#8217;ll continue checking and correcting of existing code (also, once more style updates&#8230;), but main task will be tie together filesystem, pxenet device, http code and see what will be in result of this mix.</p>
 ]]></content:encoded>
			<wfw:commentRss>http://blogs.freebsdish.org/taleks/2007/07/14/something-looking-like-result/feed/</wfw:commentRss>
		</item>
		<item>
		<title>First TCP steps.</title>
		<link>http://blogs.freebsdish.org/taleks/2007/06/21/first-tcp-steps/</link>
		<comments>http://blogs.freebsdish.org/taleks/2007/06/21/first-tcp-steps/#comments</comments>
		<pubDate>Thu, 21 Jun 2007 14:55:53 +0000</pubDate>
		<dc:creator>taleks</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blogs.freebsdish.org/taleks/2007/06/21/first-tcp-steps/</guid>
		<description><![CDATA[	From time of last post there were big enough changes  in code.

	First of all, await functions support was implemented, so pxe_core_recv_packets() function now is hidden from user code even  deeper.

	Await functions are functions that are called back by pxe_await()&#194;&#160; during simple waiting mechanism. It seems in some modules it made code smaller in [...]]]></description>
			<content:encoded><![CDATA[	<p>From time of last post there were big enough changes  in code.</p>

	<p>First of all, await functions support was implemented, so pxe_core_recv_packets() function now is hidden from user code even  deeper.</p>

	<p>Await functions are functions that are called back by pxe_await()&Acirc;&nbsp; during simple waiting mechanism. It seems in some modules it made code smaller in lines, but added wait_data structures, which stores current wait related variables. As for <span class="caps">TCP</span> module, it seems await function is not useful, but to be similar to all other modules &#8211; waiting during handshaking is done using tcp_await()</p>

	<p>pxe_await() provides event, current try and wait related data when executes await callback function. So, all await functions are similar and are processing next try, new packets, start of try, end of try events.</p>

	<p><span class="caps">DNS</span> client was rewritten a little bit to use await functions mechanism, <span class="caps">DHCP</span> client was written to support it from the first lines of code.</p>

	<p>After different issues with <span class="caps">DHCP</span> protocol simple client was produced to get nameserver, gateway and other useful as well as  useless information from <span class="caps">DHCP</span> server. May be I need also to add project related <span class="caps">DHCP</span>-option, which will specify from which server to download files.</p>

	<p>After implementing of major <span class="caps">UDP</span> services needed by project, finally <span class="caps">TCP</span> module got its first implementation.</p>

	<p>As earlier in other protocols, main function for packet  processing is callback named simply pxe_tcp_callback(). Main difference from other protocols, especialy <span class="caps">UDP </span>- that sockets and filters here firstly used separately and actual work is done in state handlers, not in main callback from start till end.</p>

	<p>State handler functions registered now in compile time (and I believe never will be registered in run time, although it&#8217;s possible)  in state_functions array and each function serves for one <span class="caps">TCP</span> connection state handling, if it&#8217;s <span class="caps">NULL</span>, state is ignored.</p>

	<p>Connection is binded more to filter, than to socket structure. This is  done to handle correctly <span class="caps">TIME</span>_WAIT state, when there is no actually any socket, but any lost packets must be got and forgot.</p>

	<p>After testing in soft conditions of <span class="caps">LAN</span> it seems active establishing  and  active closing of connection is done correctly.</p>

	<p>Next things to do:</p>

	<p>1. resending of packets after timeouts. Adding max segment size option to tcp packet.</p>

	<p>2. data send/recv using <span class="caps">TCP</span> sockets. Adding pxe_push() function to push data.</p>

	<p>3. queueing of received not  in correct sequential order packets. Now they are just dropped. It may be useful to move core_packets structure to <span class="caps">TCP</span> module for this purpose.</p>
 ]]></content:encoded>
			<wfw:commentRss>http://blogs.freebsdish.org/taleks/2007/06/21/first-tcp-steps/feed/</wfw:commentRss>
		</item>
		<item>
		<title>DNS client and etc.</title>
		<link>http://blogs.freebsdish.org/taleks/2007/06/09/dns-client-and-etc/</link>
		<comments>http://blogs.freebsdish.org/taleks/2007/06/09/dns-client-and-etc/#comments</comments>
		<pubDate>Sat, 09 Jun 2007 05:43:10 +0000</pubDate>
		<dc:creator>taleks</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blogs.freebsdish.org/taleks/2007/06/09/dns-client-and-etc/</guid>
		<description><![CDATA[	Well, first version of DNS client was working about a week ago, but it had one problem: some of domain names were resolved, others were not. In fact, even packets were not returned in reply to sended requests. I&#8217;ve checked request making function and found no problems, added verbosity of debug information and found no [...]]]></description>
			<content:encoded><![CDATA[	<p>Well, first version of <span class="caps">DNS</span> client was working about a week ago, but it had one problem: some of domain names were resolved, others were not. In fact, even packets were not returned in reply to sended requests. I&#8217;ve checked request making function and found no problems, added verbosity of debug information and found no problems still. After some thoughts, I&#8217;ve decided that only lower levels of code may produce such fault. And after some hunting for bugs, one fat error was found at <span class="caps">UDP</span> checksum calculation. <span class="caps">UDP</span> checksum is calculated for pseudo IP header, <span class="caps">UDP</span> header and data. I was calculating this sum separately (for pseudo header and for rest) and after that adding them together. On this stage there was error and routers, which check <span class="caps">UDP</span> checksums, just were dropping this packets. When local <span class="caps">DNS</span> server was able to resolve cached name (requested by other <span class="caps">DNS</span> clients in <span class="caps">LAN</span>) it was answering, cause it was not checking sums.</p>

	<p><span class="caps">DNS</span> clients (and currently developing <span class="caps">DHCP</span> client) are implemented using <span class="caps">UDP</span> sockets. For sockets I&#8217;ve added cyclic buffers and routines to work with them. <span class="caps">UDP</span> callback functions stores datagrams (which passed filters) to socket recv_buffer, heading structure with source address information that is used by pxe_recvfrom(). There is no ability to know if datagram is truncated now. if user recv&#8217;ed less then total size of datagram &#8211; rest of it is dropped.</p>

	<p>Added after this pxe_bind() function required using of socket state. Now it&#8217;s not only free/used, but binded/connected/established. Binded socket has only one part of filter set strictly, connected &#8211; both source and destination related parts, established is unused, but will be used later with <span class="caps">TCP</span>.</p>

	<p><span class="caps">DNS</span> client is used in pxe_gethostbyname() function which returns ip4 addr by domain name. Need testing of <span class="caps">CNAME</span> handling, if there is no A record in additional or answer section (in this case request resended with <span class="caps">CNAME</span> to resolve. In my tests there was no <span class="caps">DNS</span> server, which returned somedomain <span class="caps">CNAME</span> canonical_domain without leading canonical _domain A ip.ip.ip.ip.). Resolved names are not cached, I don&#8217;t think it&#8217;s needed for this project. Meanwhile testing, i&#8217;ve found funny thing: www.google.ru is <span class="caps">CNAME</span> to www.google.com, but google.ru is just A to set of ip&#8217;s (by the way <span class="caps">DNS</span> client takes first appropriate record as ip resolved for given name). So just three letters and you are logically in other network.</p>

	<p><span class="caps">UDP</span> sockets seems working (I&#8217;ll test it later on <span class="caps">NFS</span> client in pxe.c to be sure there are no bugs). pxe_sendto() moves socket to connected state if it was not binded before (it&#8217;s used in <span class="caps">DNS</span> client, may be it&#8217;s better to change behaviour of this function)</p>

	<p>Next to implement:<br />
<ul></p>
	<p><li>universal waiting mechanism for packets to avoid repeating of cycles in every module. It will be similar to Etherboot or to the uIP await functions.</li><br />
<li>getting default gateway/nameserver from <span class="caps">DHCP</span> server. Although, it&#8217;s possible to change them manually (&#8216;pxe ns&#8217; and &#8216;pxe route&#8217; commands in testing module) it must be get by default from <span class="caps">DHCP</span> server (also, in <span class="caps">DHCP</span> packet may be returned host from which perform downloading of files via http. this need adding user option to packet). For some reasons cached <span class="caps">DHCPACK</span> packet data in <span class="caps">PXE</span> is filled with zeroes (during downloading of <span class="caps">NBP</span>, TFTP  has this information, it shows it, but returned by <span class="caps">PXE API</span> call data contains no information in options section. May be I need check legacy <span class="caps">BOOTP</span> section if it hides needed info instead of filename and servername)</li><br />
<li>start implementing <span class="caps">TCP</span> recieve/send packets function.</li><br />
<li>add raw_handlers. Currently, if protocol callback function does not think packet useful for itself, function drops it. raw_handler for protocol will be callback, which will get this packets. it&#8217;ll be set by users. It&#8217;ll no change currently working code except of return values of callback functions.</li><br />
</ul></p>
 ]]></content:encoded>
			<wfw:commentRss>http://blogs.freebsdish.org/taleks/2007/06/09/dns-client-and-etc/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Some thoughts about sockets</title>
		<link>http://blogs.freebsdish.org/taleks/2007/05/26/some-thoughts-about-sockets/</link>
		<comments>http://blogs.freebsdish.org/taleks/2007/05/26/some-thoughts-about-sockets/#comments</comments>
		<pubDate>Sat, 26 May 2007 12:58:23 +0000</pubDate>
		<dc:creator>taleks</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blogs.freebsdish.org/taleks/2007/05/26/some-thoughts-about-sockets/</guid>
		<description><![CDATA[	I&#8217;m deciding, what is more important: syntax compatibility with usual sockets implementation (mimic function declarations and function appearing in user code order as much as possible ) or basic compatiblility (module behaviour is similar, but some functions named differently and  function sequences to establish connection may be another) is more than enough. May be [...]]]></description>
			<content:encoded><![CDATA[	<p>I&#8217;m deciding, what is more important: syntax compatibility with usual sockets implementation (mimic function declarations and function appearing in user code order as much as possible ) or basic compatiblility (module behaviour is similar, but some functions named differently and  function sequences to establish connection may be another) is more than enough. May be it&#8217;s one task, but views from two sides. This day I&#8217;m thinking first variant is more appropriate, but it limits some project functionality available with current understanding of pxe_filter.<br />
All incoming packets flows from hidden (may be not hidden, anyway userbased networking needs receive cycle)  from user  pxe_core_recv_packets()  function to registered by IP based protocol callback function (e.g. for <span class="caps">UDP </span>- pxe_udp_callback(), installed by pxe_udp_init() call at pxe_core startup). Callback function must dispatch packet data to one of sockets, if any inited.</p>

	<p>For that purpose Ive create module, named pxe_filter. Every socket at eatablishing connection time (or at time of equivalent of listen() call, or just at socket creating time) installs filter to filter table. Filter conatains destination/source ip/port with masks for every parameter and reference to socket, for which installed filter. So, protocol handler function starts pxe_filter_check() with extracted from packet values of ports, ips and protocol type. Filter check function sequentialy checks filter entries from start  to end entry, and returns when (if) first satisfactory entry found (well, similar to firewall rules). If filter entry found, socket is extracted from pxe_filter_entry structure and socket member of structure is valid &#8211; data dispatched to the socket buffer, if there is free space in it.</p>

	<p>What benefits it gives:<br />
<ul></p>
	<p><li>it&#8217;s simple. And it adds some functionality of primitive firewall (which may be not interesting in this project).</li><br />
<li>not connection oriented code may listen only that ip in whcih it interested. Usually check from which ip datagram received is performed after recvfrom () or recvmsg() by one of returned values. But in case of filters &#8211; there would no necessity in this. Filter may limit from which ip to get packets. I think, it&#8217;s useful, e.g. for <span class="caps">DNS</span> resolver or any other non broadcast <span class="caps">UDP</span> packets transmiting, when it&#8217;s known from which ip data expected. If mimic absolutely sockets function syntax, this functionality may be lost.</li><br />
<li>listen() call may use filter to &#8220;fork&#8221; sockets, creating socket with more strict filter higher (earlier in checking  order) in filter table. So all accepted connections may be assumed as child to base socket. And it&#8217;ll help to check if there are more connections to accept and after closing of base socket &#8211; which connections also to kill, if needed. Well, my project is more client oriented, than server, but anyway good opportunity.</li><br />
</ul></p>
	<p>For me, it seems not bad idea at all, so I&#8217;ve started doing it in this way.</p>

	<p>PS:</p>

	<p>can someone say how to fix SpamKarma 2, which is installed incorrectly? all links from manage page links to freebsdish.org/wp-admin/... but not to freebsdish.org/taleks/wp-admin/...  it&#8217;s a little bit annoying to enter manually</p>

	<p>.../taleks/wp-admin/options-general.php?page=spamkarma2&amp;</p>

	<p>sk2_section=spam&amp;sql_rows_per_page=20&amp;</p>

	<p>sql_skip_rows=0&amp;sql_score_threshold=-100 to check if some comment is mistaken with cialis ads.</p>
 ]]></content:encoded>
			<wfw:commentRss>http://blogs.freebsdish.org/taleks/2007/05/26/some-thoughts-about-sockets/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Ping works</title>
		<link>http://blogs.freebsdish.org/taleks/2007/05/23/ping-works/</link>
		<comments>http://blogs.freebsdish.org/taleks/2007/05/23/ping-works/#comments</comments>
		<pubDate>Wed, 23 May 2007 16:03:35 +0000</pubDate>
		<dc:creator>taleks</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blogs.freebsdish.org/taleks/2007/05/23/ping-works/</guid>
		<description><![CDATA[	Somehow PXE code works, and in nearest future only C and TCP/IP related stuff expected, no assembler and PXE related problems. Last issue (code worked only in one available to me  implementation of UNDI API ) was solved by modifying most used function pxe_core_call(). For some reasons, it returns incorrect value in ax register, [...]]]></description>
			<content:encoded><![CDATA[	<p>Somehow <span class="caps">PXE</span> code works, and in nearest future only C and <span class="caps">TCP</span>/IP related stuff expected, no assembler and <span class="caps">PXE</span> related problems. Last issue (code worked only in one available to me  implementation of <span class="caps">UNDI API </span>) was solved by modifying most used function pxe_core_call(). For some reasons, it returns incorrect value in ax register, however code works correctly. So, ax register now ignored till understanding why it&#8217;s contents is corrupted.</p>

	<p>IP imlementation was made really fast, but checksums of IP and <span class="caps">ICMP</span> headers provided  some nervous hours: <span class="caps">ICMP</span> reply (from <span class="caps">PXE</span> client) packets were  noticed  in tcpdump, but ping itself ignored this packets. Problem was  in incorrect icmp checksum (first time tcpdump wasn&#8217;t saying me that there is problem with icmp checksum, but after some changes in checksum calculating it began warn. I guess, why it was not warning earlier, when checksum was calculated only for icmp header without transmitted data? May be it was a miracle and this bytes were filled by zeroes, so checksum was independent from transmitted data) .</p>

	<p>The second problem that was expected &#8211; routing of packets to gateways.  For this purpose, some routing related functions were implemented, and now it&#8217;s possible perform ping of death from <span class="caps">PXE</span> booted workstations <img src='http://blogs.freebsdish.org/taleks/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> Routing functions too primitive in my project, I need do something with them. By default, at start (pxe_ip_route_init()) two routes are added: default (it must be got from <span class="caps">PXE</span> cached packets, but there are only zeroes in place of gip member, so I set my home gateway 192.168.0.1 as default gateway. After implementation of some <span class="caps">DHCP</span>/BOOTP functions, it&#8217;ll be possible to get gateway automatically). pxenet0 (this route for hosts in local network, in fact &#8211; it&#8217;s not gateway. It&#8217;s named as interface in original pxeboot). IP related code uses first route, which network is equal to destination network of ip packet.</p>

	<p>For testing purposes I&#8217;ve added to pxeboot command pxe, which allows to test project subsystems:</p>

	<p>1. pxe arp ip.addr &#8211; sends <span class="caps">ARP</span> prequests for provided ip. Returns <span class="caps">MAC</span> address of desired  ip, if host is upped.</p>

	<p>2. pxe ping ip.addr &#8211; sends 5 pings with 32 bytes to provided ip.</p>

	<p>3. pxe route &#8211; change route table. e.g. &#8216;pxe route add default 10.0.0.1&#8217; will set 10.0.0.1 as default gateway. As you see there is no mask, it&#8217;s calculated from ip address class (no <span class="caps">CIDR</span>, so&#8230;). &#8216;pxe route print&#8217; &#8211; shows current routing table.</p>

	<p>4. pxe await  &#8211; starts infinite cycle ofchecking received packets. May be used for client pinging  purposes or serving client as server. There is no exit from this test module.</p>

	<p>Well, in fact I need somebody to test modified pxeboot in <span class="caps">PXE</span> environment to be sure code is compatible with most existing <span class="caps">PXE</span> implementations (I&#8217;ve tested all available to me implementations and it worked, but who knows&#8230;). If somebody, may find a time and test &#8211; help will be greatly appreciated.</p>

	<p><a href="http://blog.d-strict.com/pxeboot.tar.bz2" title="Here" target="_blank">Here</a> is tar.bz2 of modified version of pxeboot. It&#8217;s needed to up <span class="caps">DHCP</span> server with appropriate&Acirc;&nbsp; settings&Acirc;&nbsp; and <span class="caps">TFTP</span> service.</p>
 ]]></content:encoded>
			<wfw:commentRss>http://blogs.freebsdish.org/taleks/2007/05/23/ping-works/feed/</wfw:commentRss>
		</item>
		<item>
		<title>First result</title>
		<link>http://blogs.freebsdish.org/taleks/2007/05/20/first-result/</link>
		<comments>http://blogs.freebsdish.org/taleks/2007/05/20/first-result/#comments</comments>
		<pubDate>Sun, 20 May 2007 15:29:34 +0000</pubDate>
		<dc:creator>taleks</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blogs.freebsdish.org/taleks/2007/05/20/first-result/</guid>
		<description><![CDATA[	Well, first of all, about pxe.h. It has error in structure naming t_PXENV_UNDI_INITALIZE, it took some time to find, which letter is missed. Other issues with this fie: not armoured header (which disturbed me while compiling, cause included twice), PXENV_UNDI_GET_STATE related structure and definitions are missing. I&#8217;ve updated it only locally, but may be it&#8217;ll [...]]]></description>
			<content:encoded><![CDATA[	<p>Well, first of all, about pxe.h. It has error in structure naming t_PXENV_UNDI_INITALIZE, it took some time to find, which letter is missed. Other issues with this fie: not armoured header (which disturbed me while compiling, cause included twice), <span class="caps">PXENV</span>_UNDI_GET_STATE related structure and definitions are missing. I&#8217;ve updated it only locally, but may be it&#8217;ll be better to make perforce mapping later.</p>

	<p>After successfull complilation of libpxe_http.a, I&#8217;ve thought all is good, however linker thought differently. There was &#8220;R_386_16 relocation truncated&#8221; error. Now I know, it was gas &#8216;feature&#8217;, it&#8217;s rather problematic to write mixed 16 and 32 bit code with it, but first time I was in confusion. Now pxe_isr.S uses manualy rewritten segment:offset adresses, based on calculating sement and offset to data_start. I&#8217;ve thought about using code segment as data segment (in fact used data is placed in code segment), but first try gived me bad results, so for first time it will be somehow ugly, but working code</p>

	<p><span class="caps">ARP </span> related code was already near working state, so main problem was how to test it. I&#8217;ve modified pxe.c (implements pxenet device and <span class="caps">NFS </span>(via <span class="caps">UDP</span>)  loading of kernel), just to start test of arp (this test sends broadcast request who-is provided ip and receives replies, updating internal arp_table structure). And after some trys understood, that pxe_core_receive() code is doing nothing, cause <span class="caps">UNDI</span> returns pointer to buffer, to which there is no access from userspace (starts at 0xa000, buffer is in lower addresses).  So, <em></em>mem_copy() in pxe_isr.S was born with destiny to copy data in vm86 mode, and data_buffer array finally came in handy as place to copy to. There was also bug in receiving cycle, so I&#8217;ve made debug macro and started printing out to screen everything useful and useless. And have found, that receiving buffer includes media header and transmit (at least, for known by <span class="caps">UNDI</span> protocols) doesn&#8217;t include ethernet header.</p>

	<p>Meanwhile,  command &#8216;arp&#8217; was added to loader (just to check, if I understand right how to add cmmands there), it performs arp test (but to say true, it  not works, cause earlier started by autoboot pxe related code, and thus other test, from pxe.c function pxe_open() which shutdowns undi after all).</p>

	<p>After fixing of  some bugs and  rebuilding &#8211; arp test began working in virtual machine (I am omitting tonnes of messages &#8216;unknown hardware  address format&#8217; in dmesg <img src='http://blogs.freebsdish.org/taleks/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> and some stupid errors with broadcast address for ethernet). It sends broadcast message for my home computer in localnet and receives reply, caches it and finishes. Well, I was such happy, that even rebooted desktop trying to perform test on one of it&#8217;s NICs (internal Realtek 8168;  there is also 3Com 3C905C-TX, but I&#8217;ve not tested on it yet). Well, as always, reality was cruel. All pxe_core_transmit() calls were unsuccessfull, I&#8217;ve tryed other virtual machine (with different implementation of <span class="caps">PXE</span>) and found the same result.</p>

	<p>I think, problem is incorrect sequence of initialization of <span class="caps">UNDI</span> services in pxe_core_init(). <span class="caps">PXE</span> spec says, that on remote.0 stage (started pxeldr) it&#8217;s possible to stop everything (STOP_BASE. <span class="caps">UNLOAD</span>_STACK, <span class="caps">STOP</span>_UNDI)  and start remote.2 (the same executable in my case) with initialization <span class="caps">UNDI</span> again, but after that even first virtual machine rejected my code (mmm&#8230; in fact I&#8217;ve done also <span class="caps">UNDI</span>_CLOSE, <span class="caps">UNDI</span>_CLEANUP, <span class="caps">UNDI</span>_SHUTDOWN). there is also two mysteries &#8211; <span class="caps">GET</span>_STATE function always returns &#8216;failed&#8217; result, but it seems, returned <span class="caps">UNDI</span> state value is not such incorrect. And some transmit calls fails with Status = 0 (which is something like &#8216;not any error&#8217; status). It&#8217;s strange (I guess if I understand right &#8211; call failed, if  ax register != 0).</p>

	<p>So main problem for next few days &#8211;  to find  correct initialization sequence of calls, if problem is in that. And when problem will be solved &#8211; start first testing and implementing of ip protocol.</p>
 ]]></content:encoded>
			<wfw:commentRss>http://blogs.freebsdish.org/taleks/2007/05/20/first-result/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
