Several questions on the packet driver, revision 1.05: Questions from RNN to JBVB are marked with Q:. Answers are marked with A:. Continued answers on the same topic are marked with C:. Q: If each interface is supposed to have its own interrupt, why specify a handle? A: A handle is needed because a) you need to ask for several different packet types to effectively use IP, and you may want to manipulate them separately, and b) because the Packet Driver needs to be able to tell application A (IP) from application B (random TSR). Under DOS, multiple programs can use one interface, but different packet types (provided they hack DOS well enough to run at the same time). C: Right. I missed the "type" specification. I'm not exactly sure what the type specification should contain. It seems to be dependent upon the interface class. Is this type specification "clearly obvious to the expert" (which I'm not yet)? A: On DEC-Intel-Xerox ("Blue Book") Ethernet, which is what the whole world of TCP/IP is using right now, the "type" is assumed to be the 2-byte Ethertype (0x800 for IP, 0x806 for ARP, etc.). On ProNET-10, it would be the 1-byte packet type, on 802.5 it would be at least 2 bytes (SSAP, DSAP), and might be considerably longer, for instance to cover all 8 bytes of a SNAP encapsulation. That is why we include a length. Q: In the same vein, why specify access_type if there is only one interface per interrupt? A. The same reason as above. Q: There is no provision for reporting cause of errors, i.e. jam, shorts, etc. Perhaps get_statistics() should return, as part of the statistics structure, long errors[10] and char errnames[20][10], where the last is the name of the error. A: That approach only succeeds if the program making the get_statistics() call can use the strings directly. In the case of our 2.0 TSR kernel, or with other TSR (LAN program redirectors, etc.), the names aren't used because the numbers just get saved, or stuffed into format (different) of our net_stats() call. Programs that call our kernel are hardware-independent, so they wouldn't know to do the get_statistics() call. C: I hadn't intended that these error counts be useful to the program -- merely useful for a system jock who's trying to debug his code. A: I would recommend that any actual debugging of a new hardware driver take place when it is linked into a normal DOS program (like PCIP). Then, once it is working right, move it into the Packet Driver TSR. TSRs are awfully hard to debug... In the function access_type(): Q: What is the range of if_number? A: if_number is somewhat of an appendix. Due to other aspects of the design (no handle on the send_pkt call), the only reasonable value is 0. Q: When should access_type return BAD_HANDLE? When out of handles? A: access_type() can return BAD_HANDLE when out of handles. Q: When should access_type return TYPE_INUSE? When the packet type is in use? A: TYPE_INUSE is intended for just that situation: someone else has already claimed either the type specified or some superset of it. Q: Why is typelen a parameter? Isn't it a fixed quantity for each interface class? A: typelen is a parameter to allow for situations (802.2 packet headers is the only case I can think of at the moment) where the match length varies. With 802.2 headers, one application might want all packets with SSAP 1, and another might want SSAP = 1, DSAP = 2, etc. In conventional Blue-Book Ethernet, typelen is effectively a constant, 2. Q: What if I don't have enough space to store their type? Return NO_SPACE? A: NO_SPACE is intended for any kind of resource exhaustion that makes the access_type() fail. In the function terminate(): Q: Sounds like the driver shouldn't terminate until and unless all handles have either been released. What if a call to terminate() has been made, and there are other handles in use? Should the driver terminate after the last handle has been released? Sounds like terminate() requires a handle that *hasn't* been released. If it returns CANT_TERMINATE, should it also release the handle? A: I hadn't throught about terminate() much. Seems like a good idea to release the handle, whether or not the call succeeds. This would allow an application to attempt to free up all memory by closing all its handles that way (although if this succeeded, the packet driver would need to be re-started before another network program could run).