Background
==========

- Priority scale: High, Medium and Low

- Complexity scale: C1, C2, C4 and C8.  The complexity scale is exponential,
  with complexity 1 being the lowest complexity.  Complexity is a function
  of both task 'complexity' and task 'scope'.

  The general rule of thumb is that a complexity 1 task should take 1-2 weeks
  for a person very familiar with the codebase.  Higher complexity tasks
  require more time and have higher uncertainty.

  Higher complexity tasks should be refined into several lower complexity tasks
  once the task is better understood.


mac80211_hwsim
==============

- Add support for returning HWSIM_ATTR_RADIO_ID from HWSIM_CMD_CREATE_RADIO

  The HWSIM_CMD_CREATE_RADIO command should return HWSIM_CMD_CREATE_RADIO
  on success so that the radio id for the created wiphy can be mapped by
  test tools or when having to destroy that radio again.

  Priority: High
  Complexity: C1

- Add support for client tracking of HWSIM_CMD_CREATE_RADIO

  When using HWSIM_CMD_CREATE_RADIO command the newly created radio is
  not bound to the owner of the netlink socket.  This means that the radio
  stays around even after the client quits.  For testing tools it would
  be beneficial if the newly created radio could be bound to the lifetime
  of the netlink socket.

  Create a new HWSIM_ATTR_DESTROY_RADIO_ON_CLOSE (netlink flag attribute)
  that can be given to HWSIM_CMD_CREATE_RADIO to indicate this behavior.

  Priority: High
  Complexity: C1

- Rename HWSIM_CMD_CREATE_RADIO into HWSIM_CMD_NEW_RADIO

  Using the name HWSIM_CMD_NEW_RADIO is more fitting on how other pieces
  of the wireless system work.

  Rename the HWSIM_CMD_CREATE_RADIO entry in the enum and provde a define
  for source level comaptiblity.

  Priority: Medium
  Complexity: C1

- Rename HWSIM_CMD_DESTROY_RADIO into HWSIM_CMD_DEL_RADIO

  Using the name HWSIM_CMD_DEL_RADIO is more fitting on how other pieces
  of the wireless system work.

  Rename the HWSIM_CMD_DESTROY_RADIO entry in the enum and provde a define
  for source level comaptiblity.

  Priority: Medium
  Complexity: C1

- Provide multicast events for HWSIM_CMD_NEW_RADIO and HWSIM_CMD_DEL_RADIO

  When adding new radios via HWSIM_CMD_NEW_RADIO then listeners on the
  multicast group "config" should be informed.  Same as when an existing
  radio gets removed via HWSIM_CMD_DEL_RADIO, send event to "config"
  multicast group.

  The multicast group "config" does not exist at the moment and needs
  be introduced as well.

  Priority: Medium
  Complexity: C1

- Add support for HWSIM_CMD_GET_RADIO command

  Currently it is not possible to list the existing radio created by
  mac80211_hwsim.  Use the command to dump a list of radios where each
  radio at minimum containts the HWSIM_ATTR_RADIO_ID.

  For the result HWSIM_CMD_NEW_RADIO (previously HWSIM_CMD_CREATE_RADIO)
  should be used.

  The dump version should not require any attributes and list all radios
  while otherwise the HWSIM_ATTR_RADIO_ID is required to provide details
  of a specific radio.

  Priority: Medium
  Complexity: C1

- Add support for HWSIM_CMD_SET_RADIO command

  To allow modifying an existing radio, add the HWSIM_CMD_SET_RADIO.  The
  first possible feature should be to emulate the hardware RFKILL switch.

  It might be required to add a HWSIM_ATTR_RADIO_HW_RFKILL attribute flag
  to the HWSIM_CMD_NEW_RADIO to enable virtual radios with a hardware
  level RFKILL switch.

  Priority: Medium
  Complexity: C1

- Allow configuration of MAC address or list of MAC addresses

  The radios are auto-generating a fake MAC address.  It would be useful
  to allow specifying a MAC address to be used.  In certain cases it might
  be also useful to provide a list of MAC addresses so that for example
  with secondary interfaces these can be used.

  Priority: Low
  Complexity: C2

- Move mac80211_hwsim.h header file to UAPI includes

  The mac80211_hwsim.h is the public API description of this netlink
  interface and thus it should be provided via UAPI includes.

  For this work work the mac80211_hwsim.h header needs to be modified
  so that it also compiles from userspace.  At the moment it throws
  errors.  And it needs to become part of the UAPI headers of the
  Linux kernel.

  In addition it should provide HWSIM_GENL_NAME that provides the
  generic netlink "MAC82011_HWSIM" family string.

  Priority: Low
  Complexity: C1

- Provide kernel option to allow defining the number of initial radios

  By default the mac80211_hwsim modules creates 2 radios by default unless
  it is overwritten with the radios=x module parameter.

  To allow loading the mac80211_hwsim by default and even with accidental
  loading of the module, it would be good to provide a kernel configuration
  option that allows changing the default value here.

  For our testing we want to load mac80211_hwsim without any radios. Maybe
  this should be the default for the new kernel option.

  If the default of initial radios can be changed to zero, then it is also
  possible to add MODULE_ALIAS_GENL_FAMILY to support auto-loading of
  the mac80211_hwsim kernel module.

  Priority: Low
  Complexity: C1

- New configuration options for radios

  At the moment the radios created are all equal and feature rich.  However
  for testing we want to create radios with different emulated hardware
  capabilities.  Provide new attributes or flags that allow enabling or
  disabling certain mac80211 features.

  For example AP mode, P2P mode, number of interface combinations, TDLS
  support, number of Scan SSIDs, supported ciphers and so on.

  Priority: Low
  Complexity: C2


cfg80211 / nl80211
==================

- Fix missing NL80211_CMD_NEW_WIPHY and NL80211_CMD_DEL_WIPHY events

  When new wiphy devices are added or removed ensure that the appropiate
  events are send to the "config" multicast group.

  Priority: High
  Complexity: C1

- Fix missing NL80211_CMD_NEW_INTERFACE and NL80211_CMD_DEL_INTERFACE events

  When new network interfaces added or removed ensure that the appropiate
  events are send to the "config" multicast group.

  Priority: High
  Complexity: C1

- Bind NL80211_CMD_START_SCHED_SCAN to netlink socket

  When issuing the NL80211_CMD_START_SCHED_SCAN it should be bound to the
  executing netlink client socket.  If the application closes that netlink
  socket the scheduled scan operation should be canceled.

  Maybe a new attribute similar to NL80211_ATTR_IFACE_SOCKET_OWNER should
  be used for this behavior.

  Priority: Medium
  Complexity: C2

- Disconnect from network / station when client crashes

  When associating or connecting to a network, it should be possible to
  bind this transaction to a specific netlink client.  So that in case
  this client terminates without, any connection will be also terminated.

  This should affect NL80211_CMD_ASSOCIATE and NL80211_CMD_CONNECT.  It
  seems that this is not needed for NL80211_CMD_AUTHENTICATE since that
  command will eventually time out, but it might be a good idea to even
  support it there.

  Maybe a new attribute similar to NL80211_ATTR_IFACE_SOCKET_OWNER should
  be used for this behavior.

  Priority: High
  Complexity: C4

- Add missing support for NL80211_CMD_GET_INTERFACE filtering

  The NL80211_CMD_GET_INTERFACE command description indicates that you
  can filter results based NL80211_ATTR_WIPHY.  This feature has never
  been implemented.

  Either remove that feature from the description since it does not exist
  or actually implemented the filtering on wiphy.  Johannes indicated that
  fixing the description might be the better approach.  If the feature is
  easy to add, then it should be added.  However if filtering on wiphy is
  a rather complicated task, then better just update the description to
  match the reality.

  Priority: Low
  Complexity: C2


Wireless monitor
================

- Add support for Information Element (IE) decoding

  Several netlink attributes provide binary blobs representing IEs.  Add
  support for decoding them inline using the src/ie.c infrastructure.

  Priority: Medium
  Complexity: C1

- Create netlink monitor interface if it does not exist

  Currently the netlink monitor interface needs to be created manually
  and also brought up.  The iwmon utility could just automate this task
  by using RTNL to find an existing netlink monitor interface, and in
  case it does not exist, create a new one.

  It might be beneficial that when iwmon terminates that it then also
  removes the netlink monitor interface again (in case it created it).

  Alternatively a command line option might be used for controlling
  this behavior of creating and removing netlink monitor interfaces.

  Priority: Medium
  Complexity: C1

- Subscribe to all nl80211 multicast groups at startup

  It seems the nlmon packets are limited to actual subscribed mutlicast
  groups.  To get a complete picture of all the nl80211 commands and
  events, it is required that iwmon adds membership to all multicast
  groups that the nl80211 lists.

  This means that the netlink socket used for resolving nl80211 family
  name needs to be kept open and actively processed since it will also
  receive these multicast events.  However the event itself can be dropped
  since the one from nlmon with the proper kernel level timestamps should
  be taken into account.

  An alternative is to fix the netlink_deliver_tap() function in the
  kernel netlink layer to not be affected by the broadcast filtering.

  Priority: Medium
  Complexity: C1

- Add support for receiving kernel side timestamps

  When packets are received from nlmon, they should be marked with an
  appropiate timestamp.  Enable SO_TIMESTAMP socket option.

  Priority: Medium
  Complexity: C1

- Colorize the command, response and event packets

  Use terminal colors to separate command, response and event packets
  with different colors.

  Priority: Medium
  Complexity: C1

- Add support for writing PCAP files

  The new -w <file> option should allow for writing PCAP files with the
  Linux SLL link type.

  When creating PCAP files using tcpdump a lot of extra information from
  all netlink sockets are written.  This write support should only write
  the information related to nl80211.  However parts from the generic
  netlink control channel from resolving the nl80211 family name must
  be included as well.

  It might be also beneficial to include RTNL messages related to the
  wireless network interfaces.  Currently these are all filtered out.

  Priority: Medium
  Complexity: C2

- Track RTNL messages for wireless network interface

  The RTNL messages indicate operation state changes and with are also
  relevant for a complete picture of the userspace kernel communication.

  However the complicated part is to identify which network interfaces
  are wireless related and which are not.  Obviously the non-wireless
  network interfaces need to be filtered out.

  Priority: Medium
  Complexity: C2

- Handle netlink core control messages correctly

  The core control netlink messages for NLMSG_ERROR and NLMSG_DONE are
  not decoded properly.  Add detailed decoding and also decode all the
  flags that are related to the core control messages.

  Priority: High
  Complexity: C1


Wireless simulator
==================

- Add support for builtin wireless access point emulator

  When creating a pair of mac80211_hwsim radios, allow one to operate as
  access point.  The hwsim utility will emulate the access point on the
  second interface for as long as it is running.  Which means that from
  the first interface it is possible to scan and connect to this access
  point using standard wireless tools (including iwd and iwctl).

  Code for the AP mode can be shared from iwd feature for access point
  operation once that has been implemented.

  Priority: Medium
  Complexity: C8


Wireless daemon
===============

- Parsing and building of 802.11 management frames

  Multiple frames types are send around via nl80211 interface.  These
  frames need to be parsed and build via generic infrastructure.

  Priority: High
  Complexity: C4

- Add support for 4-way handshake authentication and key generation

  The 4-way handshake key generation for pre-shared keys (PSK) should be
  a standalone feature (independent from EAP).

  It is also important to have extensive unit test support for 4-way
  handshake messages and key generation itself.

  Priority: High
  Complexity: C4

- Add support for EAP based authentication and key generation

  Provide full EAP support for enterprise wireless.  However it should be
  possible to build wireless daemon without EAP support.

  It is also intended that this EAP code can be utilized as shared library
  and be beneficial for systemd-networkd for wired authentication.

  Priority: Low
  Complexity: C8