Project name ------------ Implementing a DHCP client in Guile Scheme Summary ------- We want to have a DHCP client written in Guile Scheme. Specifically: 1. The implementation will comply with IETF RFC 2131 [1] 2. The client will be bundled as a Guix package [2], which installs a command-line program similar to ISC’s dhclient (8) utility. [4,5] 3. The client code should be modular, so that some of its functions can be invoked from within GNU dmd’s [6] proposed event loop. 4. The client should be runnable as a dmd service, as described in the dmd manual [6] Communication ------------- Name: Rohan Prinja Email: address@hidden IRC: wenderen Github: wenderen Mobile: +91 96190 19345 Country of residence: India Timezone: IST (GMT +530) Primary Language: English Benefits -------- Currently the only DHCP client implementation in the Guix package list is the ISC implementation, which is written in C. The aim of this project is to deliver a Guile Scheme implementation of a DHCP client satisfying the conditions outlined in the abstract. The motivation for this is that GNU dmd should be able to easily call DHCP library functions from its event handlers in response to various network events. Since dmd is written in Guile Scheme, we want our DHCP library to be written in Guile Scheme as well. How users benefit: this project is related to dmd gaining an event loop so that it can properly handle events - including DHCP events - rather than simply waiting for the client. dmd performing faster and better is a win for the user. How GNU benefits: Guix SD gains an important daemon! Deliverables ------------ 1. A module written in Guile Scheme, implemeting RFC 2131. 2. A command-line program available as a Guix package, which calls the module's functions. 3. A dmd service for the DHCP client. 4. (TODO: discuss this with Ludo) Integration of the module with dmd's event loop. High-level plan --------------- This project involves writing a library more or less from scratch. So designing and discussing the structure of the library with knowledgeable community members is a prerequisite. I've tried to keep this task before the actual GSoC period, because I want to reserve the GSoC period for writing code, code review and committing. I propose the following high-level timeline: Pre-GSoC Period (before May 25) * Environment setup, finish all background reading * Design client library API * Design command-line program along the lines of dhclient GSoC Period (May 25 - Aug 9) * Write a stubbed DHCP client module which exports skeleton functions (for example, a skeleton function might simply print to stdout). This will include: -> functions for constructing and sending over a network DHCP packets compliant with the RFC. -> functions that handle client logic, like transitioning between states in the DHCP client FSM [8]. -> functions for manipulating the local store. * Write the command-line program and call the module's functions from within it. * Patch dmd with a bare-bones event loop so that we can test events related to the DHCP client process. * Call the module's functions from within the event loop and ensure that the functions are being invoked correctly. * Fill the stubs! This involves making use of Guile Scheme's networking library [7] and referring to the dhclient source [4]. * Re-test the command-line program and the integration with dmd's event loop after the stubs are filled in. * Create and test a dmd service for the client. Buffer period (Aug 17 - Aug 23) * If the event loop is implemented in parallel by some other community member, merge their implementation with my changes and re-test Detailed plan + Midterm evaluation ---------------------------------- TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO 0. Pre GSoC period: April 27 - May 25 1. May 25 - May 31 2. June 1 - June 7 3. June 8 - June 14 4. June 15 - June 21 5. June 22 - June 28 6. June 29 - July 5 7. July 6 - July 12 8. July 13 - July 19 9. July 20 - July 26 10. July 27 - Aug 2 11. Aug 3 - Aug 9 12. Aug 10 - Aug 16 13. Aug 17 - Aug 23 TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO References ---------- [1] RFC 2131: https://www.ietf.org/rfc/rfc2131.txt [2] Guix package manager: http://www.gnu.org/s/guix [3] List of available Guix packages: http://www.gnu.org/software/guix/package-list.html [4] ISC DHCP implementation: https://www.isc.org/downloads/dhcp/ [5] dhclient man page: http://linux.die.net/man/8/dhclient [6] dmd manual: http://www.gnu.org/software/dmd/manual/dmd.html [7] Guile networking: https://www.gnu.org/software/guile/manual/html_node/Networking.html [8] DHCP FSM: http://www.tcpipguide.com/free/t_DHCPGeneralOperationandClientFiniteStateMachine.htm Qualification ------------- * Why does this project appeal to me? I am interested in this project because: 1. I want to do impactful work, and a DHCP client is a vital component of modern operating systems. 2. Writing a standards-compliant library looks like an interesting challenge. 3. I did a "Networks" course in college and enjoyed it. 4. I also like the Guile Scheme aspect. I did an "Abstractions and Paradigms in Programming" course in college, where I programmed in Racket. It was fun :) * Relevant experience 1. I have contributed small patches to Google Skia as part of an internship with Samsung, and some commits to Mozilla Servo (on a voluntary basis). 2. As mentioned above, I have experience in network programming and am familiar with Racket. 3. I am comfortable with using mailing lists, responding to code reviews and giving and asking for help on IRC. * What will I do after GSoC ends? I see GSoC as a stepping stone to being actively involved in the community by contributing and maintaining code, and also bringing in newcomers to GNU projects. If I am selected and the project is very successful, I would like to apply as a mentor in the following years. Why am I applying to GNU? ------------------------- I’m grateful to GNU both for creating software that I use everyday, and for promoting a philosophy of software that respects the user. I’m very excited to be applying to GNU. I see this as a chance to do two things: 1. Do a useful and impactful project for a community that has given me so much. 2. As mentioned above, I want to join the community in earnest, using this project as a first step.