<?xml version="1.0"?>
<!DOCTYPE webpage
  PUBLIC "-//NetBSD//DTD Website-based NetBSD Extension//EN"
      "http://www.NetBSD.org/XML/htdocs/lang/share/xml/website-netbsd.dtd">

 <!--

    The Rules:

      - No duplicate projects: if something is in this file, do not
        keep a copy in projects.xml. Note that the project entry format
        is slightly different (just comment out the additional data).

      - No entry without a developer contact
        Additional mailing lists are ok, but there needs to be at least
        one "real" person

      - No entry without "proper" description (only <project-details> is
        not enough)

      - No projects that are actively in progress (i.e. still ongoing
        from last years SoC)

      - Only projects that can be done within the SoC timeframe

 -->

<webpage id="contrib-soc-projects">
  <config param="desc" value="NetBSD Projects"/>
  <config param="cvstag" value="$NetBSD: soc-projects.xml,v 1.76 2008/03/27 00:42:57 dyoung Exp $"/>
  <config param="rcsdate" value="$Date: 2008/03/27 00:42:57 $"/>
  <head>
    <title>NetBSD Summer-of-Code Projects 2008</title>
  </head>

  <para><ulink url="../about/disclaimer.html#bsd-daemon"> <html:img
  align="right" src="../images/BSD-daemon.jpg" border="0" width="146"
  height="129" alt="BSD daemon"/></ulink>NetBSD participated successfully
  in Google's summer of code 2005, 2006 and 2007.  We are proud to have
  been selected as a mentoring organization again in 2008!</para>

  <para>This page contains a
  list of concrete suggestions for projects we would like to
  see applications for. Note that they vary a lot in required
  skills and difficulty. We hope to get applications with a
  broad spectrum.</para>

  <para>If you are interested in working on any of these projects,
  please contact the developer and/or mailing list referenced next 
  to each item, and  possibly answer as many questions from our <ulink
  url="soc-application.html">Project Application HowTo</ulink> as
  possible.  The interested developers will be glad to respond to you
  there.</para>

  <para>In addition, you may wish to discuss your proposal on IRC -- look
  for us on #netbsd-code.</para>

  <para>
  We encourage you to come up with your own suggestions, if you can not
  find a suitable project here. You can find more project ideas
  <ulink url="projects.html">on the NetBSD project ideas page</ulink>.
  These are not directly applicable to Summer-of-Code, but may serve
  as ideas for your own suggestions. You might find other ideas in <filename
  role="cvsweb">src/doc/TODO</filename> and <filename
  role="cvsweb">pkgsrc/doc/TODO</filename>.</para>

    <para>
      Deadlines and directions for students' applications to the
      Google Summer-of-Code can be found 
      <ulink url="http://code.google.com/soc/studentfaq.html">on the Google pages</ulink>.
     </para>

  <!--

    PROJECT TEMPLATE.  PLEASE RESPECT FIELD ORDER.

    <projects>
      <soc-projects-toc />

      <project id="">
        <title></title>

        <project-details>
          <difficulty>0</difficulty>
          <contact>&a.name; <email>somebody</email></contact>
          <contact><mlist>tech-userlevel</mlist></contact>
        </project-details>

        <para>...</para>
      </project>
    </projects>

  -->

    <projects>
      <soc-projects-toc />

      <project id="isdn-nt-asterisk">
        <title>ISDN NT support and Asterisk integration</title>

        <project-details>
          <difficulty>5</difficulty>
          <contact>&a.martin; <email>martin AT NetBSD.org</email></contact>
          <contact><mlist>tech-kern</mlist></contact>
        </project-details>

        <para>This projects has two subprojects: 
        add support for the NT (network) side of ISDN to the NetBSD
        ISDN stack and interface ISDN (in NT mode) to
        the <ulink url="http://asterisk.org">Asterisk PBX</ulink>,
        which would allow using existing ISDN PBXes as SIP/VoIP
        phones, as well as easier testing of new ISDN card
        drivers.</para>
        <para>
        Previous work in this area can be found at
        <ulink url="http://www.turbocat.net/~hselasky/isdn4bsd/">
        the alternative ISDN driver site</ulink>.</para>
      </project>

      <project id="dvb-framework">
        <title>DVB drivers and kernel framework</title>

        <project-details>
          <difficulty>9</difficulty>
          <contact>&a.martin; <email>martin AT NetBSD.org</email></contact>
          <contact>&a.jmcneill; <email>jmcneill AT NetBSD.org</email></contact>
          <contact><mlist>tech-kern</mlist></contact>
        </project-details>

        <para>NetBSD is lacking a framework for DVB (digital video broadcast)
        receivers. This project should create such a framework and deliver
        at least one driver for a DVB card making use of the framework.
        </para>
        <para>Further userland work will be needed, for example adapting
        <ulink url="http://www.mythtv.org/">mythTV</ulink> to this new
        kernel API, but this is not part of the project.</para>
        <para>
        A major part of this project is designing the kernel subsystem.
        There are several alternative approaches: follow the
        <ulink url="http://linuxtv.org">LinuxTV</ulink> model, which
	is now used by OpenSolaris too, or
        go for a solution similar to 
        <ulink url="http://msdn.microsoft.com/windowsmedia/techart/directshow">
        DirectShow</ulink>. There also is ongoing work in FreeBSD, and
	of course it would be possible to develop a simple NetBSD
	specific API (creating slightly more work for porting
	existing userland applications.)</para>
        
      </project>

      <project id="wstablet">
        <title>Design and implement a wstablet driver</title>

        <project-details>
          <difficulty>4</difficulty>
          <contact>&a.spz; <email>spz AT NetBSD.org</email></contact>
          <contact><mlist>tech-x11</mlist></contact>
        </project-details>

        <para>There is no equivalent to the wsmouse (for mice) or 
        wskbd (for keyboards) subsystem for graphics tablets
        in the generic wscons console
        driver framework that most NetBSD ports use. Designing
        and documenting the API, as well as creating at least one
        hardware driver and interfacing to the X server is the objective
        of this project.</para>
      </project>

      <project id="lpr">
        <title>New LPR/LPD for NetBSD</title>

        <project-details>
          <!--  <priority>0</priority> -->
          <difficulty>1</difficulty>
          <!-- <length>Unspecified</length> -->
          <contact>&a.perry; <email>perry AT NetBSD.org</email></contact>
          <contact><mlist>tech-userlevel</mlist></contact>
        </project-details>

        <para>The current lpr/lpd system in NetBSD is ancient, buggy,
        and doesn't support modern printer systems very well.
        Interested parties would do a from  scratch rewrite of a new,
        modular lpr/lpd system that would support both the old lpd
        protocol and newer, more modern protocols like IPP, and would be
        able to handle modern printers easily.</para>
      </project>

      <project id="flash-translation">
        <title>Flash translation layer</title>

        <project-details>
          <!-- <priority>0</priority> -->
          <difficulty>5</difficulty>
          <!-- <length>2 months</length> -->
          <contact>&a.jmcneill; <email>jmcneill AT NetBSD.org</email></contact>
          <contact><mlist>tech-embed</mlist></contact>
          <!-- <who>&a.jmcneill; <email>jmcneill AT NetBSD.org</email></who> -->
        </project-details>

        <para>Implement flash-translation layer to handle bad-block
        management/wear leveling such that a FFS or LFS file system could be
        placed on above NAND flash chip.</para>
      </project>


      <project id="fast-time">
        <title>Light weight precision user level time reading</title>

        <project-details>
          <!-- <priority>0</priority> -->
          <difficulty>3</difficulty>
          <!-- <length>1-2 months</length> -->
          <contact>&a.kardel; <email>kardel AT NetBSD.org</email></contact>
          <contact><mlist>tech-userlevel</mlist></contact>
        </project-details>

        <para>Design and implement a mechanism that allows for fast user
        level access to kernel time data structures for NetBSD. For
        certain types of small data structures the system call overhead
        is significant.  This is especially true for frequently invoked
        system calls like clock_gettime(), time(), gettimeofday(). With
        the availability of user level readable high frequency counters
        it is possible to create fast implementations for precision time
        reading.  Optimizing clock_gettime and alike will reduce the
        strain from applications frequently calling these system calls
        and improves timing information quality for applications like
        NTP.  The implementation would be based on a to be modified
        version of the timecounters implementation in NetBSD.</para>

        <para>See also the <ulink
        url="http://phk.freebsd.dk/pubs/timecounter.pdf">Paper on
        Timecounters by Poul-Henning Kamp</ulink>.</para>
      </project>

      <project id="ext3fs">
        <title>Implement Ext3 file system support</title>

        <project-details>
          <!-- <priority>3</priority> -->
          <difficulty>5</difficulty>
          <!-- <length>1-2 months</length> -->
          <contact>&a.wrstuden; <email>wrstuden AT NetBSD.org</email></contact>
          <contact>&a.dillo; <email>dillo AT NetBSD.org</email></contact>
          <contact><mlist>tech-kern</mlist></contact>
        </project-details>

        <para>The Ext2 file system is the de-facto standard, Unix-like
        file system used on Linux installations.  Ext2 does not have
        journaling capabilities, so Ext3 was built on top of it to add
        them without breaking compatibility with Ext2.  Ext3 is now a
        stable journaled file system used on lots of Linux
        installations.</para>

        <para>NetBSD currently fully supports the Ext2 file system at
        the kernel level.  Unfortunately there is no support for the new
        features included in Ext3, although Ext3 file systems can be
        mounted provided that their journal is clean.  It would be very
        nice if NetBSD had Ext3 file system support because the system
        could immediately gain a journaled file system as well as
        compatibility with Linux (imagine having both systems installed
        on a single partition!).  This has, supposedly, lower risk than
        adding journaling to UFS because Ext3 is already heavily
        deployed and tested.</para>
        
        <para>Therefore, the aim of this project is to add Ext3 support
        to the NetBSD kernel accompanied by any userland code required
        to support it.  This shouldn't be too difficult because, as we
        already mentioned, Ext2 is implemented in the NetBSD kernel (see
        <filename role="cvsweb">src/sys/ufs/ext2fs/</filename>) and Ext3
        is an extension of it.</para>
      </project>

      <project id="improve_ext2fs">
        <title>Improve support for Ext2 root file system</title>

        <project-details>
          <!-- <priority>1</priority> -->
          <difficulty>4</difficulty>
          <!-- <length>1 month</length> -->
          <contact>&a.bouyer; <email>bouyer AT NetBSD.org</email></contact>
          <contact>&a.tsutsui; <email>tsutsui AT NetBSD.org</email></contact>
          <contact><mlist>tech-kern</mlist></contact>
          <contact><mlist>tech-userlevel</mlist></contact>
        </project-details>

        <para>NetBSD currently has support for the Ext2 file system.
        Unfortunately, it has some deficiencies that make its use
        unsuitable for a root file system, as detailed below.  (Strictly
        speaking it can be used as such, but it is not easy to do
        so.)</para>

        <para>The Ext2 file system driver in the NetBSD kernel currently
        supports the use of this file system as the system's root.  That
        is, <filename>/</filename> can live in an Ext2 partition.
        However, there is no way to natively boot NetBSD using this
        mechanism because there is no <command>bootxx_ext2fs</command>
        boot loader.  Similarly there is no support in
        <command>sysinst</command> to install NetBSD directly onto a
        Ext2 partition.  At the moment the only way to get this to work
        is to do a manual installation and later use GRUB to boot the
        kernel instead of the native boot blocks.</para>

        <para>But why would this be interesting?  Ext2 is a very popular
        file system.  Supporting it as root would mean that you'd
        install NetBSD inside the same partition as Linux (with some
        very minor unimplemented features).  Similarly, if Ext3 support
        is added, NetBSD would immediately gain a journaled file system
        to be used for any partition.  Furthermore, this eases
        cross-development of NetBSD from Linux operating systems.</para>

        <para>Unfortunately, there are some tricky parts in using
        <command>bootxx_ext2fs</command> even with ext2fs support
        in the kernel's libsa.  Ext2 file systems always have
        their superblock stored at a 1024-byte offset from the start of
        the file system.  This does not leave enough room to install the
        boot code.  A workaround for this shall be found: maybe
        implementing <command>bootxx_ext2fs</command> is not really
        needed as long as <filename>/boot</filename> has Ext2 knowledge
        and its location is hardcoded in the first boot stage.  (This
        means you will need to deal with
        <command>installboot</command>'s code too.)</para>

        <para>At last, <command>fsck_ext2fs</command> should be improved
        because, after a crash, it detects (and attempts to correct!)
        far more errors than its Linux counterpart.  It can end up
        destroying some data that ought to be correct in the first
        place because it thinks is incorrect.</para>
      </project>

      <project id="smbtuneup">
        <title>Evaluate, benchmark and optimize samba file server
        performance</title>

        <project-details>
          <!-- <priority>0</priority> -->
          <difficulty>7</difficulty>
          <!-- <length>1-3 months</length> -->
          <contact>&a.martin; <email>martin AT NetBSD.org</email></contact>
          <contact><mlist>tech-net</mlist></contact>
        </project-details>

        <para>Samba, the SMB file server, runs fine on NetBSD as is.
        Since this is a very common network filesharing protocol,
        performance of the server should be optimized.</para>

        <para>It is probably not necessary to go all the way the NFS
        server code did (i.e. move most protocol handling inside the
        kernel).</para>

        <para>This project is about evaluating possible improvements
        (use of kqueue, splice/sendfile and similar concepts, adding
        case independent mount options for the underlying file system -
        probably more to be found during the project), exploring
        possible implementations, and benchmarking.</para>
      </project>

      <project id="pppoed">
        <title>Userland daemon for the in-kernel PPPoE server</title>

        <project-details>
          <!-- <priority>0</priority> -->
          <difficulty>3</difficulty>
          <!-- <length>1 month</length> -->
          <contact>&a.martin; <email>martin AT NetBSD.org</email></contact>
          <contact><mlist>tech-net</mlist></contact>
        </project-details>

        <para>NetBSD has a high performance PPPoE implementation (both
        client and server side), which runs completely inside the
        kernel.  While this is fine for client installations, it is not
        practical for real server use.</para>

        <para>To solve this, a small and simple kernel modification is
        needed to allow a userland daemon to handle the early parts of a
        PPPoE session, until IPCP and/or IPv6CP are up - and then pass
        the complete session on to the kernel. A userland daemon needs
        to be implemented (or adapted), which should offer radius
        support.</para>

        <para>A potential extension of this project would be to improve
        the kernel handling of PPPoE sessions for multiple active
        sessions.  The current design relies on only very few sessions
        existing (resp. pppoe device instances being configured) - and
        will need a review once a real server could be
        implemented.</para>
      </project>

      <project id="ata-over-ethernet">
        <title>ATA over Ethernet</title>

        <project-details>
          <difficulty>7</difficulty>
          <contact>&a.is; <email>is AT NetBSD.org</email></contact>
          <contact><mlist>tech-kern</mlist></contact>
        </project-details>

        <para>AoE is a lightweight alternative to the complex iSCSI,
         albeit with little security, and limited to the local LAN.
         NetBSD can be used as an AoE target via aoe-vblade from pkgsrc,
         but an initiator is needed to retrieve the data from the target.
         This project is to create an initiator in the NetBSD kernel.
         The stretch goal is to provide a BSD-licensed (userland) AoE
         target as well.</para>

      </project>

      <project id="ndmp">
        <title>NDMP Support</title>

        <project-details>
          <difficulty>5</difficulty>
          <contact>&a.agc; <email>agc AT NetBSD.org</email></contact>
          <contact><mlist>tech-kern</mlist></contact>
        </project-details>

        <para>The NDMP protocol specifies the protocols to
        perform dumps and backups across a network. There
        are a number of BSD-licensed XDR specs for
        NDMPv4, and this project is to provide the
        necessary functionality to take the RPC
        invocations and perform the work to save and
        present the data across the network. This backend
        to the NDMP protocol will allow NetBSD to act as
        an NDMP server for communication with third-party
        applications, such as Netbackup.</para>

      </project>

      <project id="secureplt">
        <title>Secure-PLT - supporting new PLT formats on alpha or
        powerpc</title>

        <project-details>
          <difficulty>5</difficulty>
          <contact>&a.matt; <email>matt AT NetBSD.org</email></contact>
          <contact><mlist>tech-userland</mlist></contact>
        </project-details>

        <para>Currently kernels with options PAX_MPROTECT can not execute
        dynamically linked binaries on most RISC architectures, because
        the PLT format defined by the ABI of these architectures uses
        self-modifying code.</para>

        <para>New binutils versions have introduced a different PLT
        format (enabled with --secureplt) for alpha and powerpc.</para>

        <para>These two projects (one for alpha, one for powerpc) are to
        add support for the new PLT formats introduced in binutils 2.17
        and gcc4.1 This will require changes to the dynamic loader
        (ld.elf_so), various assembly headers, and library files.</para>

        <para>Support for both the old and new formats in the same
        invocation will be required.</para>

      </project>

      <project id="uvc-webcams">
        <title>Add support for UVC devices (USB web-cams)</title>

        <project-details>
          <difficulty>5</difficulty>
          <contact>&a.sborrill; <email>sborrill AT NetBSD.org</email></contact>
          <contact>&a.drochner; <email>drochner AT NetBSD.org</email></contact>
          <contact><mlist>tech-kern</mlist></contact>
        </project-details>

        <para>Most modern web cams and other video devices with USB
	connections are based on the UVC device class (it is a requirement
	for Vista certification).</para>
       
        <para>This project should create kernel drivers for this device
	class. Defining the exact userland API, and porting at least
	one existing application to it is also part of this project.</para>
	
	<para>There are UVC drivers for OpenSolaris which, in common with
	Linux, use Video4Linux 2 (v4l2) as the API. This has good
	application support, but this does not mean it is mandatory.
	However, a subset of v4l2 as appropriate for the devices being
	supported by this project may be worthwhile.</para>
        
      </project>

      <project id="tiny-dhcp">
        <title>DHCP client with minimal functionality and size</title>

        <project-details>
          <difficulty>2</difficulty>
          <contact>&a.martin; <email>martin AT NetBSD.org</email></contact>
          <contact>&a.joerg; <email>joerg AT NetBSD.org</email></contact>
          <contact><mlist>tech-net</mlist></contact>
        </project-details>

        <para>The ISC DHCP client used in NetBSD is a pretty huge
        application, with rich and complex configurability. This is
        great for complex scenarios, but not needed for many
        others.</para>

        <para>Overall target is to create a good-enough DHCP client
        solution with the minimal possible footprint.</para>
      </project>

      <project id="pf-persistence">
        <title>Save and restore PF filter state</title>

        <project-details>
          <difficulty>5</difficulty>
          <contact>&a.dyoung; <email>dyoung AT NetBSD.org</email></contact>
          <contact><mlist>tech-net</mlist></contact>
        </project-details>

        <para>Make it possible to save and restore the state of the PF
        packet filter to disk.  The function desired is similar to
        &man.ipfs.8;, however, we would like the saved state to be in a
        human-readable form.  In particular, write the PF NAT &amp;
        firewall state in the format of PF rules.  You will need to
        augment the PF rules syntax so that it can express properties of
        PF state such as its TTL.  You need to produce a kernel
        interface for loading the state, and make pfctl's parser
        understand it.  You need to make changes to the in-kernel parts
        of PF in order to load state.  Also, provide for
        locking/unlocking the PF state tables as they are
        loaded/dumped.</para>
      </project>

      <project id="packet-classifying">
        <title>Create an in-kernel API for "packet classes"</title>

        <project-details>
          <difficulty>7</difficulty>
          <contact>&a.dyoung; <email>dyoung AT NetBSD.org</email></contact>
          <contact><mlist>tech-net</mlist></contact>
        </project-details>

        <para>Create an in-kernel API for registering "packet classes"
        and for labeling packets with their class, for special treatment
        by traffic shapers (ALTQ) and by network interface drivers.
        With the registration part of the API, ALTQ or a driver
        registers the names of packet classes it recognizes.  For
        example, ALTQ will register the 'class_name' part of a Class
        Command - see &man.altq.conf.5;.  An Ethernet NIC with high- and
        low-priority transmit rings may register classes called 'hipri'
        and 'lopri'.  An 802.11 NIC may register 802.11e traffic
        categories, BE, BK, VI, VO.  Each registration yields a token
        that is suitable for labeling a packet - i.e., a small amount of
        data to stick in an mbuf packet header or in an m_tag.</para>

        <para>Make PF use the packet-classes API to convert PF tag
        names&mdash;see &man.pf.conf.5; for more about tags&mdash;to
        packet-class tokens, and to label mbufs with the tokens as they
        exit PF.  Make ALTQ extract the packet-class tokens from mbufs
        and use them to select the packet-scheduling class.</para>
      </project>

      <project id="disk-removal">
        <title>Graceful USB disk detach/reattach</title>

        <project-details>
          <difficulty>7</difficulty>
          <contact>&a.dyoung; <email>dyoung AT NetBSD.org</email></contact>
          <contact><mlist>tech-kern</mlist></contact>
        </project-details>

        <para>Make NetBSD behave gracefully when a "live" USB/FireWire
        disk drive is accidentally detached and re-attached by, for
        example, creating a virtual block device that receives
        block-read/write commands on behalf of the underlying disk
        driver.  This device will delegate reads and writes to the disk
        driver, but it will keep a list of commands that are
        "outstanding," that is, reads that the disk driver has not
        completed, and writes that have not "hit the platter," so to
        speak.  Following disk re-attachment, the virtual block device
        replays its list of outstanding commands.  A correct solution
        will not replay commands to the wrong disk if the removable was
        replaced instead of re-attached.  Provide a character device for
        userland to read indications that a disk in use was abruptly
        detached.</para>

        <para>Open questions: Prior art?  Isn't this how the Amiga
        worked?  How will this interact with mount/unmount&mdash;is
        there a use-count on devices?  Can you leverage "wedges" in your
        solution?  Does any/most/all removable storage indicate reliably
        when a block written has actually reached the medium?</para>
      </project>

      <project id="resize_ffs">
        <title>Improve/Extend file system resizer</title>

        <project-details>
          <!-- <priority>0</priority> -->
          <difficulty>5</difficulty>
          <!-- <length>2 months</length> -->
          <contact>&a.ragge; <email>ragge AT NetBSD.org</email></contact>
          <contact><mlist>tech-kern</mlist></contact>
        </project-details>

        <para>The NetBSD source tree contains the
        <command>resize_ffs</command> tool, which allows users to grow
        or shrink file systems.  This tool needs a regression test suite,
        general code review, stability improvements and could be ported
        to FFS2 etc.</para>
        <para>Optional items include making it work on FFS2 file
        systems, or on live file systems</para>
       </project>

      <project id="pkg-update-tool">
        <title>Package update tool similar to apt-get/yum</title>

        <project-details>
          <difficulty>5</difficulty>
          <contact>&a.reed; <email>reed AT NetBSD.org</email></contact>
          <contact><mlist>tech-pkg</mlist></contact>
        </project-details>

        <para>pkgsrc currently has a set of tools, known as
        <command>pkg_install</command>, to install, remove and overall
        maintain the packages installed in a system.  Unfortunately,
        there is no tool to do automated and safe updates of all the
        installed packages so, generally, this boils down to
        deinstalling everything in the machine to later install the new
        versions.  As you can imagine, this is unacceptable for
        production machines or even desktop systems, specially if you
        are installing from source packages.  Doing such updates from
        binary packages alone is slightly tolerable because they can be
        made quickly enough (once the binaries are already available).
        It is clear that we need a tool to do massive updates on a
        running system with minimum downtime.</para>

        <para>Recently, we added package databases to our binary
        repositories, as described in &man.pkg.summary.5;.  These
        databases will make writing an update tool way easier than would
        be without them.</para>

        <para>The aim of this project is to provide a tool that:</para>
        
        <itemizedlist>
          <listitem>
            <para>Retrieves one or more pkg_summary databases.</para>
          </listitem>
          
          <listitem>
            <para>Compares what is installed with what is
            available.</para>
          </listitem>
          
          <listitem>
            <para>Updates or installs new packages as deduced in the
            previous stage.</para>
          </listitem>
        </itemizedlist>
          
        <para>The tool will have to check for conflicts and also library
        compatibilities when making a decision; note that this
        information is already available.  The tool can be interactive
        to list what will be done and prompt user to acknowledge, but
        should allow automation too.  The tool should also be able to
        just indicate what can be updated, download packages only, and
        search the databases.</para>

        <para>Ideally, such a tool could work <emphasis>both</emphasis>
        from binary and source packages, allowing the user to tune which
        ones to use.  This could make the tool useful for all systems
        that do not have up-to-date binary packages available, such as
        slow platforms or non-NetBSD systems (as pkgsrc sees much less
        use on them).  However, this is harder to achieve safely due to
        all problems that can arise when building software from sources.
        Therefore, the tool need not support this by the end of the SoC
        project, but it should be correctly designed to allow future
        extensions in this direction.</para>

        <para>At last, let us note that there was a pkg_install rewrite
        in process.  The new tools have a library ready to be used from
        C code to handle packages.  Depending on its status by the time
        when the project is started, the update tool might need to be
        built on top of this library for better integration with the new
        tools or simply to simplify its coding.  If this is not desired
        at that time, it should be built around the current
        tools.</para>

	<para> An excellent starting point to carry on with would be
	the pkg_select utility that can be found in 
	pkgsrc-wip/pkg_select, as it has lots of the requested features,
	but needs some cleanup.
	</para>

        <para>Alternatively, one may attempt to port one of the existing
        tools for other systems (<command>apt-get</command>,
        <command>yum</command>, <command>urpmi</command> or
        <command>synaptic</command> to mention some) and make them work
        with pkgsrc packages through the use of pkg_summary.  The
        downside of this approach is that the tool could not be included
        in NetBSD because it would not be BSD licensed.</para>
      </project>


      <project id="pkgsrc-create-other-packages">
        <title>Add other package format(s) to pkgsrc</title>

        <project-details>
          <difficulty>4</difficulty>
          <contact>&a.reed; <email>reed AT NetBSD.org</email></contact>
          <contact><mlist>tech-pkg</mlist></contact>
        </project-details>

        <para>
	In 2006 and 2007, the pkgsrc build system was abstracted to
	allow packaging for other package system packages.
	For details see <ulink
	url="http://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/mk/flavor/README">pkgsrc/mk/flavor/README</ulink>
	and the <ulink
	url="http://cvsweb.NetBSD.org/bsdweb.cgi/pkgsrc/mk/flavor/bsd.flavor.mk?rev=1.1&amp;content-type=text/x-cvsweb-markup">original
	commit message</ulink>
        </para>

        <para>This means pkgsrc build infrastructure may be used to
	potentially create packages that may be installed using a
	non-NetBSD packaging tools (i.e. not using NetBSD's
	<command>pkg_add</command>). Note: this is not about
	cross-builds; the packages may be built on appropriate host
	system using pkgsrc collection.</para>

	<para>This project may include creating shell command
	wrappers to mimic pkgsrc build needs as documented in
	README. (The wrappers only needed for building packages
	and not for using packages.) Also the project may include
	implementing package-specific make targets as documented
	in README. Also see suggestions to do in the initial
	commit message.</para>

	<para>The goals of this project include:
	</para>

        <itemizedlist>
          <listitem>
	    <para>Add support for RPM, dpkg, SVR4, PC-BSD PBI,
	    and/or the Solaris native package system(s).</para>
          </listitem>
          <listitem>
	    <para>Be able to build at least 100 packages and demonstrate
	    that the packages can be installed and deinstalled
	    using the corresponding system's native package tools.</para>
          </listitem>
          <listitem>
	    <para>Document support and interaction with existing
	    packages.</para>
          </listitem>
        </itemizedlist>
          
      </project>

 <!--
      <project id="better-lkms">
        <title>Improve LKM support</title>

        <project-details>
          <priority>9</priority>
          <difficulty>7</difficulty>
          <length>Unspecified</length>
          <contact>&a.matt; <email>matt AT NetBSD.org</email></contact>
          <contact><mlist>tech-kern</mlist></contact>
          <contact><mlist>tech-userlevel</mlist></contact>
        </project-details>

        <para>NetBSD currently has support for loadable kernel modules
        (LKMs), but it is extremely limited and is not usable in the
        real world.  Here are some of its deficiencies alongside the
        list of deliverables of this project:</para>

        <itemizedlist>
          <listitem>
            <para>Lack of an in-kernel linker: In order to load a
            module, the current &man.modload.8; utility calls
            the userland linker, &man.ld.1;, to link the
            module with the running kernel.  This resolves all external
            references the module has by using the
            <filename>/dev/ksyms</filename> special device.  This is
            problematic because the user must have &man.ld.1;
            installed in his machine to be able to load modules,
            something not suitable for installation media, servers, or
            embedded systems, for example.  The first part of this
            project is to implement an in-kernel linker to avoid all
            calls to ld(1).  FreeBSD has such a loader, so it might be a
            good idea to port it.</para>
          </listitem>

          <listitem>
            <para>Difficulty to build components as modules: At the
            moment, the kernel is built "monolithically" from a set of
            sources as described in a configuration file.  Modules are
            built independently, from sources that define how the module
            behaves and link to the kernel's sources directly; see the
            <filename role="cvsweb">src/sys/lkm</filename> tree.  This
            is undesirable because these two independent code
            hierarchies can easily get out of synch, causing all kinds
            of breakage (undefined or duplicate symbols, for example).
            It could be better if both the modules and the in-kernel
            code (depending on the configuration) could be built from a
            single set of sources, much like what Linux does.</para>
          </listitem>

          <listitem>
            <para>Inability to load modules from the boot loader: It'd
            be good if the kernel could be built with a minimal set of
            devices in the main binary, even excluding disk drivers.  If
            that were the case, the boot loader would need to be able to
            load modules into memory and then pass the appropriate
            information to the kernel so that they could be initialized.
            This way the kernel could be distributed as a very tiny
            binary file, alongside a huge set of modules, yet work on
            any hardware configuration with minimum effort.</para>
          </listitem>

          <listitem>
            <para>Lack of a public kernel API: The kernel currently
            lacks a definition of a public API, which means that modules
            cannot be easily redistributed because they will most likely
            not work on any other kernel version than the one they were
            built on.  This is unsuitable for binary-only drivers.  A
            public API should be defined and enforced when building
            modules.  This goes out of the scope of this project,
            however.</para>
          </listitem>
        </itemizedlist>

        <para>Please note that when adding module support, one has to
        keep in mind that everything should work from a binary-only
        distribution (except, of course, rebuilding the modules
        themselves).  The user must not have to rebuild anything on his
        own to get a module working.</para>

        <para>Now, to the way this project should be attacked; that is,
        the parts in which it can be divided:</para>

        <orderedlist>
          <listitem>
            <para>The first step is to write the kernel interface to: 1)
            trigger a module load; 2) trigger a module unload; 3) get a
            module's symbols; and 4) list loaded modules.</para>
            
            <para>For the first routine, "trigger a module load", the
            kernel needs to take a file and load it (the load could be
            done from userland though), fix up relocation information
            (implementing the missing in-kernel linker, as explained
            above) and at last call its <function>on_load</function>
            method.  This needs to be presented to userland applications
            by means of a syscall.</para>

            <para>The module should be able to indicate whether it needs
            to be in wired memory or not, as well as any other attribute
            that may be interesting.  Your task will include the design
            of a data structure that holds this information (a
            proplist?) and handle it from both sides (the module itself
            and the kernel).</para>
            
            <para>This part should be suitable for a SoC project,
            combined with some other items detailed below.</para>
          </listitem>

          <listitem>
            <para>When we have the basic load/link functionality
            provided by the previous item, we can start fleshing out
            things like dependencies, link sets and mucking autoconf to
            better suit the dynamic nature.</para>

            <para>It is important to state what relocs are supported,
            what to do about multiple symbols, symbol versioning,
            etc.  Of special interest is to investigate if we need
            dynamic shared objects (DSOs) or we can use regular objects
            for modules.  We'd like to avoid DSOs if possible, as using
            them would mean inserting small stubs for functions during
            the linking stage.</para>

            <para>The implementation of dependency tracking between
            modules is something that should be developed during SoC
            too.</para>
          </listitem>

          <listitem>
            <para>At last, one can work on the boot loader, which is
            rather difficult.  We have lots of different methods to boot
            a kernel, so it would be hard to have something unified over
            all the ports.</para>
            
            <para>A possible approach can be to bundle the kernel with
            the minimum necessary modules in a &man.md.4; image (much
            like Linux's initrd) so all the boot loader needs to do is
            boot such an image.  This could be quite easy to achieve,
            requiring no changes to the boot loaders.  Unfortunately
            this removes flexibility from the boot loader, as the kernel
            will be restricted to load those modules that were bundled
            within it.</para>
          </listitem>
        </orderedlist>
      </project>
 -->

      <project id="makefs">
        <title>makefs enhancements</title>

        <project-details>
          <difficulty>3</difficulty>
          <contact>&a.dillo; <email>dillo AT NetBSD.org</email></contact>
          <contact>&a.dyoung; <email>dyoung AT NetBSD.org</email></contact>
          <contact><mlist>tech-install</mlist></contact>
          <contact><mlist>port-mac68k</mlist></contact>
          <contact><mlist>port-macppc</mlist></contact>
        </project-details>

        <para>Recently, all ports but macppc and mac68k were switched
        from mkisofs to makefs for creation of bootable install CDs.
        The goal of this project is to add the missing features to
        makefs, so these two ports can be switched as well.  If time
        allows, adding additional useful features would be a
        bonus.</para>

        <para>Needed features:</para>

        <itemizedlist>
          <listitem>
            <para>Add Apple Type/Creator information to mtree spec file
            syntax.</para>
          </listitem>
          <listitem>
            <para>Create Apple Extensions to ISO9660.</para>
          </listitem>
	  <listitem>
            <para>Merge two directory trees (mkisofs's graft points).</para>
          </listitem>
        </itemizedlist>

        <para>May be needed:</para>

        <itemizedlist>
          <listitem>
            <para>Create of hybrid HFS/ISO9660 image.</para>
          </listitem>
          <listitem>
            <para>Install HFS boot file (possibly as separate
            post-processing step)</para>
          </listitem>
        </itemizedlist>

        <para>Additional features:</para>

        <itemizedlist>
          <listitem>
            <para>Create Joliet Extensions.</para>
          </listitem>
          <listitem>
           <para>Print size of resulting image.</para>
          </listitem>
        </itemizedlist>
      </project>

      <project id="convert-regress-to-atf">
        <title>Convert all remaining regression tests to ATF</title>

        <project-details>
          <difficulty>5</difficulty>
          <contact>&a.jmmv; <email>jmmv AT NetBSD.org</email></contact>
          <contact><mlist>tech-userlevel</mlist></contact>
        </project-details>

        <para>During the last summer of code, the Automatic Testing
	Framework has been created. Some tests from src/regress
	have been converted, but most of them are still left to do.
	The conversion difficulty ranges from very simple to moderately
	hard, but the tests need to be reviewed one by one to find the
	(upto now) undocumented constraints (like: needs to run as root,
	can not run as root, does not work on SMP machines etc.)</para>
      </project>

      <project id="rfc2661-l2tp">
        <title>Create a L2TP (RFC 2661) pseudo device</title>

        <project-details>
          <difficulty>5</difficulty>
          <contact>&a.joerg; <email>joerg AT NetBSD.org</email></contact>
          <contact>&a.martin; <email>martin AT NetBSD.org</email></contact>
          <contact><mlist>tech-net</mlist></contact>
        </project-details>

        <para>The generic Layer 2 tunnel protocol described in RFC 2661
	is used in many VPN solutions. While it is possible to implement
	it completely in userland (and such implementations exist),
	for performance reasons most of the implementation should go
	into the kernel. This leads to a design very similar to the
	NetBSD in-kernel PPPoE support, which can be used as a starting
	point for this project.</para>

	<para>A simple client could be done completely in kernel,
	but to provide a scalable server side, part of the handling
	should be done in userland. A daemon could establish and authenticate
	incoming connections, then pass them on to kernel and only become
	involved again when the kernel notifies the daemon of unusual
	events (like closing the connection).</para>

	<para>This daemon could be extended to also deal with PPPoE,
	as a bonus, but this will not be required part of the project.
	</para>

      </project>

      <project id="ledapi">
        <title>LED/LCD Generic API</title>

        <project-details>
          <!-- <priority>5</priority> -->
          <difficulty>6</difficulty>
          <!-- <length>1-2 months</length> -->
          <contact>&a.garbled; <email>garbled AT NetBSD.org</email></contact>
          <contact><mlist>tech-kern</mlist></contact>
        </project-details>

        <para>Design and implement a general API for control of LED and
        LCD type devices on NetBSD.  The API would allow devices to
        register individual LED and LCD devices, along with a set of
        capabilities for each one.  Devices that wish to display status
        via an LED/LCD would also register themselves as an event
        provider.  A userland program would control the wiring of each
        event provider, to each output indicator.  The API would need to
        encompass all types of LCD displays, such as 3 segment LCDs, 7
        segment alphanumerics, and simple on/off state LED's.  A simple
        example is a keyboard LED, which is an output indicator, and the
        caps-lock key being pressed, which is an event provider.</para>
      </project>

      <project id="addsubfiles">
        <title>Add Subfiles to FFS</title>

        <project-details>
          <!-- <priority>0</priority> -->
          <difficulty>0</difficulty>
          <!-- <length>2 months</length> -->
          <contact><mlist>tech-kern</mlist></contact>
        </project-details>

        <para>Subfiles are important for supporting the NT file model
        and will enhance Samba support. They are also important for
        NFSv4 (called Named Attributes) and are already supported by Sun
        Microsystems, Network Appliance, and EMC.</para>

        <para>For a detailed project description see <ulink
        url="http://mail-index.NetBSD.org/tech-kern/2006/04/15/0012.html">
        this post to tech-kern</ulink>.</para>
      </project>

      <project id="defrag_ffs">
        <title>Defragmentation for FFS</title>

        <project-details>
          <!-- <priority>0</priority> -->
          <difficulty>0</difficulty>
          <!-- <length>1-2 months</length> -->
          <contact><mlist>tech-kern</mlist></contact>
        </project-details>

        <para>Heavily used file systems tend to spread the blocks all
        over the disk, especially if free space is scarce. Traditionally
        dump/restore have been used to recreate the file system, but this
        is not acceptable for current disk sizes. Since resize_ffs has
        to relocate blocks during shrinking anyway, it should be
        possible to extend it to full reordering and
        defragmentation.</para>
      </project>

      <project id="zeroconf">
        <title>Zeroconf</title>

        <project-details>
          <!-- <priority>0</priority> -->
          <difficulty>0</difficulty>
          <!-- <length>Unspecified</length> -->
          <contact><mlist>tech-net</mlist></contact>
        </project-details>

        <para>Enhance zeroconfd, the Multicast DNS daemon, that was
        begun in NetBSD's Google Summer of Code 2005 (see work in
        progress: <ulink
        url="http://netbsd-soc.sourceforge.net/projects/zeroconf/"/>).
        Develop a client library that lets a process publish mDNS
        records and receive asynchronous notification of new mDNS
        records.  Adapt zeroconfd to use &man.event.3; and
        &man.queue.3;.  Demonstrate comparable functionality to the GPL
        or APSL alternatives (Avahi, Howl, ...), but in a smaller
        storage footprint, with no dependencies outside of the NetBSD
        base system.</para>
      </project>

      <project id="mdns">
        <title>Multicast DNS</title>

        <project-details>
          <!-- <priority>0</priority> -->
          <difficulty>0</difficulty>
          <!-- <length>1 month</length> -->
          <contact><mlist>tech-net</mlist></contact>
        </project-details>

        <para>Add multicast DNS support to NetBSD.  This would add
        another keyword to nsswitch.conf (mdns) and would only be valid
        for hosts.</para>

        <para>See also <ulink
        url="http://www.multicastdns.org/"/>.</para>
      </project>

      <project id="sgimips">
        <title>Port NetBSD to SGI Octane and Origin machines</title>

        <project-details>
          <!-- <priority>0</priority> -->
          <difficulty>0</difficulty>
          <!-- <length>2 months</length> -->
          <contact><mlist>port-sgimips</mlist></contact>
        </project-details>

        <para>NetBSD/sgimips currently runs on a number of SGI
        hardware, but support for IP27 (Origin) and IP30 (Octane) is not
        yet available.  An Octane for development is available for
        pickup in Hoboken, NJ (contact &a.jschauma;
        <email>jschauma AT NetBSD.org</email>).</para>

        <para>See also <ulink
        url="../ports/sgimips/">NetBSD/sgimips</ulink>.</para>
      </project>

      <project id="sgimipsR10k">
        <title>Add support for R10k CPUs in machines like the SGI O2</title>

        <project-details>
          <!-- <priority>0</priority> -->
          <difficulty>7</difficulty>
          <!-- <length>2 months</length> -->
          <contact><mlist>port-sgimips</mlist></contact>
        </project-details>

        <para>NetBSD/sgimips currently boots on O2s with R10k (or
	similar) CPUs, but crashes, as soon as a DMA transfer happens.
	Furthermore, speculative loads are not handled correctly.
	This should be fixed in the kernel (not the toolchain).</para>

        <para>See also <ulink
        url="../ports/sgimips/">NetBSD/sgimips</ulink>.</para>
      </project>

      <project id="mips16e">
        <title>Support for MIPS16e ISA</title>

        <project-details>
          <!-- <priority>0</priority> -->
          <difficulty>0</difficulty>
          <!-- <length>Unspecified</length> -->
          <contact><mlist>port-mips</mlist></contact>
          <contact><mlist>tech-ports</mlist></contact>
        </project-details>

        <para>NetBSD currently supports the MIPS32 ISA, but does not
        include support for the MIPS16e extension, which would be very
        useful for reducing the size of binaries for some kinds of
        embedded systems.  This is very much like the ARM thumb
        instructions.</para>
      </project>

      <project id="sgibootloader">
        <title>Improve the SGI bootloader</title>

        <project-details>
          <!-- <priority>0</priority> -->
          <difficulty>0</difficulty>
          <!-- <length>1-2 weeks</length> -->
          <contact><mlist>port-sgimips</mlist></contact>
        </project-details>

        <para>Currently booting a sgimips machine requires different
        boot commands depending on the architecture. It is not possible
        to use the firmware menu to boot from CD.</para>

        <para>An improved primary bootstrap should ask the firmware for
        architecture detail, and automatically boot the correct kernel
        for the current architecture by default.</para>
      </project>

      <project id="qtopia">
        <title>NetBSD port of Qtopia Core Open Source Edition</title>

        <project-details>
          <!-- <priority>0</priority> -->
          <difficulty>0</difficulty>
          <!-- <length>2 months</length> -->
          <contact><mlist>tech-embed</mlist></contact>
        </project-details>

        <para>Qtopia Core (formerly QT/Embedded) is a framework for
        building single-application devices on embedded systems.
        Currently this only runs on Linux, but many current and future
        NetBSD systems would benefit from having a light-weight
        replacement for X11 provided by Qtopia Core.</para>

        <para>See also the <ulink
        url="http://www.trolltech.com/download/qtopia/coregpl.html">Qtopia
        Core Open Source download</ulink>.</para>
      </project>

      <project id="rfparity">
        <title>Improving RAIDframe parity check after unclean shutdown</title>

        <project-details>
          <!-- <priority>5</priority> -->
          <difficulty>5</difficulty>
          <!-- <length>2 months</length> -->
          <contact>&a.oster; <email>oster AT NetBSD.org</email></contact>
          <contact>&a.tron; <email>tron AT NetBSD.org</email></contact>
          <contact><mlist>tech-kern</mlist></contact>
        </project-details>

        <para>NetBSD's RAIDframe disk driver &man.raid.4; currently checks
        the parity of a complete RAID set after an unclean shutdown. This can
        take several hours in case of RAID sets which span hundreds of
        gigabytes and will cause high I/O load on the system during that
        period.</para>

        <para>The cause of this problem is that RAIDframe currently uses a
        single bit to indicate whether or not a given RAID sets parity is
        known to be up-to date.  On an unclean shutdown, this bit indicates
        that the status of the RAID set is <emphasis>DIRTY</emphasis> and that
        a complete check of all parity on the RAID set must be done.</para>

        <para>Similar RAID drivers for other operating systems implement a
        more efficient strategy for rewriting the parity. Solaris Volume
        Manager e.g. divides the disk into logical sections and keeps track
        which of these sections are out of sync. After an unclean shutdown it
	only rewrites the parity for all sections which are marked as out of
        sync.</para>

        <para>The purpose of this project is to implement a solution which
	reduces the amount of time required to check parity after an unclean
	shutdown.</para>
      </project>

      <project id="sasl">
        <title>Create a secure SASL (RFC2222) implementation</title>

        <project-details>
          <difficulty>3</difficulty>
          <contact><mlist>tech-security</mlist></contact>
        </project-details>

        <para>RFC 2222 describes a very simple authentication mechanism
	that has been applied to various connection oriented protocols.
	One example is to authenticate MUAs with their outgoing
	mail server. This project should, at least, result in a library
	integrated with the in-tree postfix client to allow SASL based
	mail authentication. The primary design goal is a secure system,
	i.e. no postfix-user readable cleartext client password database.
	</para><para>Additional integration with pkgsrc would be a bonus.
	</para><para>Note: check dovecot and evaluate it.</para>
      </project>

      <project id="improvesyslogd">
        <title>Improve syslogd</title>

        <project-details>
          <difficulty>7</difficulty>
          <contact>&a.dholland; <email>dholland AT NetBSD.org</email></contact>
          <contact><mlist>tech-userlevel</mlist></contact>

        </project-details>

 <para>
   System logging in NetBSD (and other Unixes) has some fairly serious
   shortcomings. There is no authentication of message senders (that
   is, any user can spoof just about any system message), no
   particular guarantees that messages do not get lost, and no
   facility for rate-limiting or otherwise preventing intentional
   denial-of-service. Other drawbacks can probably be identified by
   comparing syslogd.c with government/military requirements for
   logging and auditing in secure systems.
 </para>
 <para>
   The project is to, first, analyze the problem thoroughly: determine
   what is lacking, which of these issues can reasonably be corrected,
   and what system-level or kernel-level infrastructure will be
   required to make these corrections; then, to implement a reasonable
   subset of the desired corrections and provide the documentation and
   analysis necessary for others to undertake the remainder.
 </para>
</project>

      <project id="rsyncetc">
        <title>Support for managing /etc files with rsync</title>

        <project-details>
          <difficulty>4</difficulty>
          <contact>&a.dholland; <email>dholland AT NetBSD.org</email></contact>
          <contact><mlist>tech-userlevel</mlist></contact>
        </project-details>

 <para>
   NIS is messy and insecure and unacceptable or problematic in many
   environments. While LDAP may be a possible alternative, in many
   cases a simple and tidy solution is to distribute configuration
   from a central machine using rdist, rsync, or a distributed change
   management system such as Mercurial, Git, or Monotone.
 </para>
 <para>
   Attempting to distribute all of /etc this way is problematic; in
   general it is better to set up a subdirectory that contains only
   the files that are meant to be distributed.
 </para>
 <para>
   The project is to extend libc's nsswitch mechanism to support an
   additional configuration source, "distfiles" (or some similar
   name), which reads the associated files (in the standard format)
   from /etc/distfiles (or some similar name), so that the latter
   directory can be managed with rsync and its data can be combined
   with regular /etc data in the same way it can when NIS is in use.
 </para>
</project>

      <project id="IMAPfs">
        <title>IMAPfs for mail</title>

        <project-details>
          <difficulty>9</difficulty>
          <contact><mlist>tech-userlevel</mlist></contact>
        </project-details>

 <para>
   Use puffs or refuse to write an imapfs that you can mount on
   /var/mail, either by writing a new one or porting the old existing
   Plan 9 code that does this.
 </para>
 <para>
   Note: there might be existing solutions, please check upfront and
   let us know.
 </para>
</project>

      <project id="ttyjobmigration">
        <title>Job migration/reconnection</title>

        <project-details>
          <difficulty>9</difficulty>
          <contact>&a.dholland; <email>dholland AT NetBSD.org</email></contact>
          <contact><mlist>tech-userlevel</mlist></contact>
          <contact><mlist>tech-kern</mlist></contact>
        </project-details>

 <para>
   Figure out how to move jobs (in the job control sense) between
   ttys, or reconnect to your jobs after getting hung up on.
 </para>
 <para>
   This requires a fairly substantial understanding of how job control
   and sessions work in Unix and would probably require hacking both
   the tty driver and one or more shells.
 </para>
</project>

      <project id="logwatch">
        <title>System log monitoring</title>

        <project-details>
          <difficulty>2</difficulty>
          <contact><mlist>tech-userlevel</mlist></contact>
        </project-details>

 <para>
   Apply statistical AI techniques to the problem of monitoring the
   logs of a busy system. Can one identify events of interest to a
   sysadmin, or events that merit closer inspection? Failing that, can
   one at least identify some events as routine and provide a filtered
   log that excludes them? Also, can one group a collection of related
   messages together into a single event?
 </para>
</project>

      <project id="policy_plugins">
        <title>Installable cache control (or scheduling policies)</title>

        <project-details>
          <difficulty>7</difficulty>
          <contact><mlist>tech-kern</mlist></contact>
        </project-details>

 <para>
   The policy code in the kernel that controls file caching and
   readahead behavior is necessarily one-size-fits-all, and the
   knobs available to applications to tune it, like madvise() and
   posix_fadvise(), are fairly blunt hammers. Furthermore, it has been
   shown that the overhead from user&lt;-&gt;kernel domain crossings makes
   syscall-driven fine-grained policy control ineffective.
 </para>
 <para>
   Is it possible to create a BPF-like tool (that is, a small code
   generator with very simple and very clear safety properties) to 
   allow safe in-kernel fine-grained policy control?
 </para>
 <para>
   Caution: this is a research project.
 </para>
</project>

      <project id="mmu_description_language">
        <title>MMU machine descriptions</title>

        <project-details>
          <difficulty>9</difficulty>
          <contact>&a.dholland; <email>dholland AT NetBSD.org</email></contact>
          <contact><mlist>tech-kern</mlist></contact>
        </project-details>

 <para>
   The number of pmap modules in the system is large, and most of them
   are substantially similar. This leads to the usual systemic ills
   that arise from cut and pasted code: bugs are often shared, bug
   fixes often don't propagate, and so forth.
 </para>
 <para>
   It should be possible to generate each pmap.c from a template and a
   machine description, given a suitable MMU-oriented machine
   description language. The project is to design and build the
   necessary materials.
 </para>
 <para>
   Caution: this is a research project.
 </para>
</project>


      <project id="kernel_cyclone">
        <title>Kernel-level Cyclone</title>

        <project-details>
          <difficulty>5</difficulty>
          <contact>&a.dholland; <email>dholland AT NetBSD.org</email></contact>
          <contact><mlist>tech-toolchain</mlist></contact>
        </project-details>

 <para>
   Figure out what infrastructure is necessary for writing kernel
   components (particularly device drivers) in 
   <link url="http://en.wikipedia.org/wiki/Cyclone_programming_language">
   Cyclone</link>. Implement
   it, or determine that it is not feasible, and if not, identify what
   the problems are and how they might be solved.
 </para>
</project>


      <project id="man_index">
        <title>Man page indexing</title>

        <project-details>
          <difficulty>3</difficulty>
          <contact>&a.dholland; <email>dholland AT NetBSD.org</email></contact>
          <contact><mlist>tech-userlevel</mlist></contact>
        </project-details>

 <para>
   Implement real full-text search for man pages, to replace the
   dated and nearly useless mechanism implemented in makewhatis(8).
 </para>
</project>

      <project id="man_xml">
        <title>Man page markup and formatting</title>

        <project-details>
          <difficulty>3</difficulty>
          <contact>&a.dholland; <email>dholland AT NetBSD.org</email></contact>
          <contact><mlist>tech-userlevel</mlist></contact>
        </project-details>

 <para>
   Put together an XML format equivalent to -mdoc, then write a
   bidirectional converter for man pages and a nice text-mode man
   browser.
 </para>
</project>

      <project id="xml_viewer">
        <title>XML viewer</title>

        <project-details>
          <difficulty>3</difficulty>
          <contact>&a.dholland; <email>dholland AT NetBSD.org</email></contact>
          <contact><mlist>tech-userlevel</mlist></contact>
        </project-details>


  <para>
   Write a good text-mode browser for random XML schemas.
  </para>
</project>

      <project id="ps_jobs">
        <title>Job support for ps(1)</title>

        <project-details>
          <difficulty>1</difficulty>
          <contact>&a.dholland; <email>dholland AT NetBSD.org</email></contact>
          <contact><mlist>tech-userlevel</mlist></contact>
        </project-details>

 <para>
   Extend ps to have a mode that displays jobs (at the job control
   level) and rolls their component processes together, much as how
   threads within a process are rolled together by default.
 </para>
</project>

      <project id="dvd_backup">
        <title>Redundant Arrays of Inexpensive Backups</title>

        <project-details>
          <difficulty>5</difficulty>
          <contact>&a.dholland; <email>dholland AT NetBSD.org</email></contact>
          <contact><mlist>tech-userlevel</mlist></contact>
        </project-details>

 <para>
   Build a backup system using erasure coding or some such foo on
   DVDs, so you can just add more discs over time, you only need
   some (smaller) number of them to restore, and so on, with the
   various parameters adjustable.
 </para>
 <para>
   Note: there might be existing solutions, please check upfront and
   let us know.
 </para>
</project>

      <project id="recover_ramdisk">
        <title>Recoverable ramdisk</title>

        <project-details>
          <difficulty>3</difficulty>
          <contact>&a.dholland; <email>dholland AT NetBSD.org</email></contact>
          <contact><mlist>tech-userlevel</mlist></contact>
        </project-details>

 <para>
   Laptops tend to not have power failures and some at least don't
   clear memory on reboot; can one build a ramdisk that survives
   reboot?
 </para>
</project>

      <project id="nvram_buffers">
        <title>NVRAM buffers</title>

        <project-details>
          <difficulty>5</difficulty>
          <contact>&a.dholland; <email>dholland AT NetBSD.org</email></contact>
          <contact><mlist>tech-kern</mlist></contact>
        </project-details>

 <para>
   Add support for using a non-volatile RAM card as a buffer for the
   journal of a journalled file system, so the journal can be written
   less often and in larger chunks.
 </para>
</project>

      <project id="text_indexing">
        <title>Text indexing</title>

        <project-details>
          <difficulty>7</difficulty>
          <contact>&a.dholland; <email>dholland AT NetBSD.org</email></contact>
          <contact><mlist>tech-userlevel</mlist></contact>
        </project-details>

 <para>
   Implement full-text indexing for /home, akin to Apple's Spotlight.
 </para>
</project>


      <project id="resolver_reload">
        <title>Nameserver configuration management</title>

        <project-details>
          <difficulty>5</difficulty>
          <contact>&a.dholland; <email>dholland AT NetBSD.org</email></contact>
          <contact><mlist>tech-userlevel</mlist></contact>
        </project-details>

 <para>
   Right now, if you change nameservers by editing resolv.conf, you
   have to kill and restart all running programs to get them to stop
   using the old nameserver.
 </para>
 <para>
   Figure out a clean and scalable way to get changes to resolv.conf
   to propagate to running processes.
 </para>
</project>

      <project id="code_comments">
        <title>Code Commentary</title>

        <project-details>
          <difficulty>1</difficulty>
          <contact>&a.dholland; <email>dholland AT NetBSD.org</email></contact>
          <contact><mlist>tech-userlevel</mlist></contact>
        </project-details>

 <para>
   Write a wiki-type tool to allow writing and maintaining parallel
   commentary on code. (That is, code on one side and commentary on
   the other, in the style of the old Lions book.)
 </para>
 <para>
   It is not immediately clear how tightly integrated this should be
   with cvs or cvsweb. The first step in the project is to answer this
   question.
 </para>
</project>

      <project id="bfd_replacement">
        <title>Binary Formats Toolkit</title>

        <project-details>
          <difficulty>7</difficulty>
          <contact>&a.dholland; <email>dholland AT NetBSD.org</email></contact>
          <contact><mlist>tech-toolchain</mlist></contact>
        </project-details>

 <para>
   Write a netpbm-style toolkit for converting and processing
   binary/executable formats. Since a complete such toolkit is a
   large project, the first step should be to identify a useful set of
   tools to start out with.
 </para>
 <para>
   This project could be a bottomless pit, out of scope for a summer of
   code. If you write a proposal, feel free to limit the range - but keep
   the big picture in mind!
 </para>
 <para>
   Note: evaluate FreeBSD's libelf for elf file format support.
 </para>
</project>

      <project id="wcc">
        <title>wcc(1)</title>

        <project-details>
          <difficulty>3</difficulty>
          <contact>&a.dholland; <email>dholland AT NetBSD.org</email></contact>
          <contact><mlist>tech-toolchain</mlist></contact>
        </project-details>

 <para>
   Write a tool that combines wc(1) and cc(1). That is, a program that
   behaves like a compiler but instead of compiling generates accurate
   line counts. The idea is that you can do "env CC=wcc make" to get
   a line count out.
 </para>
 <para>
   Note that this is not entirely trivial because each include file
   should be counted exactly once and you'll need machinery for
   combining counts (preserving this property) at "link" time.
 </para>
</project>

      <project id="eeprom">
        <title>Convert eeprom drivers to proplib interface</title>

        <project-details>
          <!-- <priority>3</priority> -->
          <difficulty>3</difficulty>
          <!-- <length>4-6 Weeks</length> -->
          <contact><mlist>tech-kern</mlist></contact>
          <contact>&a.garbled; <email>garbled AT NetBSD.org</email></contact>
        </project-details>

        <para>4-5 different drivers currently share the &man.eeprom.8;
        program, each with a slightly different ioctl interface.
        Because of this, each system needs its own separate code in
        &man.eeprom.8;, making the entire program ugly and
        unwieldy.</para>

        <para>Rather, a unified interface to dealing with nvram, eeprom,
        and Open Firmware environment settings should be developed,
        preferably with proplib, and all the relevant drivers should be
        converted to using that.  Once that is done, &man.eeprom.8; can
        be rewritten to no longer require nearly as much machine
        dependent code.</para>

      </project>

      <project id="shutdowntime">
        <title>Add a kernel API for timed power-on</title>

        <project-details>
          <!-- <priority>3</priority> -->
          <difficulty>4</difficulty>
          <!-- <length>3-5 Weeks</length> -->
          <contact><mlist>tech-kern</mlist></contact>
        </project-details>

        <para>Certain real time chips, and other related power hardware,
        have a facility within them to allow the kernel to set a
        specific time and date at which time the machine will power
        itself on.  One such chip is the DS1685 RTC.  A kernel API
        should be developed to allow such devices to have a
        power-on-time set from userland.  Additionally, the API should
        be made available through a userland program, or added to an
        existing utility, such as &man.halt.8;.</para>

        <para>It may also be useful to make this a more generic
        interface, to allow for configuring other devices, such as
        Wake-On-Lan ethernet chips, to turn them on/off, set them up,
        etc.</para>
      </project>

     <project id="s3virge_fb">
        <title>Framebuffer driver for S3 Virge and/or S3/Trio 64</title>

        <project-details>
          <difficulty>3</difficulty>
          <contact>&a.garbled; <email>garbled AT NetBSD.org</email></contact>
          <contact><mlist>tech-kern</mlist></contact>
        </project-details>

        <para>Many (non i386) machines used S3 graphic cards. It is one
	 of the cards primarily found on IBM machines. Having a frambuffer
	 driver for those cards would allow early console initialization
	 on those machines.</para>
      </project>

      <project id="matrox_fb">
        <title>Framebuffer driver for old Matrox cards</title>

        <project-details>
          <difficulty>3</difficulty>
          <contact>&a.garbled; <email>garbled AT NetBSD.org</email></contact>
          <contact><mlist>tech-kern</mlist></contact>
        </project-details>

        <para>Many (non i386) machines used Matrox G200 and similar graphic
	 cards.  Having a framebuffer
	 driver for those cards would allow early console initialization
	 on those machines.</para>
      </project>

      <project id="isabeep">
        <title>Unified isabeep driver</title>

        <project-details>
          <difficulty>3</difficulty>
          <contact>&a.garbled; <email>garbled AT NetBSD.org</email></contact>
          <contact><mlist>tech-kern</mlist></contact>
        </project-details>

        <para>Many ports have sysbeep/isabeep drivers, but there is
	little code sharing. This should be restructured and
	a single driver (maybe with machine dependent hooks) should
	be created.</para>
      </project>

      <project id="libsa_fb">
        <title>Framebuffer support for libsa</title>

        <project-details>
          <difficulty>5</difficulty>
          <contact>&a.garbled; <email>garbled AT NetBSD.org</email></contact>
          <contact><mlist>tech-kern</mlist></contact>
        </project-details>

        <para>On some machines (e.g. prep) the framebuffer can not be
	 used by the bootloader, so we boot blind, until the kernel
	 framebuffer driver initializes the hardware and starts
	 output.</para>
	<para>Having something genfb(4)-like plus rasop in libsa would
	 allow a full featured bootloader on graphical console.</para>
      </project>

      <project id="prep_smp">
        <title>SMP support for prep</title>

        <project-details>
          <difficulty>7</difficulty>
          <contact>&a.garbled; <email>garbled AT NetBSD.org</email></contact>
          <contact><mlist>tech-kern</mlist></contact>
        </project-details>

        <para>Add support for SMP to port prep.</para>
	<para>This project requires access to the necessary hardware
	(7025-F40 or MTX604)</para>
      </project>

      <project id="xml_util">
        <title>XML utilities</title>

        <project-details>
          <difficulty>8</difficulty>
          <contact>&a.dyoung; <email>dyoung@NetBSD.org</email></contact>
          <contact><mlist>tech-userlevel</mlist></contact>
        </project-details>

        <para>Produce a suite of simple command-line utilities that
        act on XML files as grep(1), sed(1), and join(1) act on
        plain text files.  For example, xmlgrep(1) may select
        contents of an XML file by XPath-like language, regular
        expression, or both; it may emit either a well-formed subset
        of the XML input, or plaintext.</para>
      </project>

      <project id="mini_netbsd">
        <title>Miniaturize NetBSD</title>

        <project-details>
          <difficulty>6</difficulty>
          <contact>&a.dyoung; <email>dyoung@NetBSD.org</email></contact>
        </project-details>

        <para>Produce a boot image for a system with no more than
        4MB Flash / 16MB RAM, run a useful NetBSD router with DHCP
        client/server, IPv6 route solicitation/advertisement, PPPoE,
        and an 802.11a/b/g WPA access point.  Your image must be
        replicable: using only the NetBSD sources, the 3rd-party
        sources you select, and your scripts and Makefiles, a
        developer should be able to cross-build your system boot
        image.</para>
      </project>

      <project id="jtag_kit">
        <title>JTAG Kit and Guide</title>

        <project-details>
          <difficulty>6</difficulty>
          <contact>&a.dyoung; <email>dyoung@NetBSD.org</email></contact>
          <contact><mlist>tech-embed</mlist></contact>
        </project-details>

        <para>Produce lessons and a list of affordable parts and
        free software that NetBSD hobbyists can use to teach
        themselves JTAG.  Write your lessons for a low-cost embedded
        system or expansion board that NetBSD already supports.</para>
      </project>

      <project id="nand_driver">
        <title>NAND Flash device driver</title>

        <project-details>
          <difficulty>7</difficulty>
          <contact>&a.dyoung; <email>dyoung@NetBSD.org</email></contact>
          <contact><mlist>tech-kern</mlist></contact>
        </project-details>

        <para>Write a block device driver the NAND Flash on a
        low-cost embedded board that NetBSD supports&mdash;e.g.,
        RouterBOARD 153.  Show that you can erase blocks on the
        flash, write NetBSD to the flash, and boot NetBSD with root
        on flash.  When you finish your first driver, write a driver
        for a second NAND part, and extract common code for reuse
        in the driver after that.</para>
      </project>

      <project id="physmem_region_mgmt">
        <title>Physical address-space manager</title>

        <project-details>
          <difficulty>9</difficulty>
          <contact>&a.dyoung; <email>dyoung@NetBSD.org</email></contact>
          <contact><mlist>tech-kern</mlist></contact>
        </project-details>

        <para>Replace the machine-dependent, ad-hoc mechanisms for
        allocating physical address space in NetBSD with a
        machine-independent address-space manager.</para>
      </project>

      <project id="expresscard_cardbus">
        <title>Eliminate the CardBus bus back-end; support ExpressCard</title>

        <project-details>
          <difficulty>9</difficulty>
          <contact>&a.dyoung; <email>dyoung@NetBSD.org</email></contact>
          <contact><mlist>tech-kern</mlist></contact>
        </project-details>

        <para>CardBus is essentially a hotpluggable PCI bus in a
        compact form-factor, but in NetBSD, there are independent
        CardBus and PCI bus back-ends.  The back-ends replicate a
        lot of code, and many drivers have very similar bus front-ends
        both for PCI and for CardBus.  Introduce both dynamic
        management of PCI bus resources (memory and I/O address
        space, interrupts) and insertion/ejection-event handling
        to the PCI bus back-end.  Use the PCI bus back-end to
        replace the CardBus back-end.  If time allows, use your
        PCI bus back-end improvements to support ExpressCard.</para>
      </project>

      <project id="fpga_demo">
        <title>FPGA &amp; PCI &amp; NetBSD</title>

        <project-details>
          <difficulty>9</difficulty>
          <contact>&a.dyoung; <email>dyoung@NetBSD.org</email></contact>
        </project-details>

        <para>Do something useful and cool with the 
        <ulink url="http://www.fpga4fun.com/PCI.html">Dragon FPGA board</ulink>. 
        For example, demonstrate a PCI bus master that computes 
        some useful function (encryption, signal processing, 
        neural network) for the NetBSD host, or a PCI bus analyzer 
        controlled by a NetBSD character device.  Each component of 
        your product, including the VHDL, should be open source.</para>
      </project>

      <project id="hw_bridge">
        <title>Add hardware bridge support to bridge(4)</title>

        <project-details>
          <difficulty>8</difficulty>
          <contact>&a.dyoung; <email>dyoung@NetBSD.org</email></contact>
          <contact><mlist>tech-net</mlist></contact>
        </project-details>

        <para>bridge(4) is a software implementation of an ethernet bridge.
	It copies packets from each member interface to one or more of the
	other member interfaces.  In order to do this, it puts each member
	interface into promiscuous mode, inspects each received packet's
	ethernet header to determine its destination port, and retransmits
	each packet.  This entails a lot of CPU overhead, especially at
	high packet rates.</para>
        <para>NetBSD runs on the Infineon ADM5120, a MIPS system
        on a chip that has a built-in, 6-port ethernet switch.
        The host processor controls a matrix of interconnections
        between ports that lets it either isolate each port, or
        connect it with up to five of its neighbors and the CPU to
        form a virtual LAN.  bridge(4) could exploit this matrix
        to offload a lot of its work from the CPU to the ADM5120's
        built-in switch.</para>

	<para>Design an interface between bridge(4) and its member
	interfaces for the bridge to tell each interface about the
	bridge's membership and configuration, so that each driver
	can offload the bridge's work to hardware.  Extend admsw(4)
	to use the ADM5120's switch.</para>
      </project>

<!--
      <project id="web_toolkit">
        <title>Web toolkit for embedded systems</title>

        <project-details>
          <difficulty>5</difficulty>
          <contact>&a.dyoung; <email>dyoung@NetBSD.org</email></contact>
          <contact><mlist>tech-embed</mlist></contact>
        </project-details>

        <para>TBD</para>
      </project>

      <project id="diff_w_comprehension">
        <title>diff(1) with language (pseudo-)comprehension</title>

        <project-details>
          <difficulty>9</difficulty>
          <contact>&a.dyoung; <email>dyoung@NetBSD.org</email></contact>
          <contact><mlist>tech-userlevel</mlist></contact>
        </project-details>

        <para>
	</para>
      </project>
-->

      <project id="netbsd_appliance">
        <title>Boot Images for NetBSD Appliances</title>

        <project-details>
          <difficulty>7</difficulty>
          <contact>&a.dyoung; <email>dyoung@NetBSD.org</email></contact>
          <contact><mlist>tech-toolchain</mlist></contact>
          <contact><mlist>tech-userlevel</mlist></contact>
        </project-details>

        <para>Add to build.sh the ability to build boot images for
        a NetBSD-based appliance such as a firewall, a file server,
        or a wireless router.  In addition to building a NetBSD
        kernel and distribution, build.sh needs to:

	<itemizedlist>

                <listitem>Install the system to a staging
                area.</listitem>

                <listitem>Cross-build and install 3rd-party
                application software.</listitem>

                <listitem>Filter extraneous files from the
                METALOG.</listitem>

                <listitem>Install groups and users.</listitem>

                <listitem>Install application-specific rc.conf(5),
                scripts, data and configuration files.</listitem>

                <listitem>Create a bootable FFS/ISO9660 image with
                makefs(8), disklabel(8), fdisk(8), installboot(8);
                a Network File System archive; or a kernel with
                memory-disk root.</listitem>
	</itemizedlist>
	</para>

        <para>A single specifications file should tell build.sh
        everything it needs to know to build an appliance boot
        image.  Ideally, your successful completion of this project
        will incite development of spec files for several useful
        appliances!</para>

        <para>Look closely at <ulink
        url="http://svn.cuwireless.net/svn/cuw/trunk/src/boot-image/">CUWiN's
        scripts</ulink> for cross-building NetBSD-based boot images for a
        wireless <quote>mesh</quote> router, and borrow freely.
        The scripts represent more than five years' experience with
        cross-building NetBSD appliances, and they provide most of
        the above-mentioned functions.  The scripts are not integrated
        with build.sh, however, and they do not support a spec
        file.</para>
      </project>

      <project id="hurd_translators">
        <title>HURD translators</title>

        <project-details>
          <difficulty>8</difficulty>
          <contact>&a.aymeric; <email>aymeric AT NetBSD.org</email></contact>
          <contact><mlist>tech-kern</mlist></contact>
        </project-details>

        <para>The GNU project's operating system HURD is not yet exactly ready
	for comfortable use. However, it introduces the interesting concept of
	translators, which generalize the notion of "mount point".</para>

	<para>Enabling to use HURD tranlators within NetBSD could provide added
	functionality for users of NetBSD as well as a stable and efficient
	platform for developers of HURD translators.</para>

	<para>The project touches several aspects of the kernel:
	<itemizedlist>
	<listitem>
	  <para>File system modifications: support for
	  settrans/showtrans in ext2fs and ufs, fsck changes to
	  accomodate for the presence of translators</para>
	</listitem>
	<listitem>
	  <para>Virtual file system modifications: adding the concept of
	  passive/active translator, enabling the mounting of a translator
	  on any vnode, not just a directory</para>
	</listitem>
	<listitem>
	  <para>(Writing one very basic native translator)</para>
	</listitem>
	<listitem>
	  <para>Binary emulation of GNUMach executables to the point where
	  a few native useful translators can be run</para>
	</listitem>
	</itemizedlist>
        </para>

	<para>The last point is probably very long, but can be done
	progressively. The second point is strategic because it will prove
	the concept's validity and will guarantee the success of the project
	in the long run.</para>
      </project>


      <project id="fsconsole">
	<title>File system access utilities (generalized mtools)</title>

	<project-details>
	  <difficulty>3</difficulty>
	  <contact>&a.pooka; <email>pooka AT NetBSD.org</email></contact>
	  <contact><mlist>tech-userlevel</mlist></contact>
	</project-details>

	<para>The <ulink url="http://mtools.linux.lu/">mtools</ulink>
	project provides command line tools for accessing FAT file
	system images without having to mount the file system.
	However, it duplicates a lot of equivalent code which
	already exists in a kernel file system and therefore misses
	out on synergy benefits, e.g. more testing for the same
	code.</para>

	<para>NetBSD provides support for running kernel file system
	code in userland via the
	<ulink url="http://www.NetBSD.org/docs/puffs/rump.html">Runnable
	Userspace Meta Program</ulink> functionality.  By using
	the libukfs library, it is possible to access file system
	images directly in userspace without having to mount the
	file system image.  This can be used to implement mtools-like
	functionality for any file system supported by the NetBSD
	kernel.  To the best of our knowledge, functionality to be
	implemented in this project is not available in any
	mainstream OS.</para>

	<para>The project consists of the following tasks:
	<itemizedlist>
	  <listitem>
	    <para>Design and implement a set of tools for file
	    system access.  Usage examples are:
	    <command>rdir ffs ~/ffs.img /bin</command>, which would
	    list the "/bin" directory of an ffs image,
	    <command>rcat efs ~/efs.img /etc/passwd</command> which
	    would display the contents of "/etc/passwd" on an
	    efs image, and <command>rrmdir msdos /dev/rwd1a /nukeme</command>
	    would remove the directory "nukeme" from an msdosfs
	    file system on wd1a.</para>
	  </listitem>

	  <listitem>
	    <para>Additionally, if there is time left, implement
	    the same functionality as a command console similar to
	    e.g. <command>fsdb</command>.  Since this allows to retain
	    state across different file system requests, it could provide
	    extra features not possible with standalone command line
	    tools.  This and the command line utilities should either
	    share a common backend, or the command line utilities can
	    be implemented as a frontend to the command console.</para>
	  </listitem>

	  <listitem>
	    <para>Implement a test suite for regression testing
	    of the utilities created in the project.</para>
	  </listitem>

	  <listitem>
	    <para>For extra credit, verify that the created utilities
	    are buildable and work on non-NetBSD platforms.  NetBSD kernel
	    file systems have already been run in userspace on non-NetBSD
	    platforms, so this is known to be possible.</para>
	  </listitem>
	</itemizedlist></para>

	<para>To get an idea of how to proceed with the implementation,
	the very unfinished <ulink url="http://cvsweb.NetBSD.org/bsdweb.cgi/src/sys/rump/fs/bin/fsconsole/">fsconsole</ulink>
	can be studied along with the <ulink url="http://cvsweb.NetBSD.org/bsdweb.cgi/src/sys/rump/fs/lib/libukfs/">ukfs</ulink>
	library programming interface.  mtools can also be studied for
	inspiration.</para>

	<para>This focal point of this project is producing tools
	with good usability.  Even though kernel file system code
	will be used, this project will be implemented entirely in
	userspace and there is no need to understand kernel file
	system code.</para>

	<para>In a very very distant future the above toolset could
	be integrated with standard POSIX.1 command line utilities,
	e.g. <command>ls</command> and <command>mknod</command>.
	But since this requires huge changes to e.g. how system
	calls are handled, how mount points are handled, and what
	the OS treats as a service, it is most definitely outside
	the scope of a SoC project.  This is mentioned just to
	point out that there are plenty of future research
	opportunities for interested students familiar with the
	problem area.</para>
      </project>

      <project id="rumpmakefs">
	<title>Convert <command>makefs</command> to use kernel fs code</title>

	<project-details>
	  <difficulty>8</difficulty>
	  <contact>&a.dyoung; <email>dyoung AT NetBSD.org</email></contact>
	  <contact>&a.pooka; <email>pooka AT NetBSD.org</email></contact>
	  <contact><mlist>tech-userlevel</mlist></contact>
	</project-details>

	<para>The <command>makefs</command> utility creates a file system
	image from a given directory tree.  For ffs, it is currently
	implemented using specially modified kernel code to populate
	the file system image.</para>

	<para>The goal of this project is to convert
	makefs to use vanilla kernel file system code with the help of the
	<ulink url="http://www.NetBSD.org/docs/puffs/rump.html">Runnable
	Userspace Meta Program</ulink> framework and the ukfs
	library.  This will reduce code duplication and will also
	provide the option to support any kernel file system with
	write support.</para>

	<para>The project's work areas are two-faceted: they involve
	both the build framework and file system creation:
	<itemizedlist>
	  <listitem>
	    <para>Figure out how to get librump and the relevant
	    file system libraries compiled as part of the tool build.
	    This involves most likely making them shared libraries,
	    which involves figuring out how to flag ABI incompatibilities
	    (tag the library with the kernel version?).  It also
	    involves figuring out how to install the same libraries
	    as part of the base system.</para>
	  </listitem>

	  <listitem>
	    <para>Test and make sure that the resulting code runs
	    at least on NetBSD, FreeBSD and some Linux distributions.
	    The NetBSD kernel file system code has been run in
	    userspace on Linux with ukfs before, but support has
	    likely bitrotted.</para>
	  </listitem>

	  <listitem>
	    <para>Implement support for file system creation for
	    at least FAT.</para>
	  </listitem>

	  <listitem>
	    <para>Convert ffs to use the vanilla kernel ffs code
	    and ukfs instead of handcrafted code.  Add equivalent
	    support for at least FAT.</para>
	  </listitem>
	</itemizedlist></para>

	<para>The project will be implemented entirely in userspace.
	While file system knowledge is a requirement for creating
	empty file systems, handling kernel file system code is
	not a requirement.  The student should have a good understanding
	about the build framework.</para>
      </project>

      <project id="wifi_viz">
	<title>WiFi Packet Visualizer</title>

	<project-details>
	  <difficulty>6</difficulty>
	  <contact>&a.dyoung; <email>dyoung AT NetBSD.org</email></contact>
	  <contact><mlist>tech-net</mlist></contact>
	</project-details>

        <para>Create an add-on for Wireshark that reads a trace of
        802.11 packets with radiotap headers, and renders each
        packet as a trapezoid on a timeline, like this:</para>

	<inlinemediaobject><imageobject>
	<imagedata fileref="http://www.NetBSD.org/~dyoung/wifi%20visualizer%20diagram.png"/></imageobject></inlinemediaobject>

<!--
<screen>
                _______            _       _____
        ______/_______/__________/_/_____/_____/_________________
           |       |    \_\| \__\  |       |     \_\       |                    
           0T      1T      2T      3T      4T      5T      6T

                                    _           ________
        __________________________/_/_________/________/_________
           | \__________________\  |       |       |       |                    
           7T      8T      9T      10T     11T     12T     13T

</screen>
-->

        <para>Place the left edge of a trapezoid to represent a
        packet's time of arrival.  Set the length of the top or
        bottom edge in proportion to transmit duration.  Use other
        display properties of the trapezoid such as shear, hue,
        saturation, height, texture, and top-edge width to express
        packet properties such as signal strength, bitrate, type
        (management, data, control), MAC, and BSSID.</para>

        <para>In 2003, a student team worked on the visualizer.
        They did not produce a finished product, but their report
        on <ulink
        url="http://slappy.cs.uiuc.edu/fall03/team1/files/docs/FinalFinalDocument.pdf">Argos</ulink>
        may help you.</para>

        <para>While you design and code the display add-on, keep
        in mind both the important 802.11 transactions, such as
        (RTS/CTS/)Data/Ack, and export to SVG, PDF, or PostScript
        for reproduction on the WWW or in print.</para>

      </project>

      <project id="fs-services">
        <title>File Systems as Network Services</title>

        <project-details>
          <difficulty>7</difficulty>
          <contact>&a.pooka; <email>pooka AT NetBSD.org</email></contact>
          <contact><mlist>tech-userlevel</mlist></contact>
        </project-details>

	<para>File systems are historically mounted by specifying
	which type of file system is mounted from where (e.g.
	<command>mount -t ffs /dev/wd0a /mnt</command>).   However,
	sometimes a user is only interested in making the data
	available and not particularly interested in how or from where
	it is made available.</para>

	<para>This project investigates the first steps in turning
	file systems into network-transparent services by making it
	possible to mount any kernel file system type from any location
	on the network.  The file system components to be used are
	<ulink url="http://www.NetBSD.org/docs/puffs/">puffs</ulink> and
	<ulink url="http://www.NetBSD.org/docs/puffs/rump.html">rump</ulink>.
	puffs is used to forward local file system requests from
	the kernel to userspace and rump is used to facilitate
	running the kernel file system in userspace as a service daemon.
	</para>

	<para>
	The subtasks are the following:
	<itemizedlist>
	  <listitem>
	    <para>Write the necessary code to be able to forward
	    requests from one source to another.  This involves
	    most likely reworking a bit of the libpuffs option
	    parsing code and creating an puffs client, say,
	    <command>mount_puffs</command> to be able to forward
	    requests from one location to another.  The puffs protocol
	    should be extended to include the necessary new features
	    or another protocol defined.</para>

	    <para>Proof-on-concept code for this has already been
	    written.</para>
	  </listitem>

	  <listitem>
	    <para>Currently the puffs protocol used for communication
	    between the kernel and userland is machine dependent.
	    To facilitate forwarding the protocol to remote hosts, a
	    machine independent version must be specified.</para>
	  </listitem>

	  <listitem>
	    <para>To be able to handle multiple clients, the file
	    systems must be converted to daemons instead of being
	    utilities.  This will also, in the case of kernel file
	    system servers, include adding locking to the communication
	    protocol.</para>
	  </listitem>
	</itemizedlist></para>

	<para>The end result will look something like this:</para>
<screen>
# start serving ffs from /dev/wd0a on port 12675
onehost> ffs_serv -p 12675 /dev/wd0a
# start serving cd9660 from /dev/cd0a on port 12676
onehost> cd9660_serv -p 12675 /dev/cd0a

# meanwhile in outer space, mount anotherhost from port 12675
anotherhost> mount_puffs -t tcp onehost:12675 /mnt
anotherhost> mount
...
anotherhost:12675 on /mnt type &lt;negotiated&gt;
...
anotherhost> cd /mnt
anotherhost> ls
  ... etc
</screen>

	 <para>The student should have some familiarity with file
	 systems and network services.  The application should
	 include an answer to the following question: "how is this
	 different from nfs?"</para>
      </project>

      <project id="sysinst_split">
        <title>Split sysinst into front and back end</title>

        <project-details>
          <difficulty>5</difficulty>
          <contact>&a.garbled; <email>root AT garbled.net</email></contact>
          <contact><mlist>tech-install</mlist></contact>
        </project-details>

<para>
Sysinst is the current installer for NetBSD.  Currently, the installer is an
interactive process, where it asks you questions, and acts immediately on those
answers.</para>

<para>
Sysinst should instead be broken into two components.  A front end, which asks
a number of questions about the install, such as disk layout, machine name,
etc, and a back end, which does the actual installation.  The front end, should
create an installation configuration file, which would describe the
installation to be performed to the back end.  This configuration file should
be flexible enough, that it can be hand-edited to contain things such as "swap
should be 10% of the disk, or at least 128MB".  In this way, a default
configuration could be shipped, which would allow the user to simply bypass the
front end, and run the back end.</para>

<para>
The back end would do all the actual work of the installation, taking it's cues
from the description file.  With a flexible enough configuration file, it would
be possible to build a kickstart/jumpstart like system by supplying config
files and executing them via the backend.</para>

      </project>
      <project id="openafs_client">
        <title>Port OpenAFS client support to NetBSD</title>
	
        <project-details>
          <difficulty>7</difficulty>
          <contact>&a.ober; <email>ober AT NetBSD.org</email></contact>
          <contact><mlist>tech-net</mlist></contact>
        </project-details>

<para>
OpenAFS currently exists in pkgsrc for the server portion. Client support would require fixing the legacy NetBSD client support. Updates would need to either make use of the new LKM interface or possibly PUFFS.</para>
      </project>
    </projects>

</webpage>
