If anyone hasn't read up on how Plan9 runs their network stack, they have a separate directory of each connection. An example in the paper is shown as the following,
# cd /net/tcp/2 <--- this is like the second TCP connection # ls -l ctl data listen local remote status They use an interesting system to control their connections using ASCII strings. For example changing the packet size would be as simple as "2400 > ctl" would change the packet size to 2400 (some syntax to that effect). They say this approach makes it compatible with remote applications that can manipulate servers through a common interface. Supposedly all network connections use this interface (TCP, UDP, LP). I think this approach would fit nicely into the Hurd's translator architecture. However, I'm not sure if I like the directory structure they use. I would think the network interface should be shown like /net/eth0/tcp/2 It might be worthwhile--but possible bad style?--to duplicate both hierachies so on may browse the connections by device or generally. Any preferences/comments on this? Josh On Mon, Mar 31, 2008 at 10:42 AM, Joshua Stratton <[EMAIL PROTECTED]> wrote: > Hey, > > I did some reading up on the Plan9 design for their network hierarchy. I > think it's interesting. I wouldn't mind using it just so the layout would > be more commonplace (for those who may have used Plan9). I also like the > access to the interface statistics. Plan9, from what I've read, tries to > abstract the interfaces to look the same to the client, which seems a little > abstract to me if a client is going to control the data structures. It > might be the opposite of what the client wants. IMHO, I think the client > should be smart enough to choose the interface it wants as I don't think > that's a real hurdle for developers. > > I heard the deadline was extended by a week by someone on the GIMP > developer list and that it would be updated on Google's timeline for SoC. > However, I have not seen this change so I am assuming today is in fact the > last day. I am going to try to organize my last few ideas for the project > layout today before the closing period, but they'll be just ideas since it > seems several of the Hurd developers have provided a lot of different ideas > for the actual file structure they would like to see. I do like the Plan9 > approach, but I'm not sure if a "transparent" interface is really what the > Hurd group would want. > > Thanks, > Josh > > > On Sun, Mar 30, 2008 at 4:51 PM, <[EMAIL PROTECTED]> wrote: > > > Hi, > > > > On Sat, Mar 29, 2008 at 05:04:48PM +0100, Carl Fredrik Hammar wrote: > > > > > > /ip/eth0/tcp/ /ip/eth0/udp/ /ip/eth1/tcp/ /ip/eth1/udp/ /ip/lo/tcp/ > > > > /ip/lo/udp/ /ip/tcp/ /ip/udp/ > > [...] > > > Shouldn't it be /eth0/ip/tcp/? I.e. with internet protocol is layered > > > over ethernet. > > > > Indeed, the more I think about it, the more I get convinced that you are > > right :-) > > > > There are some things to keep in mind though. When /ip is the top level, > > it can naturally serve as a master translator/multiplexer, managing the > > other nodes. With the device directories at the top, the question arises > > how to handle them... > > > > The simplest (but least elegant) approach would be simply to create > > static directories for each available device; and whenever an IP > > translator is attached, tell it the device explicetily. (settrans > > /net/eth0/ip /hurd/ip -d eth0) > > > > Another approach would be to have a rather dumb device translator, which > > tells the attached nodes what device to use, so it needn't be passed > > explicitely. > > > > Ideally, the device translator would actually sit between the kernel > > device and the clients, managing access... But I wouldn't consider that > > part of the IP stack task. (Actually someone was working on a BPF > > translator in the past, but it wasn't finished :-( ) > > > > A second question is how to handle listening on all available > > interfaces. (I think the socket interface allows for that?) A top-level > > ip translator could manage that in a natural way; with the devices at > > the top level, we need some additional facility to keep track of all > > available interfaces. It shouldn't be hard, but needs to be taken into > > account. > > > > > In any case, I'm not sure why you have chosen directories. Why not > > > just: eth0, eth1, ip0, ip1, tcp0, tcp1, tcp0+1 etc. where tcp0+1 works > > > like your /ip/tcp/? > > > > First of all, I hope you didn't mean to imply that the numbers in ip0 > > and tcp0 correspond to that in eth0... Because that would be plain wrong > > :-) lo for example has no number at all; while we could have both eth0 > > and ppp0 for example. So, if we want to enumerate the ip interfaces like > > that, the enumeration will be completely independant of the device > > names. > > > > But is it really useful to have such an enumeration at all? I think the > > socket interface doesn't use anything like that; interfaces are selected > > either by device name or by IP... (Correct me if I'm wrong.) And I don't > > see any reason to do different with the filesystem-based interface. > > > > The '+' syntax for listening on multiple devices looks interesting. I > > wonder though how useful it is. Does the socket interface provide a > > possibility for listening on multiple but not all devices? If not, is is > > useful to add such an ability?... > > > > In any case, we still need a way to specify the '*' case without listing > > all individual devices, I think. > > > > As for flattening the hierarchy, I'm very sceptical about that. True, it > > would simplify things: You could just have all the nodes in a normal > > directory for example, statically set up with passive translators; > > everything could be done with simple single-node translators. > > > > This is pretty ugly, though. It means that all the relations always have > > to be specified explicitely, e.g. "settrans /net/tcp0 /hurd/tcp > > /net/ip0". Also, it means a totally static setup. > > > > Instead of a normal directory, some kind of translator (multiplexer) > > could be used to manage all the nodes in /net. It could be more dynamic, > > and manage the associations between the nodes automatically. That would > > be very intransparent though; and it would destroy much of the > > decentralization and flexibility possible with the modular stack... > > > > With a directory tree on the other hand, the structure is expressed in a > > very natural, intuitive manner. But it's more work: First of all, it > > requires coming up with a good directory structure. Then the > > implementation is more complicated, as each layer has to export a > > directory with child nodes. And the setup gets more tricky: We don't > > have a normal directory anymore, where we could store all the nodes as > > passive translators; rather, the nodes are attached to virtual > > filesystems exported by the lower layers... > > > > One way would be for the virtual directories exported at each layer > > actually to allow storing ordinary passive translators. Of course, that > > would be very static again... > > > > Alternatively, each layer could launch the translators for the nodes it > > hosts, i.e. serve as a multiplexer. This is actually similar to hosting > > passive translators, except that the configuration (what to launch and > > when) would use some different, custom mechanism -- it would be more > > dynamic than passive translators, but less transparent. > > > > Yet another approach would be to leave the underlying translators out of > > the setup completely, and instead just set active translators for all > > nodes explicitely, using a script run when setting up the network > > interface. At least part of it probably could be even done by the > > clients themself upon demand -- the socket wrapper could do that > > transparently, while clients using the filesystem interface directly > > would have to do it explicitely. > > > > This setup question is a fundamental problem which we need to solve, not > > only for the network stack, but in general when we start using > > translators more extensively... > > > > Perhaps namespace-based translator selection can be useful here, once it > > is available: It would avoid explicitely setting translators > > alltogether, and instead one could for example just access > > /net/eth0/ip,,tcp to open a tcp connection on eth0. Problem with this > > approach is that it's not very transparent: Translated pseudo-nodes can > > be opened on demand, but don't show up in a directory listing... > > > > -antrik- > > > > > > >