Hi everyone Over the last couple of weeks, I've amused myself with doing a clean-slate implementation of the Babel protocol in the Bird routing daemon, and thought I'd report my experiences here.
I saw Juliusz' talk at the Babel side meeting in Prague (and again at Battlemesh), which is what convinced me that this was actually a viable project. Otherwise, I based my implementation on the RFC and did basic interoperability testing with the official babeld implementation. Overall, I found the RFC clear and easy to follow. Section 2 gives a nice background on how the protocol works, and sections 3 and 4 gives the details of how the implementation should work; in sufficient detail that the implementation can done by referring only to those two sections. The details that are left up to the implementation have nicely suggested solutions in the appendices (which I used for my implementation). The main thing that I found confusing in the text was the mention of 'id' in section 3.5; took me a while to realise that this was supposed to be the router id. In the rest of the document, this is quite explicit, but in sections 3.5.1 and 3.5.4 they are referred to simply as 'id'. This is technically defined in the text, but one has to go looking for it, so when flipping back and forth between the code and the document I found it somewhat confusing. The second thing I would have liked to have available is some more guidance on how to ensure an implementation is actually compliant to the RFC. I.e. a test suite, or at least some description of what kind of edge cases to test (tricky topologies, that sort of thing). My testing so far has been fairly ad hoc, and I'm pretty sure there's still bugs in there. The main part of the implementation took about a week, with another week to fix bugs and convince myself that it actually works as intended; this includes time to familiarise myself with the Bird daemon API and internal logic (but on the other hand, I didn't have to write any code to talk to the kernel). I by no means consider it a production-quality implementation at this point, but it does exchange routes with the babeld daemon and hasn't crashed my laptop yet :) I've posted the implementation as a patch on the Bird list here: http://trubka.network.cz/pipermail/bird-users/2015-August/009855.html -- that email also describes the current limitations of the implementation. There's also a github repository with the complete commit history for those who want to amuse themselves with perusing my struggles: https://github.com/tohojo/bird I hope this can serve as a useful data point in the assessment of the implementability of Babel. I started this mainly as a project to satisfy my own curiosity (the best way to understand a protocol is to implement it, and all that), but do plan to put in some effort to get it to a more robust state, depending on the feedback I get from the Bird developers :) Cheers, -Toke _______________________________________________ homenet mailing list homenet@ietf.org https://www.ietf.org/mailman/listinfo/homenet