Full Code of open-sdr/openwifi for AI

master 8fd674f720f0 cached
233 files
1.9 MB
658.0k tokens
800 symbols
2 requests
Download .txt
Showing preview only (2,035K chars total). Download the full file or copy to clipboard to get everything.
Repository: open-sdr/openwifi
Branch: master
Commit: 8fd674f720f0
Files: 233
Total size: 1.9 MB

Directory structure:
gitextract_cw_8qgx2/

├── .github/
│   └── ISSUE_TEMPLATE/
│       └── issue-description.md
├── .gitmodules
├── CONTRIBUTING.md
├── LICENSE
├── LICENSES/
│   ├── AGPL-3.0-or-later.txt
│   ├── BSD-3-Clause.txt
│   ├── GPL-2.0-or-later.txt
│   └── ISC.txt
├── README.md
├── doc/
│   ├── README.md
│   ├── app_notes/
│   │   ├── 40mhz.png.license
│   │   ├── README.md
│   │   ├── ad-hoc-two-sdr.md
│   │   ├── ap-client-two-sdr.md
│   │   ├── csi-architecture.jpg.license
│   │   ├── csi-information-format.jpg.license
│   │   ├── csi-screen-shot.jpg.license
│   │   ├── csi.md
│   │   ├── csi_fuzzer.md
│   │   ├── driver_stat.md
│   │   ├── drv_fpga_dynamic_loading.md
│   │   ├── frequent_trick.md
│   │   ├── guard-interval.png.license
│   │   ├── hls.md
│   │   ├── ieee80211n.md
│   │   ├── inject_80211.md
│   │   ├── iq-architecture.jpg.license
│   │   ├── iq-capture-parameter.jpg.license
│   │   ├── iq-information-format.jpg.license
│   │   ├── iq-screen-shot.jpg.license
│   │   ├── iq.md
│   │   ├── iq_2ant-screen-shot.jpg.license
│   │   ├── iq_2ant-setup.png.license
│   │   ├── iq_2ant.md
│   │   ├── iq_ack_timing.md
│   │   ├── mimo.png.license
│   │   ├── mpdu-aggr.png.license
│   │   ├── packet-iq-self-loopback-test.md
│   │   ├── perf_counter.md
│   │   ├── radar-self-csi.md
│   │   └── subcarriers.png.license
│   ├── asic/
│   │   └── skywater-130-pdk-and-asic-considerations.md
│   ├── cite-openwifi-github-code.md
│   ├── cite-openwifi-vtc-paper.md
│   ├── img_build_instruction/
│   │   └── kuiper.md
│   ├── known_issue/
│   │   └── notter.md
│   ├── openwifi-detail.jpg.license
│   ├── publications.md
│   ├── rf-digital-if-chain-config.jpg.license
│   ├── rf-digital-if-chain-spectrum.jpg.license
│   └── videos.md
├── driver/
│   ├── Makefile
│   ├── hw_def.h
│   ├── make_all.sh
│   ├── openofdm_rx/
│   │   ├── Makefile
│   │   └── openofdm_rx.c
│   ├── openofdm_tx/
│   │   ├── Makefile
│   │   └── openofdm_tx.c
│   ├── rx_intf/
│   │   ├── Makefile
│   │   └── rx_intf.c
│   ├── sdr.c
│   ├── sdr.h
│   ├── sdrctl_intf.c
│   ├── side_ch/
│   │   ├── Makefile
│   │   ├── make_driver.sh
│   │   ├── side_ch.c
│   │   └── side_ch.h
│   ├── sysfs_intf.c
│   ├── tx_intf/
│   │   ├── Makefile
│   │   └── tx_intf.c
│   ├── xilinx_dma/
│   │   ├── README.md
│   │   ├── make_xilinx_dma.sh
│   │   └── xilinx_dma.c
│   └── xpu/
│       ├── Makefile
│       └── xpu.c
├── kernel_boot/
│   ├── 10-network-device.rules
│   ├── 70-persistent-net.rules
│   ├── ad9361.patch
│   ├── ad9361_conv.patch
│   ├── ad9361_private.patch
│   ├── axi_hdmi_crtc.patch
│   ├── boards/
│   │   ├── adrv9361z7035/
│   │   │   ├── devicetree.dtb
│   │   │   ├── devicetree.dts
│   │   │   └── u-boot.elf
│   │   ├── adrv9361z7035_fmc/
│   │   │   ├── devicetree.dtb
│   │   │   ├── devicetree.dts
│   │   │   └── u-boot.elf
│   │   ├── adrv9364z7020/
│   │   │   ├── devicetree.dtb
│   │   │   ├── devicetree.dts
│   │   │   └── u-boot.elf
│   │   ├── antsdr/
│   │   │   ├── devicetree.dtb
│   │   │   ├── devicetree.dts
│   │   │   ├── notes.md
│   │   │   └── u-boot.elf
│   │   ├── antsdr_e200/
│   │   │   ├── README.md
│   │   │   ├── devicetree.dtb
│   │   │   ├── devicetree.dts
│   │   │   └── u-boot.elf
│   │   ├── e310v2/
│   │   │   ├── README.md
│   │   │   ├── devicetree.dtb
│   │   │   ├── devicetree.dts
│   │   │   └── u-boot.elf
│   │   ├── neptunesdr/
│   │   │   ├── devicetree.dtb
│   │   │   ├── devicetree.dts
│   │   │   └── u-boot.elf
│   │   ├── sdrpi/
│   │   │   ├── devicetree.dtb
│   │   │   ├── devicetree.dts
│   │   │   ├── notes.md
│   │   │   └── u-boot.elf
│   │   ├── zc702_fmcs2/
│   │   │   ├── devicetree.dtb
│   │   │   ├── devicetree.dts
│   │   │   └── u-boot.elf
│   │   ├── zc706_fmcs2/
│   │   │   ├── devicetree.dtb
│   │   │   ├── devicetree.dts
│   │   │   └── u-boot.elf
│   │   ├── zcu102_fmcs2/
│   │   │   ├── bl31.elf
│   │   │   ├── system.dtb
│   │   │   ├── system.dts
│   │   │   └── u-boot_xilinx_zynqmp_zcu102_revA.elf
│   │   └── zed_fmcs2/
│   │       ├── devicetree.dtb
│   │       ├── devicetree.dts
│   │       └── u-boot.elf
│   ├── build_boot_bin.sh
│   ├── build_zynqmp_boot_bin.sh
│   ├── kernel_config
│   ├── kernel_config_zynqmp
│   └── kernel_patch_readme.md
├── openwifi-arch.jpg.license
└── user_space/
    ├── agc_settings.sh
    ├── arbitrary_iq_gen/
    │   ├── iq_single_carrier_1000000Hz_512.txt
    │   └── single_carrier_gen.m
    ├── boot_bin_gen.sh
    ├── build_wpa_supplicant_wo11b.sh
    ├── cd_adi_iio_dir.sh
    ├── check_calib_inf.sh
    ├── csi_fuzzer.sh
    ├── csi_fuzzer_scan.sh
    ├── cw_disable.sh
    ├── cw_max_min_cfg.sh
    ├── dhcpd.conf
    ├── difs_disable.sh
    ├── driver_nl80211.patch
    ├── drv_and_fpga_package_gen.sh
    ├── eifs_by_last_rx_fail_disable.sh
    ├── eifs_by_last_tx_fail_disable.sh
    ├── eifs_disable.sh
    ├── fast_reg_log/
    │   ├── fast_reg_log.c
    │   └── fast_reg_log_analyzer.m
    ├── fosdem-11ag.sh
    ├── fosdem.sh
    ├── hostapd-openwifi-11ag.conf
    ├── hostapd-openwifi.conf
    ├── inject_80211/
    │   ├── Makefile
    │   ├── analyze_80211.c
    │   ├── ieee80211_radiotap.h
    │   ├── inject_80211.c
    │   ├── inject_80211.h
    │   ├── inject_80211.sh
    │   ├── radiotap.c
    │   ├── radiotap.h
    │   ├── unaligned.h
    │   └── uthash.h
    ├── link_perf_test.sh
    ├── load_fpga_img.sh
    ├── monitor_ch.sh
    ├── nav_disable.sh
    ├── nic_back_to_normal.sh
    ├── openwifi_ad9361_fir.ftr
    ├── openwifi_ad9361_fir_tx_0MHz.ftr
    ├── openwifi_ad9361_fir_tx_0MHz_11n.ftr
    ├── openwifi_ad9361_fir_tx_0MHz_11n_narrow1.ftr
    ├── populate_driver_userspace.sh
    ├── populate_kernel_image_module_reboot.sh
    ├── post_config.sh
    ├── prepare_kernel.sh
    ├── receiver_phase_offset_override.sh
    ├── rf_init.sh
    ├── rf_init_11n.sh
    ├── rssi_ad9361_show.sh
    ├── rssi_openwifi_show.sh
    ├── rx_gain_show.sh
    ├── rx_stat_show.sh
    ├── sdcard_boot_update.sh
    ├── sdr-ad-hoc-join.sh
    ├── sdr-ad-hoc-up.sh
    ├── sdrctl_src/
    │   ├── Makefile
    │   ├── cmd.c
    │   ├── nl80211.h
    │   ├── nl80211_testmode_def.h
    │   ├── sdrctl.c
    │   ├── sdrctl.h
    │   ├── sections.c
    │   └── version.sh
    ├── set_dbg_ch0.sh
    ├── set_dbg_ch1.sh
    ├── set_dbg_ch2.sh
    ├── set_lbt_th.sh
    ├── set_restrict_freq.sh
    ├── set_rx_gain_auto.sh
    ├── set_rx_gain_manual.sh
    ├── set_rx_monitor_all.sh
    ├── set_rx_target_sender_mac_addr.sh
    ├── set_tx_lo.sh
    ├── set_tx_port.sh
    ├── setup_once.sh
    ├── side_ch_ctl_src/
    │   ├── iq_capture.py
    │   ├── iq_capture_2ant.py
    │   ├── iq_capture_freq_offset.py
    │   ├── save_iq_to_txt_for_verilog_sim.m
    │   ├── show_iq_snr.m
    │   ├── side_ch_ctl.c
    │   ├── side_info_display.py
    │   ├── test_iq_2ant_file_display.m
    │   ├── test_iq_file_ack_timing_display.m
    │   ├── test_iq_file_display.m
    │   └── test_side_info_file_display.m
    ├── slice_cfg.sh
    ├── stat_enable.sh
    ├── system_top.bif
    ├── transfer_driver_userspace_to_board.sh
    ├── transfer_kernel_image_module_to_board.sh
    ├── tx_intf_iq_data_to_sysfs.sh
    ├── tx_intf_iq_send.sh
    ├── tx_prio_queue_show.sh
    ├── tx_stat_show.sh
    ├── update_sdcard.sh
    ├── webserver/
    │   ├── index.html
    │   ├── openwifi-detail.jpg.license
    │   └── openwifi-logo-small.jpg.license
    ├── wgd.sh
    ├── wpa-connect.conf
    ├── wpa-openwifi.conf
    └── wpa-testap.conf

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/ISSUE_TEMPLATE/issue-description.md
================================================
---
name: Issue description
about: Please report issue by this template
title: ''
labels: ''
assignees: ''

---

0. Could you send email to xianjun.jiao@ugent.be to introduce your self?

1. Our image is used directly or you build your own image?

2. What is your own modification?

3. Versions: OS, Vivado, openwifi/openwifi-hw repo branch and commit revision

4. Board/hardware type

5. WiFi channel number

6. Steps to reproduce the issue, and the related error message, screenshot, etc

7. Describe your debug efforts by Linux native tools, such as tcpdump and "cat /proc/interrupts"

8. Describe your debug efforts by: https://github.com/open-sdr/openwifi/blob/master/doc/README.md#Debug-methods

9. Any other thing we need to know for helping you better? 


================================================
FILE: .gitmodules
================================================
[submodule "adi-linux"]
	path = adi-linux
	url = https://github.com/analogdevicesinc/linux.git
[submodule "adi-linux-64"]
	path = adi-linux-64
	url = https://github.com/analogdevicesinc/linux.git


================================================
FILE: CONTRIBUTING.md
================================================
<!--
Author: Xianjun jiao
SPDX-FileCopyrightText: 2019 UGent
SPDX-License-Identifier: AGPL-3.0-or-later
-->

CLA([Individual](https://github.com/open-sdr/openwifi-hw-img/raw/master/doc_repo/openwifi-Individual.pdf), [Entity](https://github.com/open-sdr/openwifi-hw-img/raw/master/doc_repo/openwifi-Entity.pdf)) needs to be signed and sent to Filip.Louagie@UGent.be before you contributing.

CLA is generated by the [Project Harmony](http://www.harmonyagreements.org/index.html).


================================================
FILE: LICENSE
================================================
                    GNU AFFERO GENERAL PUBLIC LICENSE
                       Version 3, 19 November 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

                            Preamble

  The GNU Affero General Public License is a free, copyleft license for
software and other kinds of works, specifically designed to ensure
cooperation with the community in the case of network server software.

  The licenses for most software and other practical works are designed
to take away your freedom to share and change the works.  By contrast,
our General Public Licenses are intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.

  Developers that use our General Public Licenses protect your rights
with two steps: (1) assert copyright on the software, and (2) offer
you this License which gives you legal permission to copy, distribute
and/or modify the software.

  A secondary benefit of defending all users' freedom is that
improvements made in alternate versions of the program, if they
receive widespread use, become available for other developers to
incorporate.  Many developers of free software are heartened and
encouraged by the resulting cooperation.  However, in the case of
software used on network servers, this result may fail to come about.
The GNU General Public License permits making a modified version and
letting the public access it on a server without ever releasing its
source code to the public.

  The GNU Affero General Public License is designed specifically to
ensure that, in such cases, the modified source code becomes available
to the community.  It requires the operator of a network server to
provide the source code of the modified version running there to the
users of that server.  Therefore, public use of a modified version, on
a publicly accessible server, gives the public access to the source
code of the modified version.

  An older license, called the Affero General Public License and
published by Affero, was designed to accomplish similar goals.  This is
a different license, not a version of the Affero GPL, but Affero has
released a new version of the Affero GPL which permits relicensing under
this license.

  The precise terms and conditions for copying, distribution and
modification follow.

                       TERMS AND CONDITIONS

  0. Definitions.

  "This License" refers to version 3 of the GNU Affero General Public License.

  "Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.

  "The Program" refers to any copyrightable work licensed under this
License.  Each licensee is addressed as "you".  "Licensees" and
"recipients" may be individuals or organizations.

  To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy.  The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.

  A "covered work" means either the unmodified Program or a work based
on the Program.

  To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy.  Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.

  To "convey" a work means any kind of propagation that enables other
parties to make or receive copies.  Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.

  An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License.  If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.

  1. Source Code.

  The "source code" for a work means the preferred form of the work
for making modifications to it.  "Object code" means any non-source
form of a work.

  A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.

  The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form.  A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.

  The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities.  However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work.  For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.

  The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.

  The Corresponding Source for a work in source code form is that
same work.

  2. Basic Permissions.

  All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met.  This License explicitly affirms your unlimited
permission to run the unmodified Program.  The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work.  This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.

  You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force.  You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright.  Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.

  Conveying under any other circumstances is permitted solely under
the conditions stated below.  Sublicensing is not allowed; section 10
makes it unnecessary.

  3. Protecting Users' Legal Rights From Anti-Circumvention Law.

  No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.

  When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.

  4. Conveying Verbatim Copies.

  You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.

  You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.

  5. Conveying Modified Source Versions.

  You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:

    a) The work must carry prominent notices stating that you modified
    it, and giving a relevant date.

    b) The work must carry prominent notices stating that it is
    released under this License and any conditions added under section
    7.  This requirement modifies the requirement in section 4 to
    "keep intact all notices".

    c) You must license the entire work, as a whole, under this
    License to anyone who comes into possession of a copy.  This
    License will therefore apply, along with any applicable section 7
    additional terms, to the whole of the work, and all its parts,
    regardless of how they are packaged.  This License gives no
    permission to license the work in any other way, but it does not
    invalidate such permission if you have separately received it.

    d) If the work has interactive user interfaces, each must display
    Appropriate Legal Notices; however, if the Program has interactive
    interfaces that do not display Appropriate Legal Notices, your
    work need not make them do so.

  A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit.  Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.

  6. Conveying Non-Source Forms.

  You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:

    a) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by the
    Corresponding Source fixed on a durable physical medium
    customarily used for software interchange.

    b) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by a
    written offer, valid for at least three years and valid for as
    long as you offer spare parts or customer support for that product
    model, to give anyone who possesses the object code either (1) a
    copy of the Corresponding Source for all the software in the
    product that is covered by this License, on a durable physical
    medium customarily used for software interchange, for a price no
    more than your reasonable cost of physically performing this
    conveying of source, or (2) access to copy the
    Corresponding Source from a network server at no charge.

    c) Convey individual copies of the object code with a copy of the
    written offer to provide the Corresponding Source.  This
    alternative is allowed only occasionally and noncommercially, and
    only if you received the object code with such an offer, in accord
    with subsection 6b.

    d) Convey the object code by offering access from a designated
    place (gratis or for a charge), and offer equivalent access to the
    Corresponding Source in the same way through the same place at no
    further charge.  You need not require recipients to copy the
    Corresponding Source along with the object code.  If the place to
    copy the object code is a network server, the Corresponding Source
    may be on a different server (operated by you or a third party)
    that supports equivalent copying facilities, provided you maintain
    clear directions next to the object code saying where to find the
    Corresponding Source.  Regardless of what server hosts the
    Corresponding Source, you remain obligated to ensure that it is
    available for as long as needed to satisfy these requirements.

    e) Convey the object code using peer-to-peer transmission, provided
    you inform other peers where the object code and Corresponding
    Source of the work are being offered to the general public at no
    charge under subsection 6d.

  A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.

  A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling.  In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage.  For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product.  A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.

  "Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source.  The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.

  If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information.  But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).

  The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed.  Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.

  Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.

  7. Additional Terms.

  "Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law.  If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.

  When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it.  (Additional permissions may be written to require their own
removal in certain cases when you modify the work.)  You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.

  Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:

    a) Disclaiming warranty or limiting liability differently from the
    terms of sections 15 and 16 of this License; or

    b) Requiring preservation of specified reasonable legal notices or
    author attributions in that material or in the Appropriate Legal
    Notices displayed by works containing it; or

    c) Prohibiting misrepresentation of the origin of that material, or
    requiring that modified versions of such material be marked in
    reasonable ways as different from the original version; or

    d) Limiting the use for publicity purposes of names of licensors or
    authors of the material; or

    e) Declining to grant rights under trademark law for use of some
    trade names, trademarks, or service marks; or

    f) Requiring indemnification of licensors and authors of that
    material by anyone who conveys the material (or modified versions of
    it) with contractual assumptions of liability to the recipient, for
    any liability that these contractual assumptions directly impose on
    those licensors and authors.

  All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10.  If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term.  If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.

  If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.

  Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.

  8. Termination.

  You may not propagate or modify a covered work except as expressly
provided under this License.  Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).

  However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.

  Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.

  Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License.  If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.

  9. Acceptance Not Required for Having Copies.

  You are not required to accept this License in order to receive or
run a copy of the Program.  Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance.  However,
nothing other than this License grants you permission to propagate or
modify any covered work.  These actions infringe copyright if you do
not accept this License.  Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.

  10. Automatic Licensing of Downstream Recipients.

  Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License.  You are not responsible
for enforcing compliance by third parties with this License.

  An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations.  If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.

  You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License.  For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.

  11. Patents.

  A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based.  The
work thus licensed is called the contributor's "contributor version".

  A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version.  For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.

  Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.

  In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement).  To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.

  If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients.  "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.

  If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.

  A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License.  You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.

  Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.

  12. No Surrender of Others' Freedom.

  If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all.  For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.

  13. Remote Network Interaction; Use with the GNU General Public License.

  Notwithstanding any other provision of this License, if you modify the
Program, your modified version must prominently offer all users
interacting with it remotely through a computer network (if your version
supports such interaction) an opportunity to receive the Corresponding
Source of your version by providing access to the Corresponding Source
from a network server at no charge, through some standard or customary
means of facilitating copying of software.  This Corresponding Source
shall include the Corresponding Source for any work covered by version 3
of the GNU General Public License that is incorporated pursuant to the
following paragraph.

  Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU General Public License into a single
combined work, and to convey the resulting work.  The terms of this
License will continue to apply to the part which is the covered work,
but the work with which it is combined will remain governed by version
3 of the GNU General Public License.

  14. Revised Versions of this License.

  The Free Software Foundation may publish revised and/or new versions of
the GNU Affero General Public License from time to time.  Such new versions
will be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

  Each version is given a distinguishing version number.  If the
Program specifies that a certain numbered version of the GNU Affero General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation.  If the Program does not specify a version number of the
GNU Affero General Public License, you may choose any version ever published
by the Free Software Foundation.

  If the Program specifies that a proxy can decide which future
versions of the GNU Affero General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.

  Later license versions may give you additional or different
permissions.  However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.

  15. Disclaimer of Warranty.

  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  16. Limitation of Liability.

  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.

  17. Interpretation of Sections 15 and 16.

  If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.

                     END OF TERMS AND CONDITIONS

            How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU Affero General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Affero General Public License for more details.

    You should have received a copy of the GNU Affero General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

  If your software can interact with users remotely through a computer
network, you should also make sure that it provides a way for users to
get its source.  For example, if your program is a web application, its
interface could display a "Source" link that leads users to an archive
of the code.  There are many ways you could offer source, and different
solutions will be better for different programs; see section 13 for the
specific requirements.

  You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU AGPL, see
<http://www.gnu.org/licenses/>.


================================================
FILE: LICENSES/AGPL-3.0-or-later.txt
================================================
                    GNU AFFERO GENERAL PUBLIC LICENSE
                       Version 3, 19 November 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

                            Preamble

  The GNU Affero General Public License is a free, copyleft license for
software and other kinds of works, specifically designed to ensure
cooperation with the community in the case of network server software.

  The licenses for most software and other practical works are designed
to take away your freedom to share and change the works.  By contrast,
our General Public Licenses are intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.

  Developers that use our General Public Licenses protect your rights
with two steps: (1) assert copyright on the software, and (2) offer
you this License which gives you legal permission to copy, distribute
and/or modify the software.

  A secondary benefit of defending all users' freedom is that
improvements made in alternate versions of the program, if they
receive widespread use, become available for other developers to
incorporate.  Many developers of free software are heartened and
encouraged by the resulting cooperation.  However, in the case of
software used on network servers, this result may fail to come about.
The GNU General Public License permits making a modified version and
letting the public access it on a server without ever releasing its
source code to the public.

  The GNU Affero General Public License is designed specifically to
ensure that, in such cases, the modified source code becomes available
to the community.  It requires the operator of a network server to
provide the source code of the modified version running there to the
users of that server.  Therefore, public use of a modified version, on
a publicly accessible server, gives the public access to the source
code of the modified version.

  An older license, called the Affero General Public License and
published by Affero, was designed to accomplish similar goals.  This is
a different license, not a version of the Affero GPL, but Affero has
released a new version of the Affero GPL which permits relicensing under
this license.

  The precise terms and conditions for copying, distribution and
modification follow.

                       TERMS AND CONDITIONS

  0. Definitions.

  "This License" refers to version 3 of the GNU Affero General Public License.

  "Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.

  "The Program" refers to any copyrightable work licensed under this
License.  Each licensee is addressed as "you".  "Licensees" and
"recipients" may be individuals or organizations.

  To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy.  The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.

  A "covered work" means either the unmodified Program or a work based
on the Program.

  To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy.  Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.

  To "convey" a work means any kind of propagation that enables other
parties to make or receive copies.  Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.

  An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License.  If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.

  1. Source Code.

  The "source code" for a work means the preferred form of the work
for making modifications to it.  "Object code" means any non-source
form of a work.

  A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.

  The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form.  A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.

  The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities.  However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work.  For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.

  The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.

  The Corresponding Source for a work in source code form is that
same work.

  2. Basic Permissions.

  All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met.  This License explicitly affirms your unlimited
permission to run the unmodified Program.  The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work.  This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.

  You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force.  You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright.  Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.

  Conveying under any other circumstances is permitted solely under
the conditions stated below.  Sublicensing is not allowed; section 10
makes it unnecessary.

  3. Protecting Users' Legal Rights From Anti-Circumvention Law.

  No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.

  When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.

  4. Conveying Verbatim Copies.

  You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.

  You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.

  5. Conveying Modified Source Versions.

  You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:

    a) The work must carry prominent notices stating that you modified
    it, and giving a relevant date.

    b) The work must carry prominent notices stating that it is
    released under this License and any conditions added under section
    7.  This requirement modifies the requirement in section 4 to
    "keep intact all notices".

    c) You must license the entire work, as a whole, under this
    License to anyone who comes into possession of a copy.  This
    License will therefore apply, along with any applicable section 7
    additional terms, to the whole of the work, and all its parts,
    regardless of how they are packaged.  This License gives no
    permission to license the work in any other way, but it does not
    invalidate such permission if you have separately received it.

    d) If the work has interactive user interfaces, each must display
    Appropriate Legal Notices; however, if the Program has interactive
    interfaces that do not display Appropriate Legal Notices, your
    work need not make them do so.

  A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit.  Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.

  6. Conveying Non-Source Forms.

  You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:

    a) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by the
    Corresponding Source fixed on a durable physical medium
    customarily used for software interchange.

    b) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by a
    written offer, valid for at least three years and valid for as
    long as you offer spare parts or customer support for that product
    model, to give anyone who possesses the object code either (1) a
    copy of the Corresponding Source for all the software in the
    product that is covered by this License, on a durable physical
    medium customarily used for software interchange, for a price no
    more than your reasonable cost of physically performing this
    conveying of source, or (2) access to copy the
    Corresponding Source from a network server at no charge.

    c) Convey individual copies of the object code with a copy of the
    written offer to provide the Corresponding Source.  This
    alternative is allowed only occasionally and noncommercially, and
    only if you received the object code with such an offer, in accord
    with subsection 6b.

    d) Convey the object code by offering access from a designated
    place (gratis or for a charge), and offer equivalent access to the
    Corresponding Source in the same way through the same place at no
    further charge.  You need not require recipients to copy the
    Corresponding Source along with the object code.  If the place to
    copy the object code is a network server, the Corresponding Source
    may be on a different server (operated by you or a third party)
    that supports equivalent copying facilities, provided you maintain
    clear directions next to the object code saying where to find the
    Corresponding Source.  Regardless of what server hosts the
    Corresponding Source, you remain obligated to ensure that it is
    available for as long as needed to satisfy these requirements.

    e) Convey the object code using peer-to-peer transmission, provided
    you inform other peers where the object code and Corresponding
    Source of the work are being offered to the general public at no
    charge under subsection 6d.

  A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.

  A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling.  In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage.  For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product.  A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.

  "Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source.  The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.

  If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information.  But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).

  The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed.  Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.

  Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.

  7. Additional Terms.

  "Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law.  If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.

  When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it.  (Additional permissions may be written to require their own
removal in certain cases when you modify the work.)  You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.

  Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:

    a) Disclaiming warranty or limiting liability differently from the
    terms of sections 15 and 16 of this License; or

    b) Requiring preservation of specified reasonable legal notices or
    author attributions in that material or in the Appropriate Legal
    Notices displayed by works containing it; or

    c) Prohibiting misrepresentation of the origin of that material, or
    requiring that modified versions of such material be marked in
    reasonable ways as different from the original version; or

    d) Limiting the use for publicity purposes of names of licensors or
    authors of the material; or

    e) Declining to grant rights under trademark law for use of some
    trade names, trademarks, or service marks; or

    f) Requiring indemnification of licensors and authors of that
    material by anyone who conveys the material (or modified versions of
    it) with contractual assumptions of liability to the recipient, for
    any liability that these contractual assumptions directly impose on
    those licensors and authors.

  All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10.  If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term.  If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.

  If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.

  Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.

  8. Termination.

  You may not propagate or modify a covered work except as expressly
provided under this License.  Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).

  However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.

  Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.

  Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License.  If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.

  9. Acceptance Not Required for Having Copies.

  You are not required to accept this License in order to receive or
run a copy of the Program.  Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance.  However,
nothing other than this License grants you permission to propagate or
modify any covered work.  These actions infringe copyright if you do
not accept this License.  Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.

  10. Automatic Licensing of Downstream Recipients.

  Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License.  You are not responsible
for enforcing compliance by third parties with this License.

  An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations.  If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.

  You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License.  For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.

  11. Patents.

  A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based.  The
work thus licensed is called the contributor's "contributor version".

  A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version.  For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.

  Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.

  In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement).  To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.

  If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients.  "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.

  If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.

  A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License.  You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.

  Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.

  12. No Surrender of Others' Freedom.

  If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all.  For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.

  13. Remote Network Interaction; Use with the GNU General Public License.

  Notwithstanding any other provision of this License, if you modify the
Program, your modified version must prominently offer all users
interacting with it remotely through a computer network (if your version
supports such interaction) an opportunity to receive the Corresponding
Source of your version by providing access to the Corresponding Source
from a network server at no charge, through some standard or customary
means of facilitating copying of software.  This Corresponding Source
shall include the Corresponding Source for any work covered by version 3
of the GNU General Public License that is incorporated pursuant to the
following paragraph.

  Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU General Public License into a single
combined work, and to convey the resulting work.  The terms of this
License will continue to apply to the part which is the covered work,
but the work with which it is combined will remain governed by version
3 of the GNU General Public License.

  14. Revised Versions of this License.

  The Free Software Foundation may publish revised and/or new versions of
the GNU Affero General Public License from time to time.  Such new versions
will be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

  Each version is given a distinguishing version number.  If the
Program specifies that a certain numbered version of the GNU Affero General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation.  If the Program does not specify a version number of the
GNU Affero General Public License, you may choose any version ever published
by the Free Software Foundation.

  If the Program specifies that a proxy can decide which future
versions of the GNU Affero General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.

  Later license versions may give you additional or different
permissions.  However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.

  15. Disclaimer of Warranty.

  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  16. Limitation of Liability.

  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.

  17. Interpretation of Sections 15 and 16.

  If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.

                     END OF TERMS AND CONDITIONS

            How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU Affero General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Affero General Public License for more details.

    You should have received a copy of the GNU Affero General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

  If your software can interact with users remotely through a computer
network, you should also make sure that it provides a way for users to
get its source.  For example, if your program is a web application, its
interface could display a "Source" link that leads users to an archive
of the code.  There are many ways you could offer source, and different
solutions will be better for different programs; see section 13 for the
specific requirements.

  You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU AGPL, see
<http://www.gnu.org/licenses/>.


================================================
FILE: LICENSES/BSD-3-Clause.txt
================================================
Modified BSD license (no advertisement clause):

Copyright (c) 2002-2017, Jouni Malinen <j@w1.fi> and contributors
All Rights Reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:

1. Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in the
   documentation and/or other materials provided with the distribution.

3. Neither the name(s) of the above-listed copyright holder(s) nor the
   names of its contributors may be used to endorse or promote products
   derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


================================================
FILE: LICENSES/GPL-2.0-or-later.txt
================================================

GNU GENERAL PUBLIC LICENSE
Version 2, June 1991

Copyright (C) 1989, 1991 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA

Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

Preamble

The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too.

When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.

To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.

For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.

We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.

Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.

Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.

The precise terms and conditions for copying, distribution and modification follow.

TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

    0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you".

    Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.
    1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.

    You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
    2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
        a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.
        b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.
        c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)

    These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.

    Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.

    In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
    3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:
        a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
        b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
        c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)

    The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.

    If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.
    4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
    5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.
    6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.
    7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.

    If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.

    It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.

    This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
    8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
    9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.

    Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.
    10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.

    NO WARRANTY
    11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
    12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

END OF TERMS AND CONDITIONS

How to Apply These Terms to Your New Programs

If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.

To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.

<one line to give the program's name and an idea of what it does.>
Copyright (C) <yyyy> <name of author>

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

Also add information on how to contact you by electronic and paper mail.

If the program is interactive, make it output a short notice like this when it starts in an interactive mode:

Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program.

You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names:

Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker.

<signature of Ty Coon>, 1 April 1989 Ty Coon, President of Vice

This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License.
Standard License Header

<one line to give the program's name and an idea of what it does.>
Copyright (C) <yyyy> <name of author>

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.



================================================
FILE: LICENSES/ISC.txt
================================================
Copyright <YEAR> <OWNER>

Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.


================================================
FILE: README.md
================================================
<!--
Author: Xianjun jiao, Michael Mehari, Wei Liu
SPDX-FileCopyrightText: 2019 UGent
SPDX-License-Identifier: AGPL-3.0-or-later
-->

# openwifi
<img src="./openwifi-arch.jpg" width="900">

**openwifi:** Linux mac80211 compatible full-stack IEEE802.11/Wi-Fi design based on SDR (Software Defined Radio).

- We remain committed to open source, which is our foundation. To access advanced features and dedicated support, consider a **SUBSCRIPTION**. More info on https://openwifi.tech

[[Download img and Quick start](#Download-img-and-Quick-start)] [[known issue](doc/known_issue/notter.md)] [[**Tips for Windows users**](https://github.com/open-sdr/openwifi/discussions/341)]

This repository includes Linux driver and software. **openwifi-hw** repository has the FPGA design. It is **YOUR RESPONSIBILITY** to follow your **LOCAL SPECTRUM REGULATION** or use **CABLE** to avoid potential interference over the air.

[[Project document](doc/README.md)]
[[Application notes](doc/app_notes/README.md)]
[[Videos](doc/videos.md)]
[[Publications and How to Cite](doc/publications.md)]
[[maillist](https://lists.ugent.be/wws/subscribe/openwifi)]

Openwifi code has dual licenses. [AGPLv3](https://github.com/open-sdr/openwifi/blob/master/LICENSE) is the opensource license. For non-opensource and advanced feature license, please fill a contact form on https://openwifi.tech. Openwifi project also leverages some 3rd party modules. It is user's duty to check and follow licenses of those modules according to the purpose/usage. You can find [an example explanation from Analog Devices](https://github.com/analogdevicesinc/hdl/blob/master/LICENSE) for this compound license conditions. [[How to contribute]](https://github.com/open-sdr/openwifi/blob/master/CONTRIBUTING.md). 

**Features:**

- 802.11a/g/n [[IEEE 802.11n (Wi-Fi 4)](doc/app_notes/ieee80211n.md)]
- 20MHz bandwidth; [70 MHz to 6 GHz frequency range](doc/README.md#let-openwifi-work-at-arbitrary-frequency)
- Mode tested: [Ad-hoc](doc/app_notes/ad-hoc-two-sdr.md); [Station; AP](doc/app_notes/ap-client-two-sdr.md), Monitor
- [DCF (CSMA/CA) low MAC layer in FPGA (10us SIFS is achieved)](doc/app_notes/frequent_trick.md)
- [802.11 packet injection and fuzzing](doc/app_notes/inject_80211.md)
- [CSI](doc/app_notes/csi.md): Channel State Information, freq offset, equalizer to computer
- [CSI fuzzer](doc/app_notes/csi_fuzzer.md): Create artificial channel response in WiFi transmitter
- [CSI radar](doc/app_notes/radar-self-csi.md): Moving detection. Joint radar and communication
- [[IQ capture](doc/app_notes/iq.md)]: real-time AGC, RSSI, IQ sample to computer. [[Dual antenna version](doc/app_notes/iq_2ant.md)]
- [Configurable channel access priority parameters](doc/app_notes/frequent_trick.md):
  - CCA threshold, receiver sensitivity, etc
  - duration of RTS/CTS, CTS-to-self
  - SIFS/DIFS/xIFS/slot-time/CW/etc
- [Time slicing based on MAC address (time gated/scheduled FPGA queues)](https://doc.ilabt.imec.be/ilabt/wilab/tutorials/openwifi.html#sdr-tx-time-slicing)
- Easy to change bandwidth and [frequency](doc/README.md#let-openwifi-work-at-arbitrary-frequency): 
  - 2MHz for 802.11ah in sub-GHz
  - 10MHz for 802.11p/vehicle in 5.9GHz
- **802.11ax** and more advanced features, check: https://openwifi.tech

**Performance (best case: aggregation/AMPDU on):**
- iperf: TCP 40~50Mbps; UDP 50Mbps
- EVM -38dB; MCS0 sensitivity -92dBm; MCS7 -73dBm. (FMCOMMS2 2.4GHz; cable and OTA test)

**Supported SDR platforms:**

board_name|Description|Vivado license
----------|-----------|--------------
zc706_fmcs2|[Xilinx ZC706 board](https://www.xilinx.com/products/boards-and-kits/ek-z7-zc706-g.html) + [FMCOMMS2/3/4](https://www.analog.com/en/design-center/evaluation-hardware-and-software/evaluation-boards-kits/eval-ad-fmcomms2.html)|Need
zed_fmcs2|[Xilinx zed board](https://www.xilinx.com/products/boards-and-kits/1-8dyf-11.html) + [FMCOMMS2/3/4](https://www.analog.com/en/design-center/evaluation-hardware-and-software/evaluation-boards-kits/eval-ad-fmcomms2.html)|**NO** need
adrv9364z7020|[ADRV9364-Z7020 + ADRV1CRR-BOB](https://www.analog.com/en/design-center/evaluation-hardware-and-software/evaluation-boards-kits/adrv9364-z7020.html)|**NO** need
adrv9361z7035|[ADRV9361-Z7035 + ADRV1CRR-BOB/FMC](https://www.analog.com/en/design-center/evaluation-hardware-and-software/evaluation-boards-kits/ADRV9361-Z7035.html)|Need
zc702_fmcs2|[Xilinx ZC702 board](https://www.xilinx.com/products/boards-and-kits/ek-z7-zc702-g.html) + [FMCOMMS2/3/4](https://www.analog.com/en/design-center/evaluation-hardware-and-software/evaluation-boards-kits/eval-ad-fmcomms2.html)|**NO** need
antsdr|[MicroPhase](https://github.com/MicroPhase/) enhanced ADALM-PLUTO [Notes](kernel_boot/boards/antsdr/notes.md)|**NO** need
e310v2|[MicroPhase](https://github.com/MicroPhase/) new antsdr [Notes](kernel_boot/boards/e310v2/README.md)|**NO** need
antsdr_e200|[MicroPhase](https://github.com/MicroPhase/) enhanced ADALM-PLUTO (smaller/cheaper) [Notes](kernel_boot/boards/antsdr_e200/README.md)|**NO** need
sdrpi|[HexSDR](https://github.com/HexSDR/) SDR in Raspberry Pi size [Notes](kernel_boot/boards/sdrpi/notes.md)|**NO** need
zcu102_fmcs2|[Xilinx ZCU102 board](https://www.xilinx.com/products/boards-and-kits/ek-u1-zcu102-g.html) + [FMCOMMS2/3/4](https://www.analog.com/en/design-center/evaluation-hardware-and-software/evaluation-boards-kits/eval-ad-fmcomms2.html)|Need
neptunesdr|Low cost Zynq 7020 + AD9361 board (Unofficial!)|**NO** need
LibreSDR|[Low cost Zynq 7020 + AD9361 board (Unofficial!)](https://github.com/pavelyazev/openwifi-libresdr)|**NO** need

- Check [Porting guide](#Porting-guide) for your new board if it isn't in the list.
- board_name is used to identify FPGA design in openwifi-hw/boards/ and FPGA image in openwifi-hw-img/boards
- Don't have any boards? Or you like JTAG boot instead of SD card? Check our test bed [w-iLab.t](https://doc.ilabt.imec.be/ilabt/wilab/tutorials/openwifi.html) tutorial.

[[Download img and Quick start](#Download-img-and-Quick-start)]
[[Basic operations](#Basic-operations)]
[[Update FPGA](#Update-FPGA)]
[[Update Driver](#Update-Driver)]
[[Update sdrctl](#Update-sdrctl)]
[[Update Misc Helpers](#Update-Misc-Helpers)]

[[Build openwifi Linux img from scratch](#Build-openwifi-Linux-img-from-scratch)]
[[Special note for 11b](#Special-note-for-11b)]
[[Porting guide](#Porting-guide)]
[[Project document](doc/README.md)]
[[Application notes](doc/app_notes/README.md)]

## Download img and Quick start
- Download [openwifi img](https://users.ugent.be/~xjiao/openwifi-1.5.0-shahecheng.img.xz), unzip and burn it into a SD card (>=16GB). After this operation, the SD card should have two partitions: BOOT and rootfs. To flash the SD card, SD card tool software (such as Startup Disk Creator in Ubuntu) or dd command can be used:
  ```
  sudo dd bs=512 count=31116288 if=openwifi-xyz.img of=/dev/your_sdcard_dev
  (To have correct count value, better to check the .img file actual situation by "fdisk -l img_filename")
  ```
- Config the **correct files in the BOOT partition** according to the **board you have** by operation on your computer: 
  - Copy files in **BOOT/openwifi/board_name** to the base directory of BOOT partition.
  - Delete the **rootfs/root/kernel_modules** directory (if exist).
  - Delete the **rootfs/etc/network/interfaces.new** directory (if exist).
- Insert the SD card to the board. Configure the board in SD booting mode. Connect antennas. Power on. 
- Login to the board from your PC (PC Ethernet should have IP 192.168.10.1) with password **openwifi**.
  ```
  ssh root@192.168.10.122
  ```
- If not successful, check [known issue](doc/known_issue/notter.md)
- Then, run openwifi AP and the on board webserver
  ```
  raspi-config --expand-rootfs (Only needed when your SD card > 16GB. Run and reboot)
  ./openwifi/setup_once.sh (Reboot the board. Only need to run once for new board)
  cd openwifi
  ./wgd.sh
  ./fosdem.sh
  (Use "./wgd.sh 1" to enable experimental AMPDU aggregation on top of 11n)
  (Use "./fosdem-11ag.sh" to force 11a/g mode)
  ```
  **NOTE** adrv9361z7035 has ultra low TX power in 5GHz. Move **CLOSER** when you use that board in 5GHz!!!
- After you see the "openwifi" SSID on your device (Phone/Laptop/etc), connect it (If not get 192.168.13.* IP automatically, check [known issue](doc/known_issue/notter.md)). Browser to 192.168.13.1 on your device, you should see the webpage hosted by the webserver on board.
  - Note 1: If your device doesn't support 5GHz (ch44), please change the **hostapd-openwifi.conf** on board and re-run fosdem.sh.
  - Note 2: After ~2 hours, the Viterbi decoder will halt (Xilinx Evaluation License). Just reload FPGA ([method](doc/app_notes/drv_fpga_dynamic_loading.md)) or simply power cycle the board if it happens. (If output of "./sdrctl dev sdr0 get reg rx 20" is always the same, it means the decoder halts)
- To give the Wi-Fi client internet access, configure routing/NAT **on the PC**:
  ```
  sudo sysctl -w net.ipv4.ip_forward=1
  sudo iptables -t nat -A POSTROUTING -o NICY -j MASQUERADE
  sudo ip route add 192.168.13.0/24 via 192.168.10.122 dev ethX
  ```
  **ethX** is the PC NIC name connecting the board ethernet. **NICY** is the PC NIC name connecting internet (WiFi or another ethernet).
  
  If you want, uncommenting "net.ipv4.ip_forward=1" in /etc/sysctl.conf to make IP forwarding persistent on PC.
- To monitor **real-time CSI (Chip State Information)**, such as timestamp, frequency offset, channel state, equalizer, please refer to [[CSI notes](doc/app_notes/csi.md)].

## Basic operations
The board actually is an Linux/Ubuntu computer which is running **hostapd** to offer Wi-Fi AP functionality over the Wi-Fi Network Interface (NIC). The NIC is implemented by openwifi-hw FPGA design. We use the term **"On board"** to indicate that the commands should be executed after ssh login to the board. **"On PC"** means the commands should run on PC.
- Bring up the openwifi NIC sdr0:
  ```
  cd ~/openwifi && ./wgd.sh
  (Use "./wgd.sh 1" to enable experimental AMPDU aggregation)
  ```
- Use openwifi as client to connect other AP (Change wpa-connect.conf on board firstly):
  ```
  route del default gw 192.168.10.1
  wpa_supplicant -i sdr0 -c wpa-connect.conf &
  dhclient sdr0
  ```
- Use openwifi in ad-hoc mode: Please check **sdr-ad-hoc-up.sh**, **sdr-ad-hoc-join.sh** and [this app note](./doc/app_notes/ad-hoc-two-sdr.md).
- Use openwifi in monitor mode: Please check **monitor_ch.sh** and [this app note](./doc/app_notes/inject_80211.md).
- The Linux native Wi-Fi tools/Apps (iwconfig/ifconfig/iwlist/iw/hostapd/wpa_supplicant/etc) can run over openwifi NIC in the same way as commercial Wi-Fi chip. 
- **sdrctl** is a dedicated tool to access openwifi driver/FPGA, please check [project document](./doc/README.md) for more information. 

## Update FPGA

Since the pre-built SD card image might not have the latest bug-fixes/updates, it is recommended to always copy the latest files in the [user_space](./user_space) directory on to the board. Then update the FPGA&Driver according to the Quick start of [this app note](doc/app_notes/radar-self-csi.md#quick-start). Following instructions are doing the same thing with extra info for environment setup.

(Check [Driver and FPGA dynamic reloading app note](./doc/app_notes/drv_fpga_dynamic_loading.md) for better understanding of updating FPGA and driver files without rebooting/power-cycle)

- Install Vivado 2021.1. Make sure install Vitis as well. You should have this directory: your_Xilinx_install_directory/Vitis (NOT Vitis_HLS!)
  - If the Vitis is not installed, you can add it by running "Xilinx Design Tools --> Add Design Tools for Devices 2021.1" from Xilinx program group/menu in your OS start menu.
- Setup environment variables (use absolute path):
  ```
  export XILINX_DIR=your_Xilinx_install_directory
  (Example: export XILINX_DIR=/opt/Xilinx. The Xilinx directory should include sth like: Downloads, Vitis, etc.)
  export OPENWIFI_HW_IMG_DIR=your_openwifi-hw-img_directory
  (The directory where you get the open-sdr/openwifi-hw-img repo via git clone)
  export BOARD_NAME=your_board_name
  ```
- Pick the FPGA bitstream from openwifi-hw-img, generate system_top.bit.bin and transfer it on board via ssh channel:
  ```
  cd openwifi/user_space; ./boot_bin_gen.sh $XILINX_DIR $BOARD_NAME $OPENWIFI_HW_IMG_DIR/boards/$BOARD_NAME/sdk/system_top.xsa
  scp ./system_top.bit.bin root@192.168.10.122:openwifi/
  ```
- Now the system_top.bit.bin is onboard in /root/openwifi/ directory. When wgd.sh runs onboard from that directory, it will discover the FPGA img file system_top.bit.bin and load it before loading driver .ko files.

## Update Driver

Since the pre-built SD card image might not have the latest bug-fixes/updates, it is recommended to always copy the latest files in the [user_space](./user_space) directory on to the board. Then update the FPGA&Driver according to the Quick start of [this app note](doc/app_notes/radar-self-csi.md#quick-start). Following instructions are doing the same thing with extra info for environment setup.

(Check [Driver and FPGA dynamic reloading app note](./doc/app_notes/drv_fpga_dynamic_loading.md) for better understanding of updating FPGA and driver files without rebooting/power-cycle)

- Prepare Analog Devices Linux kernel source code (only need to run once):
  ```
  sudo apt install flex bison libssl-dev device-tree-compiler u-boot-tools -y
  cd openwifi/user_space; ./prepare_kernel.sh $XILINX_DIR ARCH_BIT
  (For Zynq 7000, ARCH_BIT should be 32, for Zynq MPSoC, ARCH_BIT should be 64)
  ```
- Compile the latest openwifi driver
  ```
  cd openwifi/driver; ./make_all.sh $XILINX_DIR ARCH_BIT
  (For Zynq 7000, ARCH_BIT should be 32, for Zynq MPSoC, ARCH_BIT should be 64)
  (More arguments (max 5) beyond above two will be converted to "#define argument" in pre_def.h for conditional compiling)
  ```
- Copy the driver files to the board via ssh channel
  ```
  cd openwifi/driver; scp `find ./ -name \*.ko` root@192.168.10.122:openwifi/
  ```
  Now you can use **wgd.sh** on board to load the new openwifi driver. **wgd.sh** also tries to reload FPGA img if system_top.bit.bin presents in the same directory. 
  Find more information in [Driver and FPGA dynamic reloading app note](./doc/app_notes/drv_fpga_dynamic_loading.md).
  
  **Note**: If you have symbol or version error while loadng the driver, it could be because the kernel in the SD card image is too old. In this case, you need put the linux kernel image generated by prepare_kernel.sh (check [[Update Driver](#Update-Driver)]) to the BOOT partition of SD card. The kernel image file name: adi-linux/arch/arm/boot/uImage (32bit); adi-linux-64/arch/arm64/boot/Image (64bit).

## Update sdrctl
- Copy the sdrctl source files to the board via ssh channel
  ```
  cd openwifi/user_space/sdrctl_src; scp `find ./ -name \*` root@192.168.10.122:openwifi/sdrctl_src/
  ```
- Compile the sdrctl **on board**:
  ```
  cd ~/openwifi/sdrctl_src/ && make clean && make && cp sdrctl ../ && cd ..
  ```
## Update Misc Helpers

- Check [Driver and FPGA dynamic reloading app note](./doc/app_notes/drv_fpga_dynamic_loading.md) for more convenient way of updating FPGA and driver files without rebooting/power-cycle.
- Update new kernel, modules and devicetree to the board
  - Prepare in the host PC (run scripts in the user_space directory)
    - `prepare_kernel.sh`
    - `boot_bin_gen.sh`
    - `transfer_kernel_image_module_to_board.sh`
  - Run on board (in the /root/ directory)
    - `populate_kernel_image_module_reboot.sh`
    
      If kernel version is changed, you should run this script again after rebooting. Because the first time run it with old kernel will not setup correct liked directory name for the new kernel version.
  - Suggest also update the Linux rootfs (https://wiki.analog.com/resources/tools-software/linux-software/kuiper-linux/update)
    - `git clone https://github.com/analogdevicesinc/linux_image_ADI-scripts.git` on board
    - `apt update`
    - `adi_update_tools.sh`
- Update new drivers .ko files to the board
  - Prepare in the host PC
    - `make_all.sh` (in the driver directory)
    - `transfer_driver_userspace_to_board.sh`
  - Run on board (in the /root/ directory)
    - `populate_driver_userspace.sh`
- FPGA and driver on board update scripts
  - Setup [ftp server](https://ubuntu.com/server/docs/service-ftp) on PC, allow anonymous and change ftp root directory to the openwifi directory.
  - On board:
  ```
  ./sdcard_boot_update.sh $BOARD_NAME
  (Above command downloads uImage, BOOT.BIN and devicetree.dtb, then copy them into boot partition. Remember to power cycle)
  ./wgd.sh remote
  (Above command downloads driver files, and brings up sdr0)
  ```
- Access the board disk/rootfs like a disk: 
   - On PC: "File manager --> Connect to Server...", input: sftp://root@192.168.10.122/root
   - Input password "openwifi"

## Build openwifi Linux image from scratch
- For the ADI Kuiper image, please check [kuiper.md](./doc/img_build_instruction/kuiper.md)

## Special note for 11b

Openwifi only applies OFDM as its modulation scheme and as a result, it is not backward compatible with 802.11b clients or modes of operation. This is usually the case during beacon transmission, connection establishment, and robust communication.

As a solution to this problem, openwifi can be fully controlled only if communicating with APs/clients instantiated using hostapd/wpa_supplicant userspace programs respectively.

For hostapd program, 802.11b rates can be suppressed using configuration commands (i.e. supported_rates, basic_rates) and an example configuration file is provided (i.e. hostapd-openwifi.conf). One small caveat to this one comes from fullMAC Wi-Fi cards as they must implement the *NL80211_TXRATE_LEGACY* NetLink handler at the device driver level.

On the other hand, the wpa_supplicant program on the client side (commercial Wi-Fi dongle/board) cannot suppress 802.11b rates out of the box in 2.4GHz band, so there will be an issue when connecting openwifi (OFDM only). A patched wpa_supplicant should be used at the client side.
```
sudo apt-get install libssl1.0-dev
cd openwifi/user_space; ./build_wpa_supplicant_wo11b.sh
```
## Porting guide

This section explains the porting work by showing the differences between openwifi and Analog Devices reference design. openwifi is based on 2021_r1 of [HDL Reference Designs](https://github.com/analogdevicesinc/hdl).
- Open the fmcomms2 + zc706 reference design at hdl/projects/fmcomms2/zc706 (Please read Analog Devices help)
- Open the openwifi design zc706_fmcs2 at openwifi-hw/boards/zc706_fmcs2 (Please read openwifi-hw repository)
- "Open Block Design", you will see the differences between openwifi and the reference design. Both in "diagram" and in "Address Editor".
- The address/interrupts of FPGA blocks hooked to the ARM bus should be put/aligned to the devicetree file openwifi/kernel_boot/boards/zc706_fmcs2/devicetree.dts. Linux will parse the devicetree.dtb when booting to know information of attached device (FPGA blocks in our case).
- We use dtc command to get devicetree.dts converted from devicetree.dtb in [Analog Devices Linux image](https://wiki.analog.com/resources/tools-software/linux-software/zynq_images), then do modification according to what we have added/modified to the reference design.
- Please learn the script in [[Build openwifi Linux img from scratch](#Build-openwifi-Linux-img-from-scratch)] to understand how we generate devicetree.dtb, BOOT.BIN, Linux kernel and put them together to build the full SD card image.

## License

This project is available as open source under the terms of the AGPL 3.0 Or later. However, some elements are being licensed under GPL 2-0 or later and BSD 3 license . For accurate information, please check individual files.

## Funding

This project received funding through [ORCA project](https://www.orca-project.eu/). ORCA project is funded by the EU's Horizon2020 programme under agreement number 732174.

This project received funding through [NGI Zero Core](https://nlnet.nl/core/), a fund established by [NLnet](https://nlnet.nl/) with financial support from the European Commission's [Next Generation Internet](https://ngi.eu/) program. Learn more at the NLnet project pages: [802.11n feature of openwifi](https://nlnet.nl/project/OpenWifi-80211n/), [openwifi: 802.11a/g/n maturity](https://nlnet.nl/project/OpenWifi-maturity/), [Extensive openwifi support for OpenWRT](https://nlnet.nl/project/OpenWifi-OpenWRT/)



================================================
FILE: doc/README.md
================================================
<!--
Author: Xianjun jiao, Michael Mehari, Wei Liu
SPDX-FileCopyrightText: 2019 UGent
SPDX-License-Identifier: AGPL-3.0-or-later
-->


# Openwifi document
<img src="./openwifi-detail.jpg" width="1100">

Above figure shows software and hardware/FPGA modules that compose the openwifi design. The module name is equal/similar to the source code file name. Driver module source codes are in openwifi/driver/. FPGA module source codes are in openwifi-hw repository. The user space tool sdrctl source code are in openwifi/user_space/sdrctl_src/. [Sysfs](https://man7.org/linux/man-pages/man5/sysfs.5.html) is another channel that is offered to do userspace-driver communication by mapping driver variables to virtual files. Check [this app note](app_notes/driver_stat.md#Sysfs-explanation) for further explanation.

- [Driver and software overall principle](#Driver-and-software-overall-principle)
- [sdrctl command](#sdrctl-command)
- [Rx packet flow and filtering config](#Rx-packet-flow-and-filtering-config)
- [Tx packet flow and config](#Tx-packet-flow-and-config)
- [Understand the timestamp of WiFi packet](#Understand-the-timestamp-of-WiFi-packet)
- [Regulation and channel config](#Regulation-and-channel-config)
- [Analog and digital frequency design](#Analog-and-digital-frequency-design)
- [Debug methods](#Debug-methods)
- [Test mode driver](#Test-mode-driver)
- [Application notes](app_notes/README.md)

## Driver and software overall principle

[Linux mac80211 subsystem](https://www.kernel.org/doc/html/v4.16/driver-api/80211/mac80211.html), as a part of [Linux wireless](https://wireless.wiki.kernel.org/en/developers/documentation/mac80211), defines a set of APIs ([ieee80211_ops](https://www.kernel.org/doc/html/v4.9/80211/mac80211.html#c.ieee80211_ops)) to rule the Wi-Fi chip driver behavior. SoftMAC Wi-Fi chip driver implements (subset of) those APIs. That is why Linux can support so many Wi-Fi chips of different chip vendors. Different mode (AP/Client/ad-hoc/mesh) might need different set of APIs

openwifi driver (sdr.c) implements following APIs of ieee80211_ops:
-	**tx**. It is called when upper layer has a packet to send
-	**start**. It is called when NIC up. (ifconfig sdr0 up)
-	**stop**. It is called when NIC down. (ifconfig sdr0 down)
-	**add_interface**. It is called when NIC is created
-	**remove_interface**. It is called when NIC is deleted
-	**config**. It is called when upper layer wants to change channel/frequency (like the scan operation)
-	**set_antenna**. Set/select the tx/rx antenna
-	**get_antenna**. Read the current tx/rx antenna idx/combination
-	**bss_info_changed**. It is called when upper layer believe some BSS parameters need to be changed (BSSID, TX power, beacon interval, etc)
-	**conf_tx**. It is called when upper layer needs to config/change some tx parameters (AIFS, CW_MIN, CW_MAX, TXOP, etc)
-	**prepare_multicast**. It is called when upper layer needs to prepare multicast, currently only a empty function hook is present.
-	**configure_filter**. It is called when upper layer wants to config/change the [frame filtering](#Rx-packet-flow-and-filtering-config) rule in FPGA.
-	**rfkill_poll**. It is called when upper layer wants to know the RF status (ON/OFF).
-	**get_tsf**. It is called when upper layer wants to get 64bit FPGA timer value (TSF - Timing synchronization function) 
-	**set_tsf**. It is called when upper layer wants to set 64bit FPGA timer value
-	**reset_tsf**. It is called when upper layer wants to reset 64bit FPGA timer value
-	**set_rts_threshold**. It is called when upper layer wants to change the threshold (packet length) for turning on RTS mechanism
-	**ampdu_action**. AMPDU (Aggregated Mac PDU) related operations
-	**testmode_cmd**. It is called when upper layer has test command for us. [sdrctl command](#sdrctl-command) message is handled by this function.

Above APIs are called by upper layer (Linux mac80211 subsystem). When they are called, the driver (sdr.c) will do necessary job via openwifi FPGA implementation. If necessary, the driver will call other component drivers, like tx_intf_api/rx_intf_api/openofdm_tx_api/openofdm_rx_api/xpu_api, for help.

After receiving a packet from the air, FPGA will raise interrupt (if the frame filtering rule allows) to Linux, then the function openwifi_rx_interrupt() of openwifi driver (sdr.c) will be triggered. In that function, ieee80211_rx_irqsafe() API is used to give the packet and related information (timestamp, rssi, etc) to upper layer.

The packet sending is initiated by upper layer towards openwifi driver. After the packet is sent by the driver over FPGA to the air, the upper layer will expect a sending report from the driver. Each time FPGA sends a packet, an interrupt will be raised to Linux and trigger openwifi_tx_interrupt(). This function will report the sending result (failed? succeeded? number of retransmissions, etc.) to upper layer via ieee80211_tx_status_irqsafe() API.

## sdrctl command

Besides the Linux native Wi-Fi control programs, such as ifconfig/iw/iwconfig/iwlist/wpa_supplicant/hostapd/etc, openwifi offers a user space tool sdrctl to access openwifi specific functionalities, such as time sharing of the interface between two network slices, arbitrary Tx/Rx frequency, Tx attenuation, etc. you may find more details of the slicing mechanism [here](https://doc.ilabt.imec.be/ilabt/wilab/tutorials/openwifi.html#sdr-tx-time-slicing).

sdrctl is implemented as nl80211 testmode command and communicates with openwifi driver (function openwifi_testmode_cmd() in sdrctl_intf.c) via Linux nl80211--cfg80211--mac80211 path 

### Get and set a parameter
```
sdrctl dev sdr0 get para_name
sdrctl dev sdr0 set para_name value 
```
para_name|meaning|comment
---------|-------|----
slice_idx|the slice that will be set/get|0 to 3. After finishing all slice config, **set slice_idx to 4** to synchronize all slices. Otherwise the start/end of different slices have different actual time
addr|target MAC address of tx slice_idx|32bit. for address 6c:fd:b9:4c:b1:c1, you set b94cb1c1
slice_total|tx slice_idx cycle length in us|for length 50ms, you set 49999
slice_start|tx slice_idx cycle start time in us|for start at 10ms, you set 10000
slice_end|  tx slice_idx cycle end   time in us|for end   at 40ms, you set 39999
tsf| sets TSF value| it requires two values "high_TSF low_TSF". Decimal

### Get and set a register of a module
```
sdrctl dev sdr0 get reg module_name reg_idx
sdrctl dev sdr0 set reg module_name reg_idx reg_value 
```
module_name **drv_rx**/**drv_tx**/**drv_xpu**/**rf** refers to the corresponding driver functionality. Related registers are defined in sdr.h. Search drv_rx_reg_val/drv_tx_reg_val/drv_xpu_reg_val/rf_reg_val to see their functionalities.

module_name **rx_intf**/**tx_intf**/**rx**/**tx**/**xpu** FPGA modules (rx_intf/tx_intf/openofdm_rx/openofdm_tx/xpu). Related register addresses are defined in hw_def.h and mapped to slv_regX in .v file (X is the register index). Check rx_intf/tx_intf/openofdm_rx/openofdm_tx/xpu.c and .v files to see their functionalities.

module name **rf** refers to RF (ad9xxx front-end). The agent register rf_reg_val is defined in sdr.h.

Please be aware that some registers are set by driver in real-time (instructed by Linux mac80211), so be careful when set them manually.

module_name: **drv_rx** (for full list, search drv_rx_reg_val in sdr.c)

reg_idx|meaning|comment
-------|-------|----
0|receiver action threshold|receiver will not react (short preamble search and further) if the signal strength is less than this threshold. N means -NdBm
4|rx antenna selection|0:rx1, 1:rx2
7|dmesg print control|please check Debug methods section in this page

(In the **comment** column, you may get a list of **decimalvalue(0xhexvalue):explanation** for a register, only use the **decimalvalue** in the sdrctl command)

module_name: **drv_tx** (for full list, search drv_tx_reg_val in sdr.c)

reg_idx|meaning|comment
-------|-------|----
0|override Linux rate control of non-ht TX unicast data packet|0:auto by Linux, 4:6M, 5:9M, 6:12M, 7:18M, 8:24M, 9:36M, 10:48M, 11:54M
1|override Linux rate control of ht TX unicast data packet|0:auto by Linux, 4:6.5M, 5:13M, 6:19.5M,7:26M, 8:39M, 9:52M, 10:58.5M, 11:65M (add 16 to these values for short GI rate)
2|override Linux rate control of vht (11ac)|not implemented yet
3|override Linux rate control of he (11ax)|not implemented yet
4|tx antenna selection|0:tx1, 1:tx2
7|dmesg print control|please check Debug methods section in this page

module_name: **drv_xpu** (for full list, search drv_xpu_reg_val in sdr.c)

reg_idx|meaning|comment
-------|-------|----
0|LBT/CCA threshold|0: automatic threshold by ad9361_rf_set_channel(). others -- N means -NdBm fixed threshold
7|git revision when build the driver|return the git revision in hex format

module_name: **rf**

reg_idx|meaning|comment
-------|-------|----
0|TX attenuation in dB\*1000|example: set to 3000 for 3dB attenuation
1|TX frequency in MHz|example: set to 5000 for 5GHz -- override Linux channenl tuning/control
5|RX frequency in MHz|example: set to 4000 for 4GHz -- override Linux channenl tuning/control

module_name: **rx_intf** (for full list, check rx_intf.c and **slv_reg** in rx_intf.v)

reg_idx|meaning|comment
-------|-------|----
0|reset|each bit is connected to rx_intf.v internal sub-module. 1 -- reset; 0 -- normal
1|trigger for ILA debug|bit4 and bit0. Please check slv_reg1 in rx_intf.v
2|enable/disable rx interrupt|256(0x100):disable, 0:enable
3|get loopback I/Q from tx_intf|256(0x100):from tx_intf, 0:from ad9361 ADC
4|baseband clock and IQ fifo in/out control|no use anymore -- for old bb rf independent mode
5|control/config dma to cpu|check rx_intf.v slv_reg5
6|abnormal packet length threshold|bit31-16 to store the threshold. if the packet length is not in the range of 14 to threshold, terminate the dma to cpu
7|source selection of rx dma to cpu|check rx_intf.v slv_reg7
8|reserved|reserved
9|number of dma symbol to cpu|only valid in manual mode (slv_reg5[5]==1). normally the dma is set automatically by the received packet length
10|rx adc fifo reading control|check rx_intf.v slv_reg10
11|rx digital I/Q gain|number of bit shift to left. default 4 in rx_intf.c: rx_intf_api->RX_INTF_REG_BB_GAIN_write(4)
12|timeout/reset control of dma to cpu|check rx_intf.v slv_reg12
13|delay from RX DMA complete to RX packet interrupt to cpu|unit 0.1us
16|rx antenna selection|0:ant0, 1:ant1. default 0

module_name: **tx_intf** (for full list, check tx_intf.c and **slv_reg** in tx_intf.v)

reg_idx|meaning|comment
-------|-------|----
0|reset|each bit is connected to tx_intf.v internal sub-module. 1 -- reset; 0 -- normal
1|DUC config or tx arbitrary IQ write port|DUC is removed already. Now it is used to write arbitrary IQ to tx_intf for test purpose
2|phy tx auto start config|check tx_intf.v slv_reg2
4|CTS to Self config|auto set by cts_reg in openwifi_tx of sdr.c. bit31: enable/disable, bit30: rate selection: 1: use traffic rate, 0: manual rate in bit7-4, bit23-8: duration field
5|csi fuzzer config|check CSI fuzzer app note
6|CTS to Self sending delay (for SIFS)|unit 0.1us. bit13-0 for 2.4GHz, bit29-16 for 5GHz
7|tx arbitrary IQ config|check tx_intf.v slv_reg7
8|tx config per packet|automatically set per packet in openwifi_tx() via tx_intf_api->TX_INTF_REG_TX_CONFIG_write(tx_config)
9|reserved|reserved
10|dac input and dma control|check tx_intf.v slv_reg10
11|threshold for FPGA fifo almost full|driver(sdr.c) read 1bit flag in slv_reg21 (4bit in total for 4 queue) to know the FPGA fifo/queue is almost full.
12|threshold to pause openofdm_tx|unit: number of sample. back pressure flow control for I/Q generation speed of openofdm_tx
13|tx I/Q digital gain before dac|find the optimal value (and test record) in tx_intf.c: tx_intf_api->TX_INTF_REG_BB_GAIN_write
14|tx interrupt config|196612(0x30004):disable, 4:enable. check tx_intv.v slv_reg14
15|ampdu action config|set automatically in driver (sdr.c) by openwifi_ampdu_action()
16|tx antenna selection and cdd control|bit1: 0 or 1 to select ant0 or 1. bit4: 1 to enable simple cdd (two antennas have 1 sample tx delay)
17|phy config per packet|aggregation/rate/GI/ht/non-ht/etc. automatically set by driver tx_intf_api->TX_INTF_REG_PHY_HDR_CONFIG_write(phy_hdr_config)
21|queue almost full flag|4bit for 4 queue. criteria is the threshold in slv_reg11. check by tx_intf_api->TX_INTF_REG_S_AXIS_FIFO_NO_ROOM_read() in sdr.c
22|tx status0 per pkt sent|cw,num_slot_random,linux_prio,tx_queue_idx,bd_wr_idx,num_retrans -- per pkt info read by tx interrupt after the pkt sent
23|tx status1 per pkt sent|blk_ack_resp_ssn, pkt_cnt -- per pkt info read by tx interrupt after the pkt sent
24|tx status2 per pkt sent|blk_ack_bitmap_low -- per pkt info read by tx interrupt after the pkt sent
25|tx status3 per pkt sent|blk_ack_bitmap_high -- per pkt info read by tx interrupt after the pkt sent
26|FPGA tx queue runtime length|bit6-0: queue0; bit14-8: queue1; bit22-16: queue2; bit30-24: queue3

module_name: **rx** (for full list, check openofdm_rx.c and **slv_reg** in openofdm_rx.v)

reg_idx|meaning|comment
-------|-------|----
0|reset|each bit is connected to openofdm_rx.v internal sub-module. 1 -- reset; 0 -- normal
1|misc settings|bit0: 1--force smoothing; 0--auto by ht header. bit4: 1--disable all smoothing; 0--let bit0 decide. bit8: 0--high sensitivity sync short; 1--less fake sync short. bit12: 0--watchdog runs regardless power trigger; 1--runs only when power trigger. bit13: 0--watchdog runs regardless state; 1--runs only when state <= S_DECODE_SIGNAL. bit16: 0--enable watchdog eq monitor; 1--disable eq monitor
2|power trigger and dc detection threshold|bit10-0: signal level below this threshold won't trigger demodulation. the unit is rssi_half_db, check rssi_half_db_to_rssi_dbm()/rssi_dbm_to_rssi_half_db() in sdr.c to see the relation to rssi dBm. bit23-16: threshold to prevent dc (or low frequency interference) triggered demodulation
3|minimum plateau used for short preamble detection|initialized by openofdm_rx.c: openofdm_rx_api->OPENOFDM_RX_REG_MIN_PLATEAU_write
4|soft decoding flag and abnormal packet length threshold|bit0 for soft decoding: 0--hard; 1--soft. bit31-16: if the packet length is longer this threshold, terminate demodulation. bit15-12: minimum packet length threshold to terminate demodulation
5|fft_win_shift and small eq monitor threshold|bit3-0: fft window shift (default 4). bit9-4: threshold of how many very small eq out is counted to decide whether reset receiver
17|selector for watchdog event counter|0--phase_offset(sync_short) too big. 1--too many eq out small values. 2--dc is detected (threshold slv_reg2[23:16]). 3--packet too short. 4--packet too long.
18|sync_short phase_offset (frequency offset) threshold|watchdog will reset receiver if phase_offset is above the threshold
19|sync_short phase_offset override|bit31: 1--enable override; 0--disable. bit15-0: value to be set (SIGNED value!)
20|history of PHY rx state|read only. If the last digit readback is always 3, it means the Viterbi decoder stops working
21|read back Fc_in_MHz and sync_short phase_offset|bit31-16: Fc_in_MHz. bit15-0: phase_offset
30|read back watchdog event counter(selected by reg 17)|write to this register, the event counter (selected by reg 17) will be cleared
31|git revision when build the receiver|returned register value means git revision in hex format

module_name: **tx** (for full list, check openofdm_tx.c and **slv_reg** in openofdm_tx.v)

reg_idx|meaning|comment
-------|-------|----
0|reset|each bit is connected to openofdm_tx.v internal sub-module. 1 -- reset; 0 -- normal
1|pilot scrambler initial state|lowest 7 bits are used. 127(0x7F) by default in openofdm_tx.c
2|data  scrambler initial state|lowest 7 bits are used. 127(0x7F) by default in openofdm_tx.c
20|reserved|reserved

module_name: **xpu** (for full list, check xpu.c and **slv_reg** in xpu.v)

reg_idx|meaning|comment
-------|-------|----
0|reset|each bit is connected to xpu.v internal sub-module. 1 -- reset; 0 -- normal
1|rx packet and I/Q config when tx|bit0 0: auto control (auto self-rx-IQ-mute when tx), 1:manual control by bit31 (1 self-IQ-mute; 0 unmute). bit2 0: rx packet filtering is configured by Linux, 1: no rx packet filtering, send all to Linux
2|TSF timer low  32bit write|only write this register won't trigger the TSF timer reload. should use together with register for high 31bit
3|TSF timer high 31bit write|falling edge of register MSB will trigger the TSF timer reload, which means write '1' then '0' to bit31 (bit30-0 for TSF)
4|band, channel and ERP short slot setting|for CSMA engine config. set automatically by Linux. manual set could be overrided unless you change sdr.c. Channel means frequency in MHz
5|DIFS and backoff advance (us), abnormal pkt length threshold|advance (us) for tx preparation before the end of DIFS/backoff. bit7-0:DIFS advance, bit15-8: backoff advance. bit31-16: if the packet length is not in the range of 14 to this threshold, terminate pkt filtering procedure
6|multi purpose CSMA settings|bit7-0: forced channel idle (us) after decoding done to avoid false alarm caused by strong "AGC tail" signal. bit31: NAV disable, bit30: DIFS disable, bit29: EIFS disable, bit28: dynamic CW disable (when disable, CW is taken from bit19-16). (value 1 -- forced disable; 0 -- normal/enable)
7|RSSI and ad9361 gpio/gain delay setting (sync with IQ rssi)|bit26-16: offset for rssi report to Linux; bit6-0 delay (number of sample) of ad9361 gpio/gain to sync with IQ sample rssi/amplitude
8|RSSI threshold for CCA (channel idle/busy)|set by ad9361_rf_set_channel automatically. the unit is rssi_half_db, check rssi_half_db_to_rssi_dbm()/rssi_dbm_to_rssi_half_db() in sdr.c to see the relation to rssi dBm
9|some low MAC time setting|bit31 0:auto, 1:manual. When manual, bit6-0: PHY rx delay, bit13-7: SIFS, bit18-14: slot time, bit23-19: ofdm symbol time, bit30-24: preamble+SIG time. unit us. check xpu.v (search slv_reg9)
10|BB RF delay setting|unit 0.1us. bit7-0: BB RF delay, bit14-8: RF end extended time on top of the delay. bit22-16: delay between bb tx start to RF tx on (lo or port control via spi). bit30-24: delay between bb tx end to RF tx off. check xpu.v (search slv_reg10)
11|ACK control and max num retransmission|bit4: 0:normal ACK tx/reply, 1:disable auto ACK tx/reply in FPGA. bit5: 0:normal ACK rx from peer, 1:not expecting ACK rx from peer. bit3-0: if bit3==0, the number of retransmission is decided by Linux. if bit3==1, the max num retransmission is taken from bit2-0
12|AMPDU control|bit0: indicate low MAC start to receive AMPDU. bit4-1: tid. bit31: tid enable (by default, tid is not enabled and we decode AMPDU of all tid)
13|spi controller config|1: disable spi control and Tx RF is always on; 0: enable spi control and Tx RF only on (lo/port) when pkt sending
16|setting when wait for ACK in 2.4GHz|unit 0.1us. bit14-0: OFDM decoding timeout (after detect PHY header), bit30-16: timeout for PHY header detection, bit31: 0: FCS valid is not needed for ACK packet, 1: FCS valid is needed for ACK packet
17|setting when wait for ACK in 5GHz|unit 0.1us. bit14-0: OFDM decoding timeout (after detect PHY header), bit30-16: timeout for PHY header detection, bit31: 0: FCS valid is not needed for ACK packet, 1: FCS valid is needed for ACK packet
18|setting for sending ACK|unit 0.1us. bit14-0: ACK sending delay in 2.4GHz, bit30-16: ACK sending delay in 5GHz
19|CW min and max setting for 4 FPGA queues|bit3-0: CW min for queue 0, bit7-4: CW max for queue 0, bit11-8: CW min for queue 1, bit15-12: CW max for queue 1, bit19-16: CW min for queue 2, bit23-20: CW max for queue 2, bit27-24: CW min for queue 3, bit31-28: CW max for queue 3. automatically decided by Linux via openwifi_conf_tx of sdr.c
20|slice/queue-tx-gate total cycle length|bit21-20: queue selection. bit19-0: total cycle length in us
21|slice/queue-tx-gate start time in the cycle|bit21-20: queue selection. bit19-0: start time in us
22|slice/queue-tx-gate end time in the cycle|bit21-20: queue selection. bit19-0: end time in us
26|CTS to RTS setting|bit15-0: extra duration, bit20-16: rate/MCS, bit31: 0:enable CTStoRTS 1:disable CTStoRTS
27|FPGA packet filter config|bit13-0 passing/filter config. bit24-16 dropping config. check openwifi_configure_filter in sdr.c. also [mac80211 frame filtering](https://www.kernel.org/doc/html/v4.9/80211/mac80211.html#frame-filtering)
28|BSSID address low  32bit for BSSID filtering|auto set by xpu_api->XPU_REG_BSSID_FILTER_LOW_write in openwifi_bss_info_changed of sdr.c
29|BSSID address high 16bit for BSSID filtering|auto set by xpu_api->XPU_REG_BSSID_FILTER_HIGH_write in openwifi_bss_info_changed of sdr.c
30|MAC address low  32bit|auto set by XPU_REG_MAC_ADDR_write in sdr.c
31|MAC address high 16bit|auto set by XPU_REG_MAC_ADDR_write in sdr.c
57|rssi_half_db read back together with channel idle and other CSMA states|Check slv_reg57 in xpu.v. Use rssi_openwifi_show.sh and rssi_ad9361_show.sh together for RSSI checking.
58|TSF runtime value low  32bit|read only
59|TSF runtime value high 32bit|read only
62|addr2 of rx packet read back|bit31-0 are from bit47-16 of addr2 field in the received packet
63|git revision when build the FPGA|returned register value means git revision in hex format

## Rx packet flow and filtering config

After FPGA receives a packet, no matter the FCS/CRC is correct or not it will raise interrupt to Linux if the frame filtering rule allows (See also [mac80211 frame filtering](https://www.kernel.org/doc/html/v4.9/80211/mac80211.html#frame-filtering)). openwifi_rx_interrupt() function in sdr.c serves the interrupt and gives the necessary information to upper layer (Linux mac80211 subsystem) via ieee80211_rx_irqsafe.

- frame filtering

The FPGA frame filtering configuration is done by function openwifi_configure_filter() in sdr.c. The filter_flag together with **HIGH_PRIORITY_DISCARD_FLAG** finally go to pkt_filter_ctl.v of xpu module in FPGA, and control how FPGA does frame filtering. Openwifi has the capability to capture all received packets even if the CRC is wrong. You just need to set the NIC to monitor mode by iwconfig command (check monitor_ch.sh in user_space directory). In monitor mode, all received packets (including control packet, like ACK) will be given to Linux mac80211. 

- main rx interrupt operations in openwifi_rx_interrupt()
  - get raw content from DMA buffer. When Linux receives interrupt from FPGA rx_intf module, the content has been ready in Linux DMA buffer
  - parse extra information inserted by FPGA in the DMA buffer
    - TSF timer value
    - raw RSSI value that will be converted to actual RSSI in dBm by different correction in different bands/channels
    - packet length and MCS
    - FCS is valid or not
  - send packet pointer (skb) and necessary extra information to upper layer via ieee80211_rx_irqsafe()

## Tx packet flow and config

Linux mac80211 subsystem calls openwifi_tx() to initiate a packet sending. 

- main operations in openwifi_tx()
  - get necessary information from the packet header (struct ieee80211_hdr) for future FPGA configuration
    - packet length and MCS
    - unicast or broadcast? does it need ACK? how many retransmissions at most are allowed to be tried by FPGA in case ACK is not received in time?
    - which driver-ring/queue (time slice) in FPGA the packet should go?
    - should RTS-CTS be used? (Send RTS and wait for CTS before actually send the data packet)
    - should CTS-to-self be used? (Send CTS-to-self packet before sending the data packet. You can force this on by force_use_cts_protect = true;)
    - should a sequence number be inserted to the packet at the driver/chip level?
  - maintain sequence number (ring->bd_wr_idx) for internal use (cross check between FPGA, openwifi_tx and openwifi_tx_interrupt)
  - config FPGA register according to the above information to help FPGA do correct actions (generate PHY header, etc) according to the packet specific requirement.
  - fire DMA transmission from Linux to one of FPGA tx queues. The packet may not be sent immediately if there are still some packets in FPGA tx queue (FPGA does the queue packet transmission according to channel and low MAC CSMA state)
    
Each time when FPGA sends a packet, an interrupt will be raised to Linux reporting the packet sending result. This interrupt handler is openwifi_tx_interrupt().

- main operations in openwifi_tx_interrupt()
  - get necessary information/status of the packet just sent by FPGA
    - packet length and sequence number to capture abnormal situation (cross checking between FPGA, openwifi_tx and openwifi_tx_interrupt)
    - packet sending result: packet is sent successfully (FPGA receives ACK for this packet) or not. How many retransmissions have been done (in case FPGA doesn't receive ACK in time, FPGA will do retransmission according to CSMA/CA low MAC state)
  - send above information to upper layer (Linux mac80211 subsystem) via ieee80211_tx_status_irqsafe()

## Understand the timestamp of WiFi packet

The TSF timestamp shown in the usual wireshark snapshot is reported by openwifi Linux driver towards Linux mac80211 framework.
![](https://user-images.githubusercontent.com/5212105/270659135-44a048ae-773f-48a7-bf3f-76ffc3ee399a.jpg)

This TSF timestamp is attached to the DMA of the received packet in FPGA by reading the TSF timier (defined by 802.11 standard and implemented in FPGA) value while PHY header is received: [FPGA code snip](https://github.com/open-sdr/openwifi-hw/blob/14b1e840591f470ee945844cd3bb51a95d7da09f/ip/rx_intf/src/rx_intf_pl_to_m_axis.v#L201).

Then openwifi driver report this timestamp value (together with the corresponding packet) to Linux via:
https://github.com/open-sdr/openwifi/blob/0ce2e6b86ade2f6164a373b2e98d075eb7eecd9e/driver/sdr.c#L530

To match the openwifi side channel collected data (CSI, IQ sample, etc.) to the TSF timestamp of the packet, please check: https://github.com/open-sdr/openwifi/discussions/344

## Regulation and channel config

SDR is a powerful tool for research. It is the user's responsibility to align with local spectrum regulation when doing OTA (Over The Air) test, or do the test via cable (conducted test), or in a chamber to avoid any potential interference.

This section explains how openwifi config the frequency/channel range and change it driven by Linux. The frequency overriding method is also offered by openwifi to allow the system working in any frequency in 70MHz-6GHz.

### Frequency range

When openwifi driver is loaded, openwifi_dev_probe() will be executed. Following two lines configure the frequency range:
```
dev->wiphy->regulatory_flags = xxx
wiphy_apply_custom_regulatory(dev->wiphy, &sdr_regd);
```
sdr_regd is the predefined variable in sdr.h. You can search the definition/meaning of its type: struct ieee80211_regdomain. 

### Supported channel

The supported channel list is defined in openwifi_2GHz_channels and openwifi_5GHz_channels in sdr.h. If you change the number of supported channels, make sure you also change the frequency range in sdr_regd accordingly and also array size of the following two fields in the struct openwifi_priv:
```
struct ieee80211_channel channels_2GHz[14];
struct ieee80211_channel channels_5GHz[53];
```
Finally, the supported channel list is transferred to Linux mac80211 when openwifi driver is loaded by following two lines in openwifi_dev_probe():
```
dev->wiphy->bands[NL80211_BAND_2GHZ] = &(priv->band_2GHz);
dev->wiphy->bands[NL80211_BAND_5GHZ] = &(priv->band_5GHz);
```

### Real-time channel setting and restrict the channel

Linux mac80211 (struct ieee80211_ops openwifi_ops in sdr.c) uses the "config" API to configure channel frequency and some other parameters in real-time (such as during scanning or channel setting by iwconfig). It is hooked to openwifi_config() in sdr.c, and supports only frequency setting currently. The real execution of frequency setting falls to ad9361_rf_set_channel() via the "set_chan" field of struct openwifi_rf_ops ad9361_rf_ops in sdr.c. Besides tuning RF front-end (AD9361), the ad9361_rf_set_channel() also handles AD9361 calibration (if the tuning step size >= 100MHz), RSSI compensation for different frequencies and FPGA configurations (SIFS, etc) for different bands.

If you don't want openwifi node to change the channel anymore (even the Linux asks to do so), use the script user_space/set_restrict_freq.sh to limit the frequency.
```
./set_restrict_freq abcd
```
Above will limit the frequency to abcdMHz. For instance, after you setup the working system in channel 44 and you don't want the node to tune to other channel (occasionally driven by Linux scanning for example), input 5220 as argument to the script.
```
./set_restrict_freq 0
```
Above will remove the limitation. Linux driven channel tuning will be recovered.

### Let openwifi work at arbitrary frequency

Before setting a non-standard frequency to the system, a normal working system should be setup in normal/legal WiFi frequency, which should be as close as possible to the target non-standard frequency. Then use **set_restrict_freq.sh** (see above) to force upper layer to stay at that normal WiFi frequency (no scanning anymore). After this, you can set actual RF frequency to any frequency in 70MHz-6GHz (without notifying upper layer).
```
./sdrctl dev sdr0 set reg rf 1 3500 
```
Above will set the Tx frequency to 3.5GHz.

```
./sdrctl dev sdr0 set reg rf 5 3500 
```
Above will set the Rx frequency to 3.5GHz.

## Analog and digital frequency design

Openwifi has adopted a new RF/baseband frequency and sampling design instead of the original "offset tuning" to achieve better EVM, spectrum mask conformance, sensitivity and RSSI measurement accuracy. The AD9361 is set to FDD working mode with the same Tx and Rx frequency. Realtime AD9361 Tx chain control is done via FPGA SPI interface (openwifi-hw/ip/xpu/src/spi.v) to achieve self-interference free (when Rx) and fast Tx/Rx turn around time (0.6us). The AD9361 Tx lo (local oscillator) or RF switch is turned on before the Tx packet and turned off after the Tx packet. so that there isn't any Tx lo noise leakage during Rx period. The IQ sampling rate between AD9361 and FPGA is 40Msps. It is converted to 20Msps via decimation/interpolation inside FPGA to WiFi baseband transceiver.

Following figure shows the detailed configuration point in AD9361, driver (.c file) and related FPGA modules (.v file).
![](./rf-digital-if-chain-config.jpg)

The openwifi FPGA baseband clock is driven by AD9361 clock, so there won't be any clock drifting/slight-mismatching between RF and baseband as shown in the following picture.
![](./bb-clk.jpg)

## Debug methods

### dmesg

To debug/see the basic driver behaviour via printk in the sdr.c, you could turn on **dmesg** message printing by 
```
./sdrctl dev sdr0 set reg drv_tx 7 X
./sdrctl dev sdr0 set reg drv_rx 7 X

The bit in value X controls what type of information will be printed to the dmesg (0--no print; 1--print).
bit0: error   message
bit1: regular message for unicast packet (openwifi_tx/openwifi_tx_interrupt/openwifi_rx_interrupt)
bit2: regular message for broadcast packet
bit3: regular queue stop/wake-up message due to too much traffic

For example, regular message for unicast packet and error message
./sdrctl dev sdr0 set reg drv_tx 7 3
./sdrctl dev sdr0 set reg drv_rx 7 3

For example, error message only:
./sdrctl dev sdr0 set reg drv_tx 7 1
./sdrctl dev sdr0 set reg drv_rx 7 1
```
and use **dmesg** command in Linux to see those messages. Regular printing includes tx/rx packet information when a packet is sent or received. Error printing has WARNING information if something abnormal happens. You can search "printk" in sdr.c to see all the printing points.

### tx printing example
```
sdr,sdr openwifi_tx: 70B RC0 10M FC0040 DI0000 ADDRffffffffffff/6655443322aa/ffffffffffff flag4001201e QoS00 SC20_1 retr1 ack0 prio0 q0 wr19 rd18
```
- printing from sdr driver, openwifi_tx function
- 70B: packet size (length field in SIGNAL)
- RC0: rate of the packet. enum mac80211_rate_control_flags in Linux kernel mac80211.h
- 10M: rate 1Mbps. This 802.11b rate will be converted to 6Mbps, because openwifi supports only OFDM rate.
- FC0040: Frame Control field. Example: FC0208 means type data, subtype data, to DS 0, from DS 1 (a packet from AP to client)
- DI0000: Duration/ID field
- ADDR: address fields addr1/2/3. Target MAC address ffffffffffff (broadcast), source MAC address 6655443322aa (openwifi)
- flag4001201e: flags field from Linux mac80211 struct ieee80211_tx_info (first fragment? need ACK? need sequence number insertion? etc.)
- QoS00: QoS control byte related to the packet (from Linux mac80211)
- SC20_1: sequence number 20 is set to the header of the packet. 1 means that it is set by driver (under request of Linux mac80211)
- retr1: retr1 means no retransmission is needed. retr6 means the maximum number of transmissions for this packet is 6 (set by Linux mac80211)
- ack0: ack0 means the packet doesn't need ACK; ack1 means the packet needs ACK. (set by Linux mac80211)
- prio0: priority queue 0 for this packet (0:VO voice, 1:VI video, 2:BE best effort and 3:BK background). check prio in openwifi_tx() of sdr.c (set by Linux mac80211)
- q0: the packet goes to FPGA queue 0. (You can change the mapping between Linux priority and FPGA queue in sdr.c)
- wr19 rd18: the write/read index of buffer (shared buffer between the active openwifi_tx and background openwifi_tx_interrupt/FPGA)
  
### tx interrupt printing example
```
sdr,sdr openwifi_tx_interrupt: tx_result [nof_retx 1 pass 1] SC20 prio0 q0 wr20 rd19 num_slot0 cw0 hwq len00000000 no_room_flag0
```
- printing from sdr driver, openwifi_tx_interrupt function
- tx_result [nof_retx 1 pass 1]: nof_retx 1 means the total number of transmission is 1. pass 1 indicates ACK is received. (0 means not)
- SC20: sequence number 20
- prio, q, wr, rd: these fields can be interpreted the same way as the print in openwifi_tx function
- num_slot: tells how many slots the CSMA/CA state machine waited until the packet is sent in the last tx attempt
- cw: the exponent of the Contention Window for this packet. 6 means the CW size 64. If the contention phase is never entered, CW is 0
- hwq len: the current FPGA queue length (number of pkt left in the queue).8bit per queue. see tx_intf register 26 in the register table section.
- no_room_flag: the DMA room of FPGA queue is almost run out. 1bit per queue. see tx_intf register 21 in the register table section.

### rx printing example
```
sdr,sdr openwifi_rx: 270B ht0aggr0/0 sgi0 240M FC0080 DI0000 ADDRffffffffffff/00c88b113f5f/00c88b113f5f SC2133 fcs1 buf_idx10 -78dBm
```
- printing from sdr driver, openwifi_rx_interrupt function
- 270B: packet size (length field in SIGNAL)
- ht0: ht0 means 11a/g (legacy); ht1 means 11n (ht)
- aggr0/0: the 1st digit means the packet is from a AMPDU packet (1) or not (0). the 2nd digit means the packet is the last packet of a AMPDU packet (1) or not (0)
- sgi0: 0 means normal GI (Guard Interval); 1 means short GI
- 240M:  rate 24Mbps
- FC0080: Frame Control field. Example: FC0108 means type data, subtype data, to DS 1, from DS 0 (a packet client to openwifi AP)
- DI0000: Duration/ID field
- ADDR: address fields addr1/2/3. Target MAC address ffffffffffff (broadcast), source MAC address 00c88b113f5f
- SC2133: sequence number 2133 from the header of the packet
- fcs1: FCS/CRC is OK. (fcs0 means bad CRC)
- buf_idx10: the rx packet is from DMA buffer with index 10
- -78dBm: signal strength of this received packet (after calibration)

### Native Linux tools

For analysis/debug, many native Linux tools you still could rely on. Such as tcpdump, tshark, etc.

### Debug FPGA

For FPGA itself, FPGA developer could use Xilinx ILA tools to analyze FPGA signals (https://github.com/open-sdr/openwifi-hw/issues/39). Spying on those state machines in xpu/tx_intf/rx_intf would be very helpful for understanding/debugging Wi-Fi low level functionalities.

## Test mode driver

While loading the openwifi driver by "insmod sdr.ko", a test_mode argument can be specified (You can also specify the test_mode value to wgd.sh or fosdem.sh). It will enable some experimental feataures (such as AMPDU aggregation):
```
insmod sdr.ko test_mode=value
```
It is implemented by the global static variable test_mode in sdr.c.

Supported test_mode value definitions:
- bit0: AMPDU/aggregation is ON (1) or OFF (0 -- default OFF)


================================================
FILE: doc/app_notes/40mhz.png.license
================================================
# Author: Xianjun jiao

# SPDX-FileCopyrightText: 2019 UGent
# SPDX-License-Identifier: AGPL-3.0-or-later


================================================
FILE: doc/app_notes/README.md
================================================
<!--
Author: Xianjun jiao
SPDX-FileCopyrightText: 2019 UGent
SPDX-License-Identifier: AGPL-3.0-or-later
-->

Application notes collect many small topics about using openwifi in different scenarios/modes.

- [Use openwifi on the w-iLab.t testbed remotely](https://doc.ilabt.imec.be/ilabt/wilab/tutorials/openwifi.html)
- [Communication between two SDR boards under AP and client mode](ap-client-two-sdr.md)
- [Communication between two SDR boards under ad-hoc mode](ad-hoc-two-sdr.md)
- [From CSI (Channel State Information) to CSI (Chip State Information)](csi.md)
- [WiFi CSI radar via self CSI capturing](radar-self-csi.md)
- [Capture IQ sample, AGC gain, RSSI with many types of trigger condition](iq.md)
- [ACK timing verification by IQ capture](iq_ack_timing.md)
- [Capture dual antenna TX/RX IQ for multi-purpose (capture collision)](iq_2ant.md)
- [WiFi packet, CSI and IQ sample self loopback test (over-the-air and FPGA internal)](packet-iq-self-loopback-test.md)
- [IEEE 802.11n (Wi-Fi 4)](ieee80211n.md)
- [802.11 packet injection and fuzzing](inject_80211.md)
- [CSI fuzzer](csi_fuzzer.md)
- [Access counter/statistics in FPGA](perf_counter.md)
- [Access counter/statistics in driver](driver_stat.md)
- [Frequent/usual trick on controlling Gain/Att/Frequency/CCA/LBT/CSMA/CW/Sensitivity/etc](frequent_trick.md)
- [Driver and FPGA dynamic reloading](drv_fpga_dynamic_loading.md)
- [owfuzz: a WiFi protocol fuzzing tool using openwifi.](https://github.com/alipay/WiFi-Protocol-Fuzzing-Tool) [[**Vulnerabilities**]](https://github.com/alipay/Owfuzz#discovered-vulnerabilities)
- [Build FPGA with High-Level Synthesis modules](hls.md)


================================================
FILE: doc/app_notes/ad-hoc-two-sdr.md
================================================
<!--
Author: Xianjun jiao
SPDX-FileCopyrightText: 2019 UGent
SPDX-License-Identifier: AGPL-3.0-or-later
-->

**NOTE** the terminal session mentioned in the following text can also be setup via USB-UART instead of Ethernet.

**NOTE** adrv9361z7035 has ultra low TX power in 5GHz. Move **CLOSER** when you use that board in 5GHz!!!

- Power on two SDR boards. Call one board "adhoc1" and the other "adhoc2". On each board, the TX and RX antenna should vertical/orthogonal to each other as much as possible to gain a good TX/RX isolation.
- Connect a computer to the adhoc1 via Ethernet cable. The computer should have static IP 192.168.10.1. Open a terminal on the computer, and then in the terminal:
  ```
  ssh root@192.168.10.122
  (password: openwifi)
  service network-manager stop
  cd openwifi
  ./wgd.sh
  (Wait for the script completed)
  ifconfig sdr0 up
  ./sdr-ad-hoc-up.sh sdr0 44 192.168.13.1
  (Above command setup ad-hoc network at channel 44 with static IP assigned to sdr0 NIC)
  iwconfig sdr0
  ```
- You should see output like:
  ```
  sdr0    IEEE 802.11  ESSID:"sdr-ad-hoc"  
          Mode:Ad-Hoc  Frequency:5.22 GHz  Cell: 92:CA:14:27:1E:B0   
          Tx-Power=20 dBm   
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:off
  ```
  If you see "Cell: Not-Associated", please wait and run "iwconfig sdr0" again until a randomly generated Cell ID appears.

- Connect another computer to the adhoc2 via Ethernet cable. The computer should have static IP 192.168.10.1. Open a terminal on the computer, and then in the terminal:
  ```
  ssh root@192.168.10.122
  (password: openwifi)
  service network-manager stop
  cd openwifi
  ./wgd.sh
  ifconfig sdr0 up
  ./sdr-ad-hoc-up.sh sdr0 44 192.168.13.2
  iwconfig sdr0
  ```
- You should see output like:
  ```
  sdr0    IEEE 802.11  ESSID:"sdr-ad-hoc"  
          Mode:Ad-Hoc  Frequency:5.22 GHz  Cell: 92:CA:14:27:1E:B0   
          Tx-Power=20 dBm   
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:off
  ```
  The "Cell: 92:CA:14:27:1E:B0" should be the same as adhoc1, because the later joined node should discover the Cell ID of the existing network and join/get it automatically. If not, please adjust the antenna/distance and re-run the commands.

  Now the communication link should be already setup between the two ad-hoc nodes, and you can ping each other.


================================================
FILE: doc/app_notes/ap-client-two-sdr.md
================================================
<!--
Author: Xianjun jiao
SPDX-FileCopyrightText: 2019 UGent
SPDX-License-Identifier: AGPL-3.0-or-later
-->

**NOTE** the terminal session mentioned in the following text can also be setup via USB-UART instead of Ethernet.

**NOTE** adrv9361z7035 has ultra low TX power in 5GHz. Move **CLOSER** when you use that board in 5GHz!!!

- Power on two SDR boards. Call one board "AP board" and the other "client board". On each board, the TX and RX antenna should vertical/orthogonal to each other as much as possible to gain a good TX/RX isolation.
- Connect a computer to the AP board via Ethernet cable. The computer should have static IP 192.168.10.1. Open a terminal on the computer, and then in the terminal:
  ```
  ssh root@192.168.10.122
  (password: openwifi)
  cd openwifi
  ./fosdem.sh
  (It will create a WiFi AP by hostapd program with config file: hostapd-openwifi.conf)
  (Wait for the script completed)
  cat /proc/interrupts
  (Execute the "cat ..." command for several times)
  (You should see the number of "sdr,tx_itrpt1" grows, because it sends the "openwifi" beacon periodically)
  ```
- Connect another computer to the client board via Ethernet cable. The computer should have static IP 192.168.10.1. Open a terminal on the computer, and then in the terminal:
  ```
  ssh root@192.168.10.122
  (password: openwifi)
  service network-manager stop
  cd openwifi
  ./wgd.sh
  (Wait for the script completed)
  ifconfig sdr0 up
  iwlist sdr0 scan
  (The "openwifi" AP should be listed in the scanning results)
  wpa_supplicant -i sdr0 -c wpa-openwifi.conf
  ("iwconfig sdr0 essid openwifi" could also work. Less info compared to wpa_supplicant)
  ```
  If wpa-openwifi.conf is not on board, please create it with [this content](../../user_space/wpa-openwifi.conf).
- Now the client is trying to associate with the AP. You should see like:
  ```
  root@analog:~/openwifi# wpa_supplicant -i sdr0 -c wpa-openwifi.conf 
  Successfully initialized wpa_supplicant
  sdr0: CTRL-EVENT-SCAN-STARTED 
  sdr0: SME: Trying to authenticate with 66:55:44:33:22:8c (SSID='openwifi' freq=5220 MHz)
  sdr0: Trying to associate with 66:55:44:33:22:8c (SSID='openwifi' freq=5220 MHz)
  sdr0: Associated with 66:55:44:33:22:8c
  sdr0: CTRL-EVENT-CONNECTED - Connection to 66:55:44:33:22:8c completed [id=0 id_str=]
  ```
  The AP board terminal should print like:
  ```
  ...
  sdr0: STA 66:55:44:33:22:4c IEEE 802.11: authenticated
  sdr0: STA 66:55:44:33:22:4c IEEE 802.11: associated (aid 1)
  sdr0: AP-STA-CONNECTED 66:55:44:33:22:4c
  sdr0: STA 66:55:44:33:22:4c RADIUS: starting accounting session 613E16DE-00000000
  ```
  If not, please adjust antenna/distance and re-run the commands on the client side.

- After association is done, in another terminal of client (**DO NOT** terminate wpa_supplicant in the original client terminal!):
  ```
  dhclient sdr0
  (Wait for it completed)
  ifconfig sdr0
  (Now you should see the IP address like 192.168.13.x allocated by AP)
  ping 192.168.13.1
  (Ping the AP)
  ```
  Now the communication link should be already setup between the AP and the client.


================================================
FILE: doc/app_notes/csi-architecture.jpg.license
================================================
# Author: Xianjun jiao

# SPDX-FileCopyrightText: 2019 UGent
# SPDX-License-Identifier: AGPL-3.0-or-later


================================================
FILE: doc/app_notes/csi-information-format.jpg.license
================================================
# Author: Xianjun jiao

# SPDX-FileCopyrightText: 2019 UGent
# SPDX-License-Identifier: AGPL-3.0-or-later


================================================
FILE: doc/app_notes/csi-screen-shot.jpg.license
================================================
# Author: Xianjun jiao

# SPDX-FileCopyrightText: 2019 UGent
# SPDX-License-Identifier: AGPL-3.0-or-later


================================================
FILE: doc/app_notes/csi.md
================================================
<!--
Author: Xianjun jiao
SPDX-FileCopyrightText: 2019 UGent
SPDX-License-Identifier: AGPL-3.0-or-later
-->


We extend the **CSI** (Channel State Information) to **CSI** (Chip State Information)!

(This app note shows general CSI collection. To use self-Tx CSI in full duplex mode as **RADAR**, please refer to [WiFi CSI radar via self CSI capturing](radar-self-csi.md))

## Quick start
- Power on the SDR board.
- Connect a computer to the SDR board via Ethernet cable. The computer should have static IP 192.168.10.1. Open a terminal on the computer, and then in the terminal:
  ```
  ssh root@192.168.10.122
  (password: openwifi)
  cd openwifi
  ./wgd.sh
  (Wait for the script completed)
  ./monitor_ch.sh sdr0 11
  (Monitor on channel 11. You can change 11 to other channel that is busy)
  insmod side_ch.ko
  ./side_ch_ctl g
  ```
  You should see on board outputs like:
  ```
  loop 64 side info count 61
  loop 128 side info count 99
  ...
  ```
  If the second number (61, 99, ...) is not zero and keeps increasing, that means the CSI (Chip State Information) is going to the computer smoothly.
  
- On your computer (NOT in ssh!), run:
  ```
  cd openwifi/user_space/side_ch_ctl_src
  python3 side_info_display.py
  ```
  You might need to install beforehand: "sudo apt install python3-numpy python3-matplotlib python3-tk". Now you should see 3 figures showing run-time **frequency offset**, **channel state/response** and **constellation form equalizer**. Meanwhile the python script prints the **timestamp**.
  ![](./csi-screen-shot.jpg)
  
  While running, all information is also stored into a file **side_info.txt**. A matlab script **test_side_info_file_display.m** is offered to help you do analysis on the Chip State Information offline.

## Understand the CSI feature
  The CSI information is extracted via the openwifi **side channel** infrastructure. This figure explains the related modules (also related source code file name) and how the information goes from the SDR board to the computer.
  ![](./csi-architecture.jpg)

  The CSI information format is shown in this figure.
  ![](./csi-information-format.jpg)

  For each element, the actual size is 64bit.
  - timestamp: 64bit TSF timer value, which is the same timestamp value shown by other sniffer software, like tcpdump, wireshark or openwifi printing in dmesg.
  - freq_offset: Only the 1st 16bit is used.
  - csi (channel state/response) and equalizer: Only the first two 16bit are used for I/Q of channel response and equalizer output. The remaining two 16bit are reserved for future multi-antenna cases.
  
  The python and Matlab scripts are recommended for you to understand the CSI packet format precisely.

## Config the capture condition and interval
  The quick start guide will monitor all CSI information of all packets decoded by the WiFi ofdm receiver. To monitor only specific packets that match the specific conditions: FC (Frame Control), addr1 (target MAC address), addr2 (source MAC address), configuration command should be issued before executing "**side_ch_ctl g**". The configuration command is realized by feeding a different parameter to "**side_ch_ctl**". 
  
  A quick example: Capture only CSI of those packets from the device with MAC address 56:5b:01:ec:e2:8f
  ```
  ./side_ch_ctl wh1h4001
  ./side_ch_ctl wh7h01ece28f
  (01ece28f are the last 32 bits of MAC address 56:5b:01:ec:e2:8f)
  ./side_ch_ctl g
  ```
  The parameter string format is explained in detail:
  ```
  whXhY
  ```
  The X is the register index, and the Y is the value in hex format. The remaining "w", "h" and "h" should be kept untouched.
  - To turn on conditional capture, X should be 1. For Y: bit11~bit0 should be 001(hex), bit12: on/off of FC match, bit13: on/off of addr1 match, bit14 : on/off of addr2 match. Examples:
  ```
  Turn on FC only match:
  ./side_ch_ctl wh1h1001
  (1001 is the value in hex format)
  Turn on addr2 (source address) only match:
  ./side_ch_ctl wh1h4001
  
  Turn on both FC and addr1 (target address) match:
  ./side_ch_ctl wh1h3001
  
  Turn off conditional capture (all packets will be captured):
  ./side_ch_ctl wh1h0001
  ```
  - To specify the condition matching target (when that type of match is turned on by above command):
  ```
  Specify the FC matching target:
  ./side_ch_ctl wh5hY
  (Y is the FC value in hex format)
  Specify the addr1 (target address) matching target:
  ./side_ch_ctl wh6hY
  
  Specify the addr2 (source address) matching target:
  ./side_ch_ctl wh7hY
  (Y is the MAC address in hex format. Only the last 32 bits are needed. Example: for 56:5b:01:ec:e2:8f, 01ece28f should be input.)
  ```  
  The command "**side_ch_ctl g**" will perform CSI capture every 100ms until you press ctrl+C. To use a different capture interval:
  ```
  side_ch_ctl gN
  ```
  The interval will become N*1ms

## Config the num_eq
  The num_eq (number of equalizer output) is configurable in case you don't need so many equalizer information. The valid value is 0~8. You should align the num_eq value at the side_ch.ko, side_info_display.py and test_side_info_file_display.m. 
  - When insert the kernel module, use:
  ```
  insmod side_ch.ko num_eq_init=3
  ```
  You can replace 3 by number 0~8. (8 is the default value. You don't need to specify it like in the Quick start section)
  - When launch the python script, use:
  ```
  side_info_display.py 3
  ```
  - When use the Matlab script, please change the num_eq variable in the script to 3 (3 is just an example).

## Compile the side channel driver and user space program
  - side_ch.ko
  ```
  $OPENWIFI_DIR/driver/side_ch/make_driver.sh $OPENWIFI_DIR $XILINX_DIR ARCH_BIT
(For Zynq 7000, ARCH_BIT should be 32, for Zynq MPSoC, ARCH_BIT should be 64)
  ```
  - side_ch_ctl (take user_space/side_ch_ctl_src/side_ch_ctl.c and compile it on board!)
  ```
  gcc -o side_ch_ctl side_ch_ctl.c
  ```

## Run the CSI together with modes other than monitor
  The openwifi CSI feature could run with not only monitor mode but also other modes, such as AP-Client or ad-hoc mode. After the communication functionality is fully up in those modes, you can start CSI feature from "**insmod side_ch.ko**" and "**./side_ch_ctl g**" on board as described in the previous sections to extract CSI to your computer.

## Map the CSI information to the WiFi packet
  Please check this discussion: https://github.com/open-sdr/openwifi/discussions/344
  
  If you want to relate the CSI information to the WiFi packet, you need to capture WiFi packets (tcpdump/wireshark/etc) while capturing CSI. Then you can match the timestamp (TSF timer value) between WiFi packet and CSI information, because this is the unique same identity of a Wifi packet and related CSI information.
  
  Please learn the python and Matlab script to extract CSI information per packet according to your requirement.


================================================
FILE: doc/app_notes/csi_fuzzer.md
================================================
<!--
Author: Xianjun jiao
SPDX-FileCopyrightText: 2021 UGent
SPDX-License-Identifier: AGPL-3.0-or-later
-->

- [ACM WiSec 2021. Openwifi CSI fuzzer for authorized sensing and covert channels](https://dl.acm.org/doi/pdf/10.1145/3448300.3468255)
- [Privacy Protection in WiFi Sensing via CSI Fuzzing](https://ieeexplore.ieee.org/abstract/document/10818006)

CSI (Channel State Information) of WiFi systems is available in some WiFi chips and can be used for sensing the environment (keystrokes, people, object) passively and secretly.

## Concept

How could a CSI fuzzer stop unauthorized sensing?

![](./csi-fuzzer-system-before-vs-now.png)

CSI fuzzer implementation principle.

![](./csi-fuzzer-principle.png)

## Demo instructions

Thanks to the full-duplex capability and CSI extraction feature of openwifi, you can monitor the artificial channel response via [side channel](./csi.md) by Tx-Rx over the air coupling without affecting the normal operation/traffic of openwifi. Before fuzzing the CSI, please follow [WiFi CSI radar via self CSI capturing](radar-self-csi.md) app note to setup normal self CSI monitoring.

Then, start another ssh session to the openwifi board:
```
ssh root@192.168.10.122
(password: openwifi)

cd openwifi

./csi_fuzzer_scan.sh 1
(CSI fuzzer applies possible artificial CSI by scanning all values)
(csi_fuzzer.sh is called. Please read both scripts to understand these commands)
```

Now you should see that CSI keeps changing like in this [video](https://youtu.be/aOPYwT77Qdw).

# Further explanation on parameters

CSI fuzzer in openwifi system architecture and related commands.

![](./csi-fuzzer-implementation.png)

# Example fuzzed CSI

CSI self-monitoring before fuzzing.

![](./csi-fuzzer-beacon-ant-back-0.jpg)

CSI self-monitoring after  fuzzing command: `./csi_fuzzer.sh 1 45 0 13`

![](./csi-fuzzer-beacon-ant-back-1-45-0-13.jpg)

`csi_fuzzer_scan.sh` can scan the c1 and c2 in different styles/modes by calling `csi_fuzzer.sh`.


================================================
FILE: doc/app_notes/driver_stat.md
================================================
Comprehensive statistics are offered at the driver level via the [Linux sysfs](https://en.wikipedia.org/wiki/Sysfs#:~:text=sysfs%20is%20a%20pseudo%20file,user%20space%20through%20virtual%20files.).

[[Quick start](#Quick-start)]
[[Sysfs explanation](#Sysfs-explanation)]
[[Statistics variable file meaning](#Statistics-variable-file-meaning)]

All operations should be done on board in openwifi directory, not in host PC.

## Quick start

Enable the driver level statistics (after openwifi up and running)
```
./stat_enable.sh
```
Show the statistics
```
./tx_stat_show.sh
./tx_prio_queue_show.sh
./rx_stat_show.sh
./rx_gain_show.sh
```
Clear the stattistics
```
./tx_stat_show.sh clear
./tx_prio_queue_show.sh clear
./rx_stat_show.sh clear
```
Let rx_stat_show.sh calculate PER (Packet Error Rate) by giving the number of packet sent at the peer (30000 packets for example):
```
./rx_stat_show.sh 30000
```
To only show the statistics for the link with a specific peer node
```
./set_rx_target_sender_mac_addr.sh c83caf93
(If the peer node MAC address is 00:80:c8:3c:af:93)
```
To show the statistics of all (not filtered by the peer node MAC address)
```
./set_rx_target_sender_mac_addr.sh 0
```
To show the peer node MAC address for statistics
```
./set_rx_target_sender_mac_addr.sh
```
To see the statistics of ACK packet, run this before above scripts
```
./set_rx_monitor_all.sh
```
Disable the statistics of ACK packet, run this before above scripts
```
./set_rx_monitor_all.sh 0
```
Disable the driver level statistics (after openwifi up and running)
```
./stat_enable.sh 0
```

## Sysfs explanation

For user, as you can check in those scripts above, the sysfs is a set of files that can be operated in the command line for communicating with kernel module. You can find these files on zcu102 board at
```
/sys/devices/platform/fpga-axi@0/fpga-axi@0:sdr
```
On othe boards at
```
/sys/devices/soc0/fpga-axi@0/fpga-axi@0:sdr
```

## Statistics variable file meaning

These statistics names are the same as the file names (in those scripts) and variable names in the sdr.c. Do search these names in sdr.c to understand exact meaning of these statistics.

- tx_stat_show.sh

  name|meaning
  ------------|----------------------
  tx_data_pkt_need_ack_num_total     | number of tx data packet reported in openwifi_tx_interrupt() (both fail and succeed)
  tx_data_pkt_need_ack_num_total_fail| number of tx data packet reported in openwifi_tx_interrupt() (fail -- no ACK received)
  tx_data_pkt_need_ack_num_retx      | number of tx data packet reported in openwifi_tx_interrupt() at different number of retransmission (both fail and succeed)
  tx_data_pkt_need_ack_num_retx_fail | number of tx data packet reported in openwifi_tx_interrupt() at different number of retransmission (fail -- no ACK received)
  tx_data_pkt_mcs_realtime           | MCS (10*Mbps) of tx data packet reported in openwifi_tx_interrupt() (both fail and succeed)
  tx_data_pkt_fail_mcs_realtime      | MCS (10*Mbps) of tx data packet reported in openwifi_tx_interrupt() (fail -- no ACK received)
  tx_mgmt_pkt_need_ack_num_total     | number of tx management packet reported in openwifi_tx_interrupt() (both fail and succeed)
  tx_mgmt_pkt_need_ack_num_total_fail| number of tx management packet reported in openwifi_tx_interrupt() (fail -- no ACK received)
  tx_mgmt_pkt_need_ack_num_retx      | number of tx management packet reported in openwifi_tx_interrupt() at different number of retransmission (both fail and succeed)
  tx_mgmt_pkt_need_ack_num_retx_fail | number of tx management packet reported in openwifi_tx_interrupt() at different number of retransmission (fail -- no ACK received)
  tx_mgmt_pkt_mcs_realtime           | MCS (10*Mbps) of tx management packet reported in openwifi_tx_interrupt() (both fail and succeed)
  tx_mgmt_pkt_fail_mcs_realtime      | MCS (10*Mbps) of tx management packet reported in openwifi_tx_interrupt() (fail -- no ACK received)

- tx_prio_queue_show.sh

  tx_prio_queue_show.sh will show 4 rows. Each row is corresponding one Linux-prio and one FPGA queue. Each row has 12 elements. Elements' name will not be displayed in the command line.

  Element name|meaning
  ------------|----------------------
  tx_prio_num            | number of tx packet from Linux prio N to openwifi_tx()
  tx_prio_interrupt_num  | number of tx packet from Linux prio N recorded in openwifi_tx_interrupt()
  tx_prio_stop0_fake_num | number of Linux prio N stopped attempt in the 1st place of openwfii_tx(), fake alarm
  tx_prio_stop0_real_num | number of Linux prio N stopped attempt in the 1st place of openwfii_tx(), real stop
  tx_prio_stop1_num      | number of Linux prio N stopped in the 2nd place of openwfii_tx()
  tx_prio_wakeup_num     | number of Linux prio N waked up in openwifi_tx_interrupt()
  tx_queue_num           | number of tx packet for FPGA queue N to openwifi_tx()
  tx_queue_interrupt_num | number of tx packet for FPGA queue N recorded in openwifi_tx_interrupt()
  tx_queue_stop0_fake_num| number of FPGA queue N stopped attempt in the 1st place of openwfii_tx(), fake alarm
  tx_queue_stop0_real_num| number of FPGA queue N stopped attempt in the 1st place of openwfii_tx(), real stop
  tx_queue_stop1_num     | number of FPGA queue N stopped in the 2nd place of openwfii_tx()
  tx_queue_wakeup_num    | number of FPGA queue N waked up in openwifi_tx_interrupt()

- rx_stat_show.sh

  name|meaning
  ------------|----------------------
  rx_data_pkt_num_total               | number of rx data packet with both FCS ok and failed
  rx_data_pkt_num_fail                | number of rx data packet with FCS failed
  rx_mgmt_pkt_num_total               | number of rx management packet with both FCS ok and failed
  rx_mgmt_pkt_num_fail                | number of rx management packet with FCS failed
  rx_ack_pkt_num_total                | number of rx ACK packet with both FCS ok and failed
  rx_ack_pkt_num_fail                 | number of rx ACK packet with FCS failed
  rx_data_pkt_mcs_realtime            | MCS (10*Mbps) of rx data packet with both FCS ok and failed
  rx_data_pkt_fail_mcs_realtime       | MCS (10*Mbps) of rx data packet with FCS failed
  rx_mgmt_pkt_mcs_realtime            | MCS (10*Mbps) of rx management packet with both FCS ok and failed
  rx_mgmt_pkt_fail_mcs_realtime       | MCS (10*Mbps) of rx management packet with FCS failed
  rx_ack_pkt_mcs_realtime             | MCS (10*Mbps) of rx ACK packet with both FCS ok and failed
  rx_data_ok_agc_gain_value_realtime  | agc gain value of rx data packet with FCS ok
  rx_data_fail_agc_gain_value_realtime| agc gain value of rx data packet with FCS failed
  rx_mgmt_ok_agc_gain_value_realtime  | agc gain value of rx management packet with FCS ok
  rx_mgmt_fail_agc_gain_value_realtime| agc gain value of rx management packet with FCS failed
  rx_ack_ok_agc_gain_value_realtime   | agc gain value of rx ACK packet with FCS ok

- rx_gain_show.sh

  name|meaning
  ------------|----------------------
  rx_data_ok_agc_gain_value_realtime  | agc gain value of rx data packet with FCS ok
  rx_data_fail_agc_gain_value_realtime| agc gain value of rx data packet with FCS failed
  rx_mgmt_ok_agc_gain_value_realtime  | agc gain value of rx management packet with FCS ok
  rx_mgmt_fail_agc_gain_value_realtime| agc gain value of rx management packet with FCS failed
  rx_ack_ok_agc_gain_value_realtime   | agc gain value of rx ACK packet with FCS ok
  
  Note: gain value here is always 14 dB higher than set_rx_gain_auto.sh/set_rx_gain_manual.sh at 5220MHz. 5dB higher at 2.4GHz.


================================================
FILE: doc/app_notes/drv_fpga_dynamic_loading.md
================================================
The **wgd.sh** (running on board) supports reloading driver and/or FPGA image dynamically without rebooting/power-cycle. It can work in a 
flexible way. 

The purpose of this feature is to help you easily reload driver and FPGA built from your branch/version/variant/modification, and switch/run different driver and FPGA of different branch/version/variant/modification without rebooting. To enjoy this feature, always ensure your onboard openwifi/files are the latest files in [user_space](../../user_space)).

- [[Reload driver only](#Reload-driver-only)]
- [[Reload driver and FPGA](#Reload-driver-and-FPGA)]
- [[Reload driver and FPGA in target directory](#Reload-driver-and-FPGA-in-target-directory)]
- [[Reload driver and FPGA from a single package file](#Reload-driver-and-FPGA-from-a-single-package-file)] -- **RECOMMENDED!**
- [[Suggested practice to generate driver FPGA variants](#Suggested-practice-to-generate-driver-FPGA-variants)]
- [[Detailed full usage info](#Detailed-full-usage-info)]

Note: Make sure you have compiled driver before. Check [Update Driver](../../README.md#update-driver).

## Reload driver only
This is the original way. To let **wgd.sh** only loads the driver without touching FPGA, please ensure FPGA image file **system_top.bit.bin** is **NOT** 
present in the directory. If wgd.sh can not find the FPGA image, it will skip reloading it.

## Reload driver and FPGA
- Generate the reloadable FPGA file **system_top.bit.bin**. In the Linux host computer:
  ```
  cd openwifi/user_space
  ./drv_and_fpga_package_gen.sh $OPENWIFI_HW_IMG_DIR $XILINX_DIR $BOARD_NAME
  ```
  Then **system_top.bit.bin** will be generated in openwifi/user_space.

- Put **system_top.bit.bin** on board in the same directory as wgd.sh and other driver files (.ko)
- Run **wgd.sh** on board as usual

## Reload driver and FPGA in target directory
Put **system_top.bit.bin** on board together with other driver files (.ko) in a directory ($TARGET_DIR), then run on board:
```
./wgd.sh $TARGET_DIR
```
In this way, different versions/variants of driver/FPGA can be put in different directories. Then **wgd.sh** can be used to switch 
between them without rebooting/power-cycle.

## Reload driver and FPGA from a single package file
The openwifi/user_space/**drv_and_fpga_package_gen.sh** also generates a single package file **drv_and_fpga.tar.gz**, which includes driver files (.ko), 
FPGA image and many other source files with rich infos that are related.

You can switch to your own branch/version/variant, build the single package file via **drv_and_fpga_package_gen.sh**, rename it with a more meaningful name (such as add version or variant info as postfix), put the renamed **drv_and_fpga_MEANINGFUL_POSTFIX.tar.gz** on board in the same directory as **wgd.sh**, and let **wgd.sh** load it:
```
./wgd.sh ./drv_and_fpga_MEANINGFUL_POSTFIX.tar.gz
```
In this way, different version/variants of driver/FPGA can be switched by **wgd.sh** without rebooting/power-cycle.

## Suggested practice to generate driver FPGA variants
There are several ways to generate variants of the single driver-FPGA package file. For example:

- Switch/create another branch for openwifi and openwifi-hw, work/modify there, then generate the single package file via **drv_and_fpga_package_gen.sh**. This package is the branch specific, so renaming the package name to a more meaningful one would be good practice.
- In the same branch, set different arguments (finally macro definitions in .h and .v files) via conditional compiling to enable/disable different driver and FPGA code blocks/functionalities, then generate the single package file via **drv_and_fpga_package_gen.sh**. Rename the package to remind you which conditions are ON/OFF.
    - Check "Conditional compile by verilog macro" in openwifi-hw README for FPGA design
    - Input more arguments (max 5) to driver building script "make_all.sh $XILINX_DIR ARCH_BIT". Those arguments will be converted to "#define argument" in pre_def.h for driver conditional compiling. **Attention:** **drv_and_fpga_package_gen.sh** currently only call **make_all.sh** without extra arguments. If you have conditional compiling arguments, do not forget to put them into **drv_and_fpga_package_gen.sh** as extra arguments of **make_all.sh**.

## Detailed full usage info
Run the "./wgd.sh -h" on board or open wgd.sh to see full usage info:
```
usage:
  Script for load (or download+load) different driver and FPGA img without rebooting
  no  argument: Load .ko driver files and FPGA img (if system_top.bit.bin exist) in current dir with test_mode=0.
  1st argument: If it is a NUMBER, it will be assigned to test_mode. Then load everything from current dir.
  1st argument: If it is a string called "remote", it will download driver/FPGA and load everything.
  - 2nd argument (if exist) is the target directory name for downloading and reloading
  - 3rd argument (if exist) is the value for test_mode
  1st argument: neither NUMBER nor "remote" nor a .tar.gz file, it is regarded as a directory and load everything from it.
  - 2nd argument (if exist) is the value for test_mode
  1st argument: a .tar.gz file, it will be unpacked then load from that unpacked directory
  - 2nd argument (if exist) is the value for test_mode
```


================================================
FILE: doc/app_notes/frequent_trick.md
================================================
Some usual/frequent control trick over the openwifi FPGA. You need to do these controls on board in the openwifi directory.

[[CCA LBT threshold and disable](#CCA-LBT-threshold-and-disable)]
[[Retransmission and ACK control](#Retransmission-and-ACK-control)]
[[NAV DIFS EIFS CW disable and enable](#NAV-DIFS-EIFS-CW-disable-and-enable)]
[[CW max and min config](#CW-max-and-min-config)]

[[Rx gain config](#Rx-gain-config)]
[[Tx power config](#Tx-power-config)]
[[Tx Lo and port config](#Tx-Lo-and-port-config)]
[[Antenna selection](#Antenna-selection)]
[[Restrict the frequency](#Restrict-the-frequency)]
[[Receiver sensitivity control](#Receiver-sensitivity-control)]

[[Tx rate config](#Tx-rate-config)]
[[Arbitrary Tx IQ sample](#Arbitrary-Tx-IQ-sample)]

## CCA LBT threshold and disable

In normal operation, different threshold is set to FPGA according to the different calibration of different frequency/channel by driver automatically. Show the current LBT threshold in FPGA:
```
./set_lbt_th.sh
dmesg
```
It shows: "sdr,sdr FPGA LBT threshold 166(-62dBm). The last_auto_fpga_lbt_th 166(-62dBm). rssi corr 145". Check rssi_half_db_to_rssi_dbm()/rssi_dbm_to_rssi_half_db() in sdr.c to see the relation to rssi dBm.

Override a new threshold -NNdBm to FPGA, for example -70dBm:
```
./set_lbt_th.sh 70
dmesg
```
Above will disable the automatic CCA threshold setting from the openwifi driver.

Recover the driver automatic control on the threshold:
```
./set_lbt_th.sh 0
dmesg
```
Disable the CCA by setting a very strong level as threshold, for example -1dBm:
```
./set_lbt_th.sh 1
dmesg
```
After above command, the CCA engine will always believe the channel is idle, because the rx signal strength not likely could exceed -1dBm.
  
## Retransmission and ACK control

The best way of override the maximum number of re-transmission for a Tx packet is doing it in the driver openwifi_tx() function. 
```
retry_limit_hw_value = ( retry_limit_raw==0?0:((retry_limit_raw - 1)&0xF) );
```
Override retry_limit_hw_value to 0 to disable re-transmission. Override it to 1 means that let FPGA do maximum 1 time re-transmission.

The FPGA also has a register to override the re-transmission and ACK behavior. Check the current register value.
```
./sdrctl dev sdr0 get reg xpu 11
```
When operate this register, make sure you only change the relevant bits and leave other bits untouched, because other bits have other purposes. Also check the xpu register 11 in the [project document](../README.md)

To override the maximum number of re-transmission, set bit3 to 1, and set the value (0 ~ 7) to bit2 ~ 0. Example, override the maximum number of re-transmission to 1
```
./sdrctl dev sdr0 set reg xpu 11 9
```
9 in binary form is 01001.

To disable the ACK TX after receiving a packet, set bit4 to 1:
```
./sdrctl dev sdr0 set reg xpu 11 16
```
If we want to preserve the above re-transmission overriding setting while disable ACK Tx:
```
./sdrctl dev sdr0 set reg xpu 11 25
```
25 in binary form is 11001. the 1001 of bit3 to 1 is untouched.

Disabling ACK TX might be useful for monitor mode and packet injection.

To disable the ACK RX after sending a packet, set bit5 to 1:
```
./sdrctl dev sdr0 set reg xpu 11 32
```

To disable both ACK Tx and Rx:
```
./sdrctl dev sdr0 set reg xpu 11 48
```
  
## NAV DIFS EIFS CW disable and enable

To check the current NAV/DIFS/EIFS/CW disable status, just run
```
./nav_disable.sh
./difs_disable.sh
./eifs_disable.sh
./cw_disable.sh
```
If NAV is disabled, the openwifi will always assume the NAV (Network Allocation Vector) is already counting down to 0. If DIFS/EIFS is disabled, when the CSMA engine needs to wait for DIFS/EIFS, it won't wait anymore. If CW is disabled, the contention window is fixed to 0, and there won't be any number of slots for random backoff procedure. To disable them, just input 1 as the script argument.
```
./nav_disable.sh 1
./difs_disable.sh 1
./eifs_disable.sh 1
./cw_disable.sh 1
```
To enable them, just input 0 as the script argument.
```
./nav_disable.sh 0
./difs_disable.sh 0
./eifs_disable.sh 0
./cw_disable.sh 0
```

## CW max and min config

When the openwifi NIC bring up (as AP/Client/ad-hoc/etc), Linux will configure the CW (Contention Window) max and min value for FPGA queue 3 ~ 0 via openwifi_conf_tx() in the openwifi driver. You can check the current CW configuration in FPGA (set by Linux).
```
./cw_max_min_cfg.sh
```
It will show sth like
```
FPGA  cw max min for q3 to q0: 1023 15; 63 15; 15 7; 7 3
FPGA  cw max min for q3 to q0: a4644332
```
The CW max and min for q3 ~ 0  are a4, 64, 43, 32 (in hex). Example explanation for q3: in hex the configuration is a4, which means 10 and 4 in the logarithmic domain, (2^10)-1=1023 and (2^4)-1=15 in the linear domain.

To override the CW max and min for queue 3 ~ 0, for example 2047 31; 63 31; 15 7; 7 3, just map it to a hex string b5654332 for queue 3 ~ 0 and give it as the script argument:
```
./cw_max_min_cfg.sh b5654332
```
It will show sth like
```
FPGA  cw max min for q3 to q0: 2047 31; 63 31; 15 7; 7 3
FPGA  cw max min for q3 to q0: b5654332
SYSFS cw max min for q3 to q0: 2047 31; 63 31; 15 7; 7 3
SYSFS cw max min for q3 to q0: b5654332
```
To give the control back to Linux
```
./cw_max_min_cfg.sh 0
```
Be careful that above command won't bring the Linux CW max min setting back to FPGA automatically, because Linux normally only call the setting function openwifi_conf_tx() for 1 time when the NIC is started. So either you write down the Linux setting by checking it at the beginning, and set it back via cw_max_min_cfg.sh before giving it argument 0, or re-load the NIC/driver to trigger the Linux setting action for the NIC.
  
## Rx gain config

In normal operation, you don't need to do Rx gain control manually, because it is controled by the AD9361 AGC function. For optimization/experiment purpose, you might want to use the manual rx gain control, you can run
```
./set_rx_gain_manual.sh 30
```
Above command will turn the automatic gain control mode to manual gain control mode, and set 30dB to the Rx gain module.

Bring it back to the automatic gain control mode
```
./set_rx_gain_auto.sh
```
To find out a good reference about a manual Rx gain setting for the current link/peer, you can set it to automatic mode and then run
```
./stat_enable.sh
```
once and then
```
./rx_gain_show.sh
```
for multiple times to check the actual AGC gain vlaue for received packet as explained in this [Access counter/statistics in driver](driver_stat.md). Then you can set the AGC gain value as argument to the **set_rx_gain_manual.sh** with the corret **offset**! For example, if **rx_gain_show.sh** reports a AGC gain value 34 for many successfully received data packets, and you want to use it as a manual gain setting, you need to set
```
./set_rx_gain_manual.sh 20
```
if the current working channel is 5220MHz (34 - 14dB offset = 20). You need to set
```
./set_rx_gain_manual.sh 29
```
if the current working channel is in 2.4GHz  (34 - 5dB offset = 29). 
  
## Tx power config
```
./sdrctl dev sdr0 set reg rf 0 20000
```
Above command will set Tx power attenuation to 20dB (20*1000). By default it is 0dB.

If you want an initial attenuation 20dB while loading and bringing up the openwifi NIC, please use the **init_tx_att** argument for the sdr.ko.
```
insmod sdr.ko init_tx_att=20000
```
You can change above driver loading action at the end of **wgd.sh**.

The initial Tx attenuation might be useful when you connect two SDR boards directly by cable. Even though, you shouldn't not connect them during the setup phase (bring up the AP or client), because the initialization/tuning of AD9361 might generate big Tx power and kill the other AD9361's Rx. Only connect two SDR boards by cable after both sides have been setup and the attenuation setting takes effect.

To increase the Tx power, you can consider add external PA like [this](https://github.com/open-sdr/openwifi/issues/53#issuecomment-767621478). Or increase the value of register 13 of tx_intf (check [README](../README.md)).

Read the register value:
```
./sdrctl dev sdr0 get reg tx_intf 13
```

Set the register value to N (a number larger than the value read back above):
```
./sdrctl dev sdr0 set reg tx_intf 13 N
```
Bigger value in that register could hurt the Tx EVM and long packet signal. You need to fine tune it for your case.

## Tx Lo and port config

In normal operation, the Tx Lo and RF port are controled by FPGA automatically during signal Tx. To check the current Tx Lo and RF port switch status
```
./set_tx_port.sh
./set_tx_lo.sh
```
Give argument **1** to above scripts to turn them **ON**, **0** for **OFF**.

To turn off automatic Tx Lo control from FPGA and leave Tx Lo always ON:
```
./sdrctl dev sdr0 set reg xpu 13 1
```
  
## Antenna selection
  
By default, the 1st Tx and Rx antennas are used (tx0 and rx0). You can change the tx antenna to tx1 by
```
./sdrctl dev sdr0 set reg drv_tx 4 1
```
Change the tx antenna back to tx0 by
```
./sdrctl dev sdr0 set reg drv_tx 4 0
```
Change the rx antenna to rx1 and rx0 by
```
./sdrctl dev sdr0 set reg drv_rx 4 1
./sdrctl dev sdr0 set reg drv_rx 4 0
```

## Restrict the frequency

Since the AD9361 frequency tuning could generate big unwanted Tx noise, and it could damage the other AD9361 Rx during the test via cable, a restricted frequency can be set to avoid the possible frequency tuning (such as the background scan of Wifi). For example, you want the AD9361 works only in 5220Mhz:
```
./set_restrict_freq.sh 5220
```
Above command will fix the AD9361 in 5220MHz and let driver ignore frequency tuning request other than 5220MHz. The restriction can be removed by:
```
./set_restrict_freq.sh 0
```
To let openwifi work at arbitrary frequency, please check [Let openwifi work at arbitrary frequency](../README.md#let-openwifi-work-at-arbitrary-frequency)

## Receiver sensitivity control

Sometimes too good sensitivity could be a bad thing. WiFi receiver could be "attracted" by many weak signal/packet in the background, and has less "attention" to its real communication target (client/AP). Openwifi has offered a way to make the receiver less sensitive by setting a threshold. When the received signal is lower than this threshold, the receiver will not try to search the WiFi short preamble, i.e. ignore it. For example, if you want to set -70dBm as the threshold, use:
```
./sdrctl dev sdr0 set reg drv_rx 0 70
```

## Tx rate config
  
By default, the Linux rate adaptation algorithm **minstrel_ht** set the packet rate/MCS automatically via openwifi_tx() function.
```
rate_hw_value = ieee80211_get_tx_rate(dev, info)->hw_value;
```
To override the Linux automatic control for non-ht packet
```
./sdrctl dev sdr0 set reg drv_tx 0 N
```
Value N: 0 for Linux auto control; 4 ~ 11 for 6M, 9M, 12M, 18M, 24M, 36M, 48M, 54M.

To override the Linux automatic control for ht packet
```
./sdrctl dev sdr0 set reg drv_tx 1 N
```
Value N: 0 for Linux auto control; 4 ~ 11 for 6.5M, 13M, 19.5M, 26M, 39M, 52M, 58.5M, 65M. By default, the normal GI is used. To use the short GI, you need to add 16 to the target value N.
  
## Arbitrary Tx IQ sample
  
Arbitrary IQ sample can be written to tx_intf and sent for test purposes. Currently maximum 512 samples, which is decided by the FIFO size in tx_iq_intf.v.

To verify this feature, firstly bring up the sdr0 NIC and put it into non-Tx mode, such as monitor mode. Then setup IQ capture in loopback mode, for example FPGA internal. (Check IQ capture App note for more details)
```
insmod side_ch.ko iq_len_init=8187
# Make sure to set the Tx local oscillator always on (as XPU is not aware of the transmission)
./sdrctl dev sdr0 set reg xpu 13 1
# Set 100 to register 11. It means the pre trigger length is 100, so we mainly capture IQ after trigger condition is met
./side_ch_ctl wh11d100
# Set 3 to register 8 -- set trigger condition to tx_intf_iq0_non_zero in tx_intf
./side_ch_ctl wh8d3
# Set the loopback mode to FPGA internal
./side_ch_ctl wh5h4
./side_ch_ctl g0
```

Run `python3 iq_capture.py 8187` on the host PC to wait for IQ capture by FPGA. After FPGA hits the IQ capture trigger condition, this host PC Python script will display and save the captured IQ.

Open another ssh session to the board. Make sure you have an arbitrary_iq_gen directory, tx_intf_iq_data_to_sysfs.sh and tx_intf_iq_send.sh (from user_space directory in the host PC) on board. Then run:
```
# Send the example IQ data to driver sysfs, and read back for check
./tx_intf_iq_data_to_sysfs.sh
# Write the IQ data from driver to FPGA, and send once
./tx_intf_iq_send.sh
```

Above scripts will send one time IQ. So you should see the captured IQ plot pop up. You can further check/process iq.txt in Matlab by `test_iq_file_display.m`.

The related tx_intf registers and tx_iq_intf ports
tx_intf register|tx_iq_intf port|explanation
----------------|---------------|-----------
slv_reg7 bit0   |tx_arbitrary_iq_mode| 0:Normal operation; 1:Arbitrary IQ mode
slv_reg7 bit1   |tx_arbitrary_iq_tx_trigger| jumping from 0 to 1 will trigger one time Tx of IQ in the tx_iq_intf FIFO
slv_reg1 bit31~0|tx_arbitrary_iq_in|The driver writes IQ (32bit=I+Q) via this port one by one into the FIFO

The script `tx_intf_iq_send.sh` will trigger driver operations via `tx_intf_iq_ctl_store` function in `sysfs_intf.c`:
- Switch to arbitrary IQ mode via slv_reg7 bit0
- Write IQ data one by one to the tx_intf FIFO via slv_reg1
- Trigger one time Tx of IQ data via slv_reg7 bit1


================================================
FILE: doc/app_notes/guard-interval.png.license
================================================
# Author: Michael Mehari

# SPDX-FileCopyrightText: 2019 UGent
# SPDX-License-Identifier: AGPL-3.0-or-later


================================================
FILE: doc/app_notes/hls.md
================================================
<!--
Author: Thijs Havinga
SPDX-FileCopyrightText: 2019 UGent
SPDX-License-Identifier: AGPL-3.0-or-later
-->

FCCM2023 Poster: [Thijs Havinga, et al. Accelerating FPGA-Based Wi-Fi Transceiver Design and Prototyping by High-Level Synthesis](https://github.com/open-sdr/openwifi-hw-img/raw/master/doc_repo/Thijs-FCCM2023-poster.jpg)

[Longer/detailed info about the poster](https://arxiv.org/abs/2305.13351)

In order to speed up or ease FPGA development, it is possible to use High-Level Synthesis (HLS) for creating core baseband processing modules of openwifi. We have already programmed the receiver modules channel estimation and equalization in C++ and converted to Verilog using Vitis HLS. In order to use openwifi with these HLS modules, follow the [build instructions](#build-instructions).
In order to modify these modules within Vitis HLS, follow [the instructions below](#modify-the-code-using-vitis-hls). 

## Build instructions

Follow the [Build FPGA](https://github.com/open-sdr/openwifi-hw#build-fpga) instructions till before generating ip_repo. In order to switch to the HLS-version of openofdm_rx, use the following commands:

```
cd ip/openofdm_rx
git checkout dot11zynq_hls
```

Now continue with the instructions. Before generating the bitstream, update the openofdm_rx IP by making sure it is selected under "IP Status" and click "Upgrade Selected". Afterwards, continue with the instructions to generate the bitstream.

## Modify the code using Vitis HLS
When in the `openwifi-hw` folder, make sure to run:
```
./get_ip_openofdm_rx.sh
cd ip/openofdm_rx
git checkout dot11zynq_hls
```
Then start Vitis HLS and create a new project. Import either all source files (except those ending on '_test.cpp') in the [ch_gain_cal](https://github.com/open-sdr/openofdm/tree/dot11zynq_hls/hls/ch_gain_cal) or [equalizer](https://github.com/open-sdr/openofdm/tree/dot11zynq_hls/hls/equalizer) folder to modify the channel estimation or equalizer module, respectively. Choose either 'equalizer' or 'ch_gain_cal' as top-level module. Next, select `equalizer_test.cpp` or `ch_gain_cal_test.cpp` as testbench file. In 'Part selection', select the right part corresponding to your board. 

After modifying the code and making sure C simulation and cosimulation is running fine, select 'Export RTL', which will generate a ZIP file with a folder `hdl/verilog` containing the generated Verilog files. Replace the current folder `openwifi-hw/ip/openofdm_rx/hls/equalizer/hdl/verilog/` (or `.../ch_gain_cal/hdl/verilog`) with this folder and change the `openofdm_rx.tcl` file to include the newly generated Verilog files. See [here](https://github.com/open-sdr/openofdm/blob/dot11zynq_hls/openofdm_rx.tcl#L268) for an example. If you modified the top-level function arguments, you will need to interface them accordingly in [dot11.v](https://github.com/open-sdr/openofdm/blob/dot11zynq_hls/verilog/dot11.v).

Now follow the [Build FPGA](https://github.com/open-sdr/openwifi-hw#build-fpga) instructions, starting at the step "Generate ip_repo for the top level FPGA project". It will then use the modified .tcl file to include the correct files for your modified HLS module and build the FPGA using it.

A similar approach can be followed to create other HLS modules, where you would need to execute these steps in the folder of the IP to be modified and integrate the modules in the corresponding top-level Verilog file.


================================================
FILE: doc/app_notes/ieee80211n.md
================================================
<!--
Author: Michael Mehari
SPDX-FileCopyrightText: 2019 UGent
SPDX-License-Identifier: AGPL-3.0-or-later
-->

## IEEE 802.11n (Wi-Fi 4)

The 4th generation of Wi-Fi (i.e. 802.11n-2009) is a generation leap over its predecessor Wi-Fi 3 (i.e. 802.11g-2003). It was coined as high throughput (HT) since it improves both the physical layer and the MAC layer.

### PHY layer improvements
At the physical layer, 5 major improvements were amended on top of Wi-Fi 3 and this has increased the throughput from 54Mbps to 600Mbps.

#### More subcarriers
Wi-Fi 3 utilizes 48 OFDM data subcarriers and Wi-Fi 4 increased this number to 52, thereby increasing the throughput to 52/48 * 54Mbps = 58.5Mbps.

![](./subcarriers.png)

#### Forward error correction
The most efficient coding rate used in Wi-Fi 3 was 3/4 but Wi-Fi increased this value to 5/6 by squeezing more bits. This has increased the throughput to (5/6)/(3/4) * 58.5Mbps = 65Mbps.

#### Guard interval
As a measure to combat inter-symbol interference (ISA), Wi-Fi 3 utilizes 800nsec of guard interval between consecutive OFDM symbols. Wi-Fi 4 shortens this value to 400nsec, and this has increased the throughput to 4usec/3.6usec * 65Mbps = 72.2Mbps.

![](./guard-interval.png)

#### MIMO
Wi-Fi 4 was the first to introduce MIMO and standardized 4x4 spatial streams. This has quadrupled the throughput to 4*72.2Mbps = 288.9Mbps.

![](./mimo.png)

#### 40MHz bandwidth
The last thing Wi-Fi 4 introduced to the physical layer is a 40MHz bandwidth utilizing 108 OFDM data subcarriers. This has increased the throughput to 108/52 * 288.8Mbps = 600 Mbps.

![](./40mhz.png)

### MAC layer improvements

On top of the PHY layer improvements, Wi-Fi 4 also introduced frame aggregation at the MAC layer to ease the medium access co
Download .txt
gitextract_cw_8qgx2/

├── .github/
│   └── ISSUE_TEMPLATE/
│       └── issue-description.md
├── .gitmodules
├── CONTRIBUTING.md
├── LICENSE
├── LICENSES/
│   ├── AGPL-3.0-or-later.txt
│   ├── BSD-3-Clause.txt
│   ├── GPL-2.0-or-later.txt
│   └── ISC.txt
├── README.md
├── doc/
│   ├── README.md
│   ├── app_notes/
│   │   ├── 40mhz.png.license
│   │   ├── README.md
│   │   ├── ad-hoc-two-sdr.md
│   │   ├── ap-client-two-sdr.md
│   │   ├── csi-architecture.jpg.license
│   │   ├── csi-information-format.jpg.license
│   │   ├── csi-screen-shot.jpg.license
│   │   ├── csi.md
│   │   ├── csi_fuzzer.md
│   │   ├── driver_stat.md
│   │   ├── drv_fpga_dynamic_loading.md
│   │   ├── frequent_trick.md
│   │   ├── guard-interval.png.license
│   │   ├── hls.md
│   │   ├── ieee80211n.md
│   │   ├── inject_80211.md
│   │   ├── iq-architecture.jpg.license
│   │   ├── iq-capture-parameter.jpg.license
│   │   ├── iq-information-format.jpg.license
│   │   ├── iq-screen-shot.jpg.license
│   │   ├── iq.md
│   │   ├── iq_2ant-screen-shot.jpg.license
│   │   ├── iq_2ant-setup.png.license
│   │   ├── iq_2ant.md
│   │   ├── iq_ack_timing.md
│   │   ├── mimo.png.license
│   │   ├── mpdu-aggr.png.license
│   │   ├── packet-iq-self-loopback-test.md
│   │   ├── perf_counter.md
│   │   ├── radar-self-csi.md
│   │   └── subcarriers.png.license
│   ├── asic/
│   │   └── skywater-130-pdk-and-asic-considerations.md
│   ├── cite-openwifi-github-code.md
│   ├── cite-openwifi-vtc-paper.md
│   ├── img_build_instruction/
│   │   └── kuiper.md
│   ├── known_issue/
│   │   └── notter.md
│   ├── openwifi-detail.jpg.license
│   ├── publications.md
│   ├── rf-digital-if-chain-config.jpg.license
│   ├── rf-digital-if-chain-spectrum.jpg.license
│   └── videos.md
├── driver/
│   ├── Makefile
│   ├── hw_def.h
│   ├── make_all.sh
│   ├── openofdm_rx/
│   │   ├── Makefile
│   │   └── openofdm_rx.c
│   ├── openofdm_tx/
│   │   ├── Makefile
│   │   └── openofdm_tx.c
│   ├── rx_intf/
│   │   ├── Makefile
│   │   └── rx_intf.c
│   ├── sdr.c
│   ├── sdr.h
│   ├── sdrctl_intf.c
│   ├── side_ch/
│   │   ├── Makefile
│   │   ├── make_driver.sh
│   │   ├── side_ch.c
│   │   └── side_ch.h
│   ├── sysfs_intf.c
│   ├── tx_intf/
│   │   ├── Makefile
│   │   └── tx_intf.c
│   ├── xilinx_dma/
│   │   ├── README.md
│   │   ├── make_xilinx_dma.sh
│   │   └── xilinx_dma.c
│   └── xpu/
│       ├── Makefile
│       └── xpu.c
├── kernel_boot/
│   ├── 10-network-device.rules
│   ├── 70-persistent-net.rules
│   ├── ad9361.patch
│   ├── ad9361_conv.patch
│   ├── ad9361_private.patch
│   ├── axi_hdmi_crtc.patch
│   ├── boards/
│   │   ├── adrv9361z7035/
│   │   │   ├── devicetree.dtb
│   │   │   ├── devicetree.dts
│   │   │   └── u-boot.elf
│   │   ├── adrv9361z7035_fmc/
│   │   │   ├── devicetree.dtb
│   │   │   ├── devicetree.dts
│   │   │   └── u-boot.elf
│   │   ├── adrv9364z7020/
│   │   │   ├── devicetree.dtb
│   │   │   ├── devicetree.dts
│   │   │   └── u-boot.elf
│   │   ├── antsdr/
│   │   │   ├── devicetree.dtb
│   │   │   ├── devicetree.dts
│   │   │   ├── notes.md
│   │   │   └── u-boot.elf
│   │   ├── antsdr_e200/
│   │   │   ├── README.md
│   │   │   ├── devicetree.dtb
│   │   │   ├── devicetree.dts
│   │   │   └── u-boot.elf
│   │   ├── e310v2/
│   │   │   ├── README.md
│   │   │   ├── devicetree.dtb
│   │   │   ├── devicetree.dts
│   │   │   └── u-boot.elf
│   │   ├── neptunesdr/
│   │   │   ├── devicetree.dtb
│   │   │   ├── devicetree.dts
│   │   │   └── u-boot.elf
│   │   ├── sdrpi/
│   │   │   ├── devicetree.dtb
│   │   │   ├── devicetree.dts
│   │   │   ├── notes.md
│   │   │   └── u-boot.elf
│   │   ├── zc702_fmcs2/
│   │   │   ├── devicetree.dtb
│   │   │   ├── devicetree.dts
│   │   │   └── u-boot.elf
│   │   ├── zc706_fmcs2/
│   │   │   ├── devicetree.dtb
│   │   │   ├── devicetree.dts
│   │   │   └── u-boot.elf
│   │   ├── zcu102_fmcs2/
│   │   │   ├── bl31.elf
│   │   │   ├── system.dtb
│   │   │   ├── system.dts
│   │   │   └── u-boot_xilinx_zynqmp_zcu102_revA.elf
│   │   └── zed_fmcs2/
│   │       ├── devicetree.dtb
│   │       ├── devicetree.dts
│   │       └── u-boot.elf
│   ├── build_boot_bin.sh
│   ├── build_zynqmp_boot_bin.sh
│   ├── kernel_config
│   ├── kernel_config_zynqmp
│   └── kernel_patch_readme.md
├── openwifi-arch.jpg.license
└── user_space/
    ├── agc_settings.sh
    ├── arbitrary_iq_gen/
    │   ├── iq_single_carrier_1000000Hz_512.txt
    │   └── single_carrier_gen.m
    ├── boot_bin_gen.sh
    ├── build_wpa_supplicant_wo11b.sh
    ├── cd_adi_iio_dir.sh
    ├── check_calib_inf.sh
    ├── csi_fuzzer.sh
    ├── csi_fuzzer_scan.sh
    ├── cw_disable.sh
    ├── cw_max_min_cfg.sh
    ├── dhcpd.conf
    ├── difs_disable.sh
    ├── driver_nl80211.patch
    ├── drv_and_fpga_package_gen.sh
    ├── eifs_by_last_rx_fail_disable.sh
    ├── eifs_by_last_tx_fail_disable.sh
    ├── eifs_disable.sh
    ├── fast_reg_log/
    │   ├── fast_reg_log.c
    │   └── fast_reg_log_analyzer.m
    ├── fosdem-11ag.sh
    ├── fosdem.sh
    ├── hostapd-openwifi-11ag.conf
    ├── hostapd-openwifi.conf
    ├── inject_80211/
    │   ├── Makefile
    │   ├── analyze_80211.c
    │   ├── ieee80211_radiotap.h
    │   ├── inject_80211.c
    │   ├── inject_80211.h
    │   ├── inject_80211.sh
    │   ├── radiotap.c
    │   ├── radiotap.h
    │   ├── unaligned.h
    │   └── uthash.h
    ├── link_perf_test.sh
    ├── load_fpga_img.sh
    ├── monitor_ch.sh
    ├── nav_disable.sh
    ├── nic_back_to_normal.sh
    ├── openwifi_ad9361_fir.ftr
    ├── openwifi_ad9361_fir_tx_0MHz.ftr
    ├── openwifi_ad9361_fir_tx_0MHz_11n.ftr
    ├── openwifi_ad9361_fir_tx_0MHz_11n_narrow1.ftr
    ├── populate_driver_userspace.sh
    ├── populate_kernel_image_module_reboot.sh
    ├── post_config.sh
    ├── prepare_kernel.sh
    ├── receiver_phase_offset_override.sh
    ├── rf_init.sh
    ├── rf_init_11n.sh
    ├── rssi_ad9361_show.sh
    ├── rssi_openwifi_show.sh
    ├── rx_gain_show.sh
    ├── rx_stat_show.sh
    ├── sdcard_boot_update.sh
    ├── sdr-ad-hoc-join.sh
    ├── sdr-ad-hoc-up.sh
    ├── sdrctl_src/
    │   ├── Makefile
    │   ├── cmd.c
    │   ├── nl80211.h
    │   ├── nl80211_testmode_def.h
    │   ├── sdrctl.c
    │   ├── sdrctl.h
    │   ├── sections.c
    │   └── version.sh
    ├── set_dbg_ch0.sh
    ├── set_dbg_ch1.sh
    ├── set_dbg_ch2.sh
    ├── set_lbt_th.sh
    ├── set_restrict_freq.sh
    ├── set_rx_gain_auto.sh
    ├── set_rx_gain_manual.sh
    ├── set_rx_monitor_all.sh
    ├── set_rx_target_sender_mac_addr.sh
    ├── set_tx_lo.sh
    ├── set_tx_port.sh
    ├── setup_once.sh
    ├── side_ch_ctl_src/
    │   ├── iq_capture.py
    │   ├── iq_capture_2ant.py
    │   ├── iq_capture_freq_offset.py
    │   ├── save_iq_to_txt_for_verilog_sim.m
    │   ├── show_iq_snr.m
    │   ├── side_ch_ctl.c
    │   ├── side_info_display.py
    │   ├── test_iq_2ant_file_display.m
    │   ├── test_iq_file_ack_timing_display.m
    │   ├── test_iq_file_display.m
    │   └── test_side_info_file_display.m
    ├── slice_cfg.sh
    ├── stat_enable.sh
    ├── system_top.bif
    ├── transfer_driver_userspace_to_board.sh
    ├── transfer_kernel_image_module_to_board.sh
    ├── tx_intf_iq_data_to_sysfs.sh
    ├── tx_intf_iq_send.sh
    ├── tx_prio_queue_show.sh
    ├── tx_stat_show.sh
    ├── update_sdcard.sh
    ├── webserver/
    │   ├── index.html
    │   ├── openwifi-detail.jpg.license
    │   └── openwifi-logo-small.jpg.license
    ├── wgd.sh
    ├── wpa-connect.conf
    ├── wpa-openwifi.conf
    └── wpa-testap.conf
Download .txt
SYMBOL INDEX (800 symbols across 31 files)

FILE: driver/hw_def.h
  type openwifi_hardware_type (line 9) | enum openwifi_hardware_type {
  type openwifi_fpga_type (line 16) | enum openwifi_fpga_type {
  type openwifi_band (line 24) | enum openwifi_band {
  type tx_intf_mode (line 66) | enum tx_intf_mode {
  type tx_intf_driver_api (line 81) | struct tx_intf_driver_api {
  type rx_intf_mode (line 158) | enum rx_intf_mode {
  type rx_intf_driver_api (line 171) | struct rx_intf_driver_api {
  type openofdm_rx_mode (line 223) | enum openofdm_rx_mode {
  type openofdm_rx_driver_api (line 265) | struct openofdm_rx_driver_api {
  type openofdm_tx_mode (line 289) | enum openofdm_tx_mode {
  type openofdm_tx_driver_api (line 294) | struct openofdm_tx_driver_api {
  type xpu_mode (line 352) | enum xpu_mode {
  type xpu_driver_api (line 357) | struct xpu_driver_api {

FILE: driver/openofdm_rx/openofdm_rx.c
  function u32 (line 29) | static inline u32 reg_read(u32 reg)
  function reg_write (line 34) | static inline void reg_write(u32 reg, u32 value)
  function u32 (line 39) | static inline u32 OPENOFDM_RX_REG_STATE_HISTORY_read(void){
  function OPENOFDM_RX_REG_MULTI_RST_write (line 43) | static inline void OPENOFDM_RX_REG_MULTI_RST_write(u32 Data) {
  function OPENOFDM_RX_REG_ENABLE_write (line 46) | static inline void OPENOFDM_RX_REG_ENABLE_write(u32 Data) {
  function OPENOFDM_RX_REG_POWER_THRES_write (line 49) | static inline void OPENOFDM_RX_REG_POWER_THRES_write(u32 Data) {
  function OPENOFDM_RX_REG_MIN_PLATEAU_write (line 52) | static inline void OPENOFDM_RX_REG_MIN_PLATEAU_write(u32 Data) {
  function OPENOFDM_RX_REG_SOFT_DECODING_write (line 55) | static inline void OPENOFDM_RX_REG_SOFT_DECODING_write(u32 Data) {
  function OPENOFDM_RX_REG_FFT_WIN_SHIFT_write (line 58) | static inline void OPENOFDM_RX_REG_FFT_WIN_SHIFT_write(u32 Data) {
  function OPENOFDM_RX_REG_PHASE_OFFSET_ABS_TH_write (line 61) | static inline void OPENOFDM_RX_REG_PHASE_OFFSET_ABS_TH_write(u32 Data) {
  type of_device_id (line 64) | struct of_device_id
  type openofdm_rx_driver_api (line 70) | struct openofdm_rx_driver_api
  type openofdm_rx_driver_api (line 71) | struct openofdm_rx_driver_api
  function u32 (line 74) | static inline u32 hw_init(enum openofdm_rx_mode mode){
  function dev_probe (line 123) | static int dev_probe(struct platform_device *pdev)
  function dev_remove (line 175) | static int dev_remove(struct platform_device *pdev)
  type platform_driver (line 187) | struct platform_driver

FILE: driver/openofdm_tx/openofdm_tx.c
  function u32 (line 30) | static inline u32 reg_read(u32 reg)
  function reg_write (line 35) | static inline void reg_write(u32 reg, u32 value)
  function OPENOFDM_TX_REG_MULTI_RST_write (line 40) | static inline void OPENOFDM_TX_REG_MULTI_RST_write(u32 Data) {
  function OPENOFDM_TX_REG_INIT_PILOT_STATE_write (line 44) | static inline void OPENOFDM_TX_REG_INIT_PILOT_STATE_write(u32 Data) {
  function OPENOFDM_TX_REG_INIT_DATA_STATE_write (line 48) | static inline void OPENOFDM_TX_REG_INIT_DATA_STATE_write(u32 Data) {
  type of_device_id (line 52) | struct of_device_id
  type openofdm_tx_driver_api (line 58) | struct openofdm_tx_driver_api
  type openofdm_tx_driver_api (line 59) | struct openofdm_tx_driver_api
  function u32 (line 62) | static inline u32 hw_init(enum openofdm_tx_mode mode){
  function dev_probe (line 97) | static int dev_probe(struct platform_device *pdev)
  function dev_remove (line 145) | static int dev_remove(struct platform_device *pdev)
  type platform_driver (line 157) | struct platform_driver

FILE: driver/rx_intf/rx_intf.c
  function u32 (line 29) | static inline u32 reg_read(u32 reg)
  function reg_write (line 34) | static inline void reg_write(u32 reg, u32 value)
  function u32 (line 39) | static inline u32 RX_INTF_REG_MULTI_RST_read(void){
  function u32 (line 43) | static inline u32 RX_INTF_REG_MIXER_CFG_read(void){
  function u32 (line 47) | static inline u32 RX_INTF_REG_IQ_SRC_SEL_read(void){
  function u32 (line 51) | static inline u32 RX_INTF_REG_IQ_CTRL_read(void){
  function u32 (line 55) | static inline u32 RX_INTF_REG_START_TRANS_TO_PS_MODE_read(void){
  function u32 (line 59) | static inline u32 RX_INTF_REG_START_TRANS_TO_PS_read(void){
  function u32 (line 63) | static inline u32 RX_INTF_REG_START_TRANS_TO_PS_SRC_SEL_read(void){
  function u32 (line 67) | static inline u32 RX_INTF_REG_NUM_DMA_SYMBOL_TO_PL_read(void){
  function u32 (line 71) | static inline u32 RX_INTF_REG_NUM_DMA_SYMBOL_TO_PS_read(void){
  function u32 (line 75) | static inline u32 RX_INTF_REG_CFG_DATA_TO_ANT_read(void){
  function u32 (line 79) | static inline u32 RX_INTF_REG_ANT_SEL_read(void){
  function u32 (line 83) | static inline u32 RX_INTF_REG_INTERRUPT_TEST_read(void) {
  function RX_INTF_REG_MULTI_RST_write (line 87) | static inline void RX_INTF_REG_MULTI_RST_write(u32 value){
  function RX_INTF_REG_M_AXIS_RST_write (line 91) | static inline void RX_INTF_REG_M_AXIS_RST_write(u32 value){
  function RX_INTF_REG_MIXER_CFG_write (line 105) | static inline void RX_INTF_REG_MIXER_CFG_write(u32 value){
  function RX_INTF_REG_IQ_SRC_SEL_write (line 109) | static inline void RX_INTF_REG_IQ_SRC_SEL_write(u32 value){
  function RX_INTF_REG_IQ_CTRL_write (line 113) | static inline void RX_INTF_REG_IQ_CTRL_write(u32 value){
  function RX_INTF_REG_START_TRANS_TO_PS_MODE_write (line 117) | static inline void RX_INTF_REG_START_TRANS_TO_PS_MODE_write(u32 value){
  function RX_INTF_REG_START_TRANS_TO_PS_write (line 121) | static inline void RX_INTF_REG_START_TRANS_TO_PS_write(u32 value){
  function RX_INTF_REG_START_TRANS_TO_PS_SRC_SEL_write (line 125) | static inline void RX_INTF_REG_START_TRANS_TO_PS_SRC_SEL_write(u32 value){
  function RX_INTF_REG_NUM_DMA_SYMBOL_TO_PL_write (line 129) | static inline void RX_INTF_REG_NUM_DMA_SYMBOL_TO_PL_write(u32 value){
  function RX_INTF_REG_NUM_DMA_SYMBOL_TO_PS_write (line 133) | static inline void RX_INTF_REG_NUM_DMA_SYMBOL_TO_PS_write(u32 value){
  function RX_INTF_REG_CFG_DATA_TO_ANT_write (line 137) | static inline void RX_INTF_REG_CFG_DATA_TO_ANT_write(u32 value){
  function RX_INTF_REG_BB_GAIN_write (line 141) | static inline void RX_INTF_REG_BB_GAIN_write(u32 value) {
  function RX_INTF_REG_ANT_SEL_write (line 145) | static inline void RX_INTF_REG_ANT_SEL_write(u32 value){
  function RX_INTF_REG_INTERRUPT_TEST_write (line 149) | static inline void RX_INTF_REG_INTERRUPT_TEST_write(u32 value) {
  function RX_INTF_REG_S2MM_INTR_DELAY_COUNT_write (line 153) | static inline void RX_INTF_REG_S2MM_INTR_DELAY_COUNT_write(u32 value) {
  function RX_INTF_REG_TLAST_TIMEOUT_TOP_write (line 157) | static inline void RX_INTF_REG_TLAST_TIMEOUT_TOP_write(u32 value) {
  type of_device_id (line 161) | struct of_device_id
  type rx_intf_driver_api (line 167) | struct rx_intf_driver_api
  type rx_intf_driver_api (line 168) | struct rx_intf_driver_api
  function u32 (line 171) | static inline u32 hw_init(enum rx_intf_mode mode, u32 num_dma_symbol_to_...
  function dev_probe (line 344) | static int dev_probe(struct platform_device *pdev)
  function dev_remove (line 423) | static int dev_remove(struct platform_device *pdev)
  type platform_driver (line 435) | struct platform_driver

FILE: driver/sdr.c
  type ad9361_rf_phy (line 61) | struct ad9361_rf_phy
  type cf_axi_dds_state (line 62) | struct cf_axi_dds_state
  type dds_data_select (line 62) | enum dds_data_select
  type ad9361_rf_phy (line 63) | struct ad9361_rf_phy
  type spi_device (line 63) | struct spi_device
  type ad9361_rf_phy (line 64) | struct ad9361_rf_phy
  type ad9361_rf_phy (line 65) | struct ad9361_rf_phy
  type ctrl_outs_control (line 65) | struct ctrl_outs_control
  type ad9361_rf_phy (line 66) | struct ad9361_rf_phy
  type spi_device (line 67) | struct spi_device
  type ad9361_rf_phy (line 68) | struct ad9361_rf_phy
  function ad9361_do_calib_run (line 70) | int ad9361_do_calib_run(struct ad9361_rf_phy *phy, u32 cal, int arg){ret...
  function cf_axi_dds_datasel (line 71) | int cf_axi_dds_datasel(struct cf_axi_dds_state *st, int channel, enum dd...
  type ad9361_rf_phy (line 72) | struct ad9361_rf_phy
  type spi_device (line 72) | struct spi_device
  function ad9361_tx_mute (line 73) | int ad9361_tx_mute(struct ad9361_rf_phy *phy, u32 state){return(0);}
  function ad9361_ctrl_outs_setup (line 74) | int ad9361_ctrl_outs_setup(struct ad9361_rf_phy *phy, struct ctrl_outs_c...
  function ad9361_set_tx_atten (line 75) | int ad9361_set_tx_atten(struct ad9361_rf_phy *phy, u32 atten_mdb, bool t...
  function ad9361_spi_read (line 76) | int ad9361_spi_read(struct spi_device *spi, u32 reg){return(0);}
  function ad9361_get_tx_atten (line 77) | int ad9361_get_tx_atten(struct ad9361_rf_phy *phy, u32 tx_num){return(0);}
  type ad9361_rf_phy (line 79) | struct ad9361_rf_phy
  type ad9361_rf_phy_state (line 80) | struct ad9361_rf_phy_state
  type tx_intf_driver_api (line 83) | struct tx_intf_driver_api
  type rx_intf_driver_api (line 84) | struct rx_intf_driver_api
  type openofdm_tx_driver_api (line 85) | struct openofdm_tx_driver_api
  type openofdm_rx_driver_api (line 86) | struct openofdm_rx_driver_api
  type xpu_driver_api (line 87) | struct xpu_driver_api
  type ieee80211_hw (line 92) | struct ieee80211_hw
  type ieee80211_hw (line 93) | struct ieee80211_hw
  type openwifi_priv (line 97) | struct openwifi_priv
  type openwifi_priv (line 98) | struct openwifi_priv
  type ieee80211_hw (line 99) | struct ieee80211_hw
  type ieee80211_conf (line 99) | struct ieee80211_conf
  type ieee80211_hw (line 100) | struct ieee80211_hw
  type ieee80211_conf (line 100) | struct ieee80211_conf
  function openwifi_is_radio_enabled (line 126) | static bool openwifi_is_radio_enabled(struct openwifi_priv *priv)
  function openwifi_rfkill_init (line 141) | void openwifi_rfkill_init(struct ieee80211_hw *hw)
  function openwifi_rfkill_poll (line 151) | void openwifi_rfkill_poll(struct ieee80211_hw *hw)
  function openwifi_rfkill_exit (line 165) | void openwifi_rfkill_exit(struct ieee80211_hw *hw)
  function rssi_dbm_to_rssi_half_db (line 172) | inline int rssi_dbm_to_rssi_half_db(int rssi_dbm, int rssi_correction)
  function u8 (line 177) | inline u8 freq_MHz_to_band(u32 freq_MHz)
  function rssi_correction_lookup_table (line 187) | inline int rssi_correction_lookup_table(u32 freq_MHz)
  function ad9361_tx_calibration (line 209) | inline void ad9361_tx_calibration(struct openwifi_priv *priv, u32 actual...
  function openwifi_rf_rx_update_after_tuning (line 230) | inline void openwifi_rf_rx_update_after_tuning(struct openwifi_priv *pri...
  function rfsoc_rf_set_channel (line 255) | static void rfsoc_rf_set_channel(struct ieee80211_hw *dev,
  function ad9361_rf_set_channel (line 261) | static void ad9361_rf_set_channel(struct ieee80211_hw *dev,
  type openwifi_rf_ops (line 304) | struct openwifi_rf_ops
  type openwifi_rf_ops (line 312) | struct openwifi_rf_ops
  function u16 (line 320) | u16 reverse16(u16 d) {
  function u32 (line 328) | u32 reverse32(u32 d) {
  function openwifi_init_tx_ring (line 338) | static int openwifi_init_tx_ring(struct openwifi_priv *priv, int ring_idx)
  function openwifi_free_tx_ring (line 364) | static void openwifi_free_tx_ring(struct openwifi_priv *priv, int ring_idx)
  function openwifi_init_rx_ring (line 395) | static int openwifi_init_rx_ring(struct openwifi_priv *priv)
  function openwifi_free_rx_ring (line 418) | static void openwifi_free_rx_ring(struct openwifi_priv *priv)
  function rx_dma_setup (line 427) | static int rx_dma_setup(struct ieee80211_hw *dev){
  function rssi_half_db_to_rssi_dbm (line 451) | inline int rssi_half_db_to_rssi_dbm(int rssi_half_db, int rssi_correction)
  type ieee80211_hw (line 466) | struct ieee80211_hw
  type openwifi_priv (line 467) | struct openwifi_priv
  type ieee80211_rx_status (line 468) | struct ieee80211_rx_status
  type sk_buff (line 469) | struct sk_buff
  type ieee80211_hdr (line 470) | struct ieee80211_hdr
  type ieee80211_hdr (line 533) | struct ieee80211_hdr
  function irqreturn_t (line 661) | static irqreturn_t openwifi_tx_interrupt(int irq, void *dev_id)
  function u32 (line 852) | u32 gen_mpdu_crc(u8 *data_in, u32 num_bytes)
  function u8 (line 868) | u8 gen_mpdu_delim_crc(u16 m)
  type gpio_led_data (line 890) | struct gpio_led_data
  type led_classdev (line 891) | struct led_classdev
  function calc_n_ofdm (line 896) | inline int calc_n_ofdm(int num_octet, int n_dbps)
  function __le16 (line 906) | inline __le16 gen_ht_duration_id(__le16 frame_control, __le16 aid, u8 qo...
  function report_pkt_loss_due_to_driver_drop (line 962) | inline void report_pkt_loss_due_to_driver_drop(struct ieee80211_hw *dev,...
  function openwifi_tx (line 975) | static void openwifi_tx(struct ieee80211_hw *dev,
  function openwifi_set_antenna (line 1483) | static int openwifi_set_antenna(struct ieee80211_hw *dev, u32 tx_ant, u3...
  function openwifi_get_antenna (line 1569) | static int openwifi_get_antenna(struct ieee80211_hw *dev, u32 *tx_ant, u...
  function openwifi_start (line 1590) | static int openwifi_start(struct ieee80211_hw *dev)
  function openwifi_stop (line 1719) | static void openwifi_stop(struct ieee80211_hw *dev)
  function u64 (line 1772) | static u64 openwifi_get_tsf(struct ieee80211_hw *dev,
  function openwifi_set_tsf (line 1783) | static void openwifi_set_tsf(struct ieee80211_hw *hw, struct ieee80211_v...
  function openwifi_reset_tsf (line 1791) | static void openwifi_reset_tsf(struct ieee80211_hw *hw, struct ieee80211...
  function openwifi_set_rts_threshold (line 1797) | static int openwifi_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
  function openwifi_beacon_work (line 1803) | static void openwifi_beacon_work(struct work_struct *work)
  function openwifi_add_interface (line 1842) | static int openwifi_add_interface(struct ieee80211_hw *dev,
  function openwifi_remove_interface (line 1894) | static void openwifi_remove_interface(struct ieee80211_hw *dev,
  function openwifi_config (line 1905) | static int openwifi_config(struct ieee80211_hw *dev, u32 changed)
  function openwifi_bss_info_changed (line 1930) | static void openwifi_bss_info_changed(struct ieee80211_hw *dev,
  function u32 (line 1997) | u32 log2val(u32 val){
  function openwifi_conf_tx (line 2006) | static int openwifi_conf_tx(struct ieee80211_hw *dev, struct ieee80211_v...
  function u64 (line 2043) | static u64 openwifi_prepare_multicast(struct ieee80211_hw *dev,
  function openwifi_configure_filter (line 2050) | static void openwifi_configure_filter(struct ieee80211_hw *dev,
  function openwifi_ampdu_action (line 2087) | static int openwifi_ampdu_action(struct ieee80211_hw *hw, struct ieee802...
  type ieee80211_ops (line 2133) | struct ieee80211_ops
  type of_device_id (line 2155) | struct of_device_id
  function custom_match_spi_dev (line 2161) | static int custom_match_spi_dev(struct device *dev, const void *data)
  function custom_match_platform_dev (line 2170) | static int custom_match_platform_dev(struct device *dev, const void *data)
  function openwifi_dev_probe (line 2183) | static int openwifi_dev_probe(struct platform_device *pdev)
  function openwifi_dev_remove (line 2730) | static int openwifi_dev_remove(struct platform_device *pdev)
  type platform_driver (line 2750) | struct platform_driver

FILE: driver/sdr.h
  type gpio_led_data (line 11) | struct gpio_led_data { //please always align with the leds-gpio.c in lin...
  type gpio_leds_priv (line 19) | struct gpio_leds_priv { //please always align with the leds-gpio.c in li...
  type openwifi_rf_ops (line 24) | struct openwifi_rf_ops {
  type openwifi_buffer_descriptor (line 32) | struct openwifi_buffer_descriptor {
  type openwifi_ring (line 46) | struct openwifi_ring {
  type openwifi_vif (line 55) | struct openwifi_vif {
  type sdrctl_reg_cat (line 81) | enum sdrctl_reg_cat {
  type ieee80211_regdomain (line 186) | struct ieee80211_regdomain
  type ieee80211_rate (line 217) | struct ieee80211_rate
  type ieee80211_rate (line 232) | struct ieee80211_rate
  type ieee80211_channel (line 247) | struct ieee80211_channel
  type ieee80211_channel (line 264) | struct ieee80211_channel
  type ieee80211_iface_limit (line 321) | struct ieee80211_iface_limit
  type ieee80211_iface_combination (line 330) | struct ieee80211_iface_combination
  type cf_axi_dds_state (line 351) | struct cf_axi_dds_state {
  type openwifi_stat (line 379) | struct openwifi_stat {
  type openwifi_priv (line 446) | struct openwifi_priv {

FILE: driver/sdrctl_intf.c
  function openwifi_testmode_cmd (line 5) | static int openwifi_testmode_cmd(struct ieee80211_hw *hw, struct ieee802...

FILE: driver/side_ch/side_ch.c
  type dma_chan (line 43) | struct dma_chan
  type dma_chan (line 44) | struct dma_chan
  function u32 (line 50) | static inline u32 reg_read(u32 reg)
  function reg_write (line 55) | static inline void reg_write(u32 reg, u32 value)
  function SIDE_CH_REG_MULTI_RST_write (line 60) | static inline void SIDE_CH_REG_MULTI_RST_write(u32 Data) {
  function u32 (line 64) | static inline u32 SIDE_CH_REG_CONFIG_read(void){
  function SIDE_CH_REG_CONFIG_write (line 68) | static inline void SIDE_CH_REG_CONFIG_write(u32 value){
  function u32 (line 72) | static inline u32 SIDE_CH_REG_NUM_DMA_SYMBOL_read(void){
  function SIDE_CH_REG_NUM_DMA_SYMBOL_write (line 76) | static inline void SIDE_CH_REG_NUM_DMA_SYMBOL_write(u32 value){
  function u32 (line 80) | static inline u32 SIDE_CH_REG_IQ_CAPTURE_read(void){
  function SIDE_CH_REG_IQ_CAPTURE_write (line 84) | static inline void SIDE_CH_REG_IQ_CAPTURE_write(u32 value){
  function u32 (line 88) | static inline u32 SIDE_CH_REG_NUM_EQ_read(void){
  function SIDE_CH_REG_NUM_EQ_write (line 92) | static inline void SIDE_CH_REG_NUM_EQ_write(u32 value){
  function u32 (line 96) | static inline u32 SIDE_CH_REG_FC_TARGET_read(void){
  function SIDE_CH_REG_FC_TARGET_write (line 100) | static inline void SIDE_CH_REG_FC_TARGET_write(u32 value){
  function u32 (line 104) | static inline u32 SIDE_CH_REG_ADDR1_TARGET_read(void){
  function SIDE_CH_REG_ADDR1_TARGET_write (line 108) | static inline void SIDE_CH_REG_ADDR1_TARGET_write(u32 value){
  function u32 (line 112) | static inline u32 SIDE_CH_REG_ADDR2_TARGET_read(void){
  function SIDE_CH_REG_ADDR2_TARGET_write (line 116) | static inline void SIDE_CH_REG_ADDR2_TARGET_write(u32 value){
  function u32 (line 120) | static inline u32 SIDE_CH_REG_IQ_TRIGGER_read(void){
  function SIDE_CH_REG_IQ_TRIGGER_write (line 124) | static inline void SIDE_CH_REG_IQ_TRIGGER_write(u32 value){
  function u32 (line 128) | static inline u32 SIDE_CH_REG_RSSI_TH_read(void){
  function SIDE_CH_REG_RSSI_TH_write (line 132) | static inline void SIDE_CH_REG_RSSI_TH_write(u32 value){
  function u32 (line 136) | static inline u32 SIDE_CH_REG_GAIN_TH_read(void){
  function SIDE_CH_REG_GAIN_TH_write (line 140) | static inline void SIDE_CH_REG_GAIN_TH_write(u32 value){
  function u32 (line 144) | static inline u32 SIDE_CH_REG_PRE_TRIGGER_LEN_read(void){
  function SIDE_CH_REG_PRE_TRIGGER_LEN_write (line 148) | static inline void SIDE_CH_REG_PRE_TRIGGER_LEN_write(u32 value){
  function u32 (line 152) | static inline u32 SIDE_CH_REG_IQ_LEN_read(void){
  function SIDE_CH_REG_IQ_LEN_write (line 156) | static inline void SIDE_CH_REG_IQ_LEN_write(u32 value){
  function u32 (line 160) | static inline u32 SIDE_CH_REG_M_AXIS_DATA_COUNT_read(void){
  function SIDE_CH_REG_M_AXIS_DATA_COUNT_write (line 164) | static inline void SIDE_CH_REG_M_AXIS_DATA_COUNT_write(u32 value){
  type of_device_id (line 168) | struct of_device_id
  function chan_to_ps_callback (line 174) | static void chan_to_ps_callback(void *completion)
  function chan_to_pl_callback (line 180) | static void chan_to_pl_callback(void *completion)
  function dma_loopback_test (line 185) | static int dma_loopback_test(int num_test, int num_dma_symbol) {
  function init_side_channel (line 339) | static int init_side_channel(void) {
  function get_side_info (line 347) | static int get_side_info(int num_eq, int iq_len) {
  type sock (line 445) | struct sock
  function side_ch_nl_recv_msg (line 446) | static void side_ch_nl_recv_msg(struct sk_buff *skb) {
  function dev_probe (line 521) | static int dev_probe(struct platform_device *pdev) {
  function dev_remove (line 638) | static int dev_remove(struct platform_device *pdev)
  type platform_driver (line 667) | struct platform_driver

FILE: driver/sysfs_intf.c
  function is_valid_iq_number (line 9) | static int is_valid_iq_number(int c) {
  function openwifi_tx_intf_bin_iq_write (line 16) | static ssize_t openwifi_tx_intf_bin_iq_write(struct file *filp, struct k...
  function openwifi_tx_intf_bin_iq_write (line 69) | static ssize_t openwifi_tx_intf_bin_iq_write(struct file *filp, struct k...
  function openwifi_tx_intf_bin_iq_read (line 101) | static ssize_t openwifi_tx_intf_bin_iq_read(struct file *filp, struct ko...
  function tx_intf_iq_ctl_show (line 139) | static ssize_t tx_intf_iq_ctl_show(struct device *input_dev, struct devi...
  function tx_intf_iq_ctl_store (line 147) | static ssize_t tx_intf_iq_ctl_store(struct device *input_dev, struct dev...
  type attribute (line 171) | struct attribute
  type attribute_group (line 175) | struct attribute_group
  function stat_enable_show (line 179) | static ssize_t stat_enable_show(struct device *input_dev, struct device_...
  function stat_enable_store (line 187) | static ssize_t stat_enable_store(struct device *input_dev, struct device...
  function tx_prio_queue_show (line 201) | static ssize_t tx_prio_queue_show(struct device *input_dev, struct devic...
  function tx_prio_queue_store (line 227) | static ssize_t tx_prio_queue_store(struct device *input_dev, struct devi...
  function tx_data_pkt_need_ack_num_total_fail_show (line 257) | static ssize_t tx_data_pkt_need_ack_num_total_fail_show(struct device *i...
  function tx_data_pkt_need_ack_num_total_fail_store (line 265) | static ssize_t tx_data_pkt_need_ack_num_total_fail_store(struct device *...
  function tx_data_pkt_need_ack_num_total_show (line 279) | static ssize_t tx_data_pkt_need_ack_num_total_show(struct device *input_...
  function tx_data_pkt_need_ack_num_total_store (line 287) | static ssize_t tx_data_pkt_need_ack_num_total_store(struct device *input...
  function tx_mgmt_pkt_need_ack_num_total_show (line 301) | static ssize_t tx_mgmt_pkt_need_ack_num_total_show(struct device *input_...
  function tx_mgmt_pkt_need_ack_num_total_store (line 309) | static ssize_t tx_mgmt_pkt_need_ack_num_total_store(struct device *input...
  function tx_mgmt_pkt_need_ack_num_total_fail_show (line 323) | static ssize_t tx_mgmt_pkt_need_ack_num_total_fail_show(struct device *i...
  function tx_mgmt_pkt_need_ack_num_total_fail_store (line 331) | static ssize_t tx_mgmt_pkt_need_ack_num_total_fail_store(struct device *...
  function tx_data_pkt_need_ack_num_retx_show (line 345) | static ssize_t tx_data_pkt_need_ack_num_retx_show(struct device *input_d...
  function tx_data_pkt_need_ack_num_retx_store (line 359) | static ssize_t tx_data_pkt_need_ack_num_retx_store(struct device *input_...
  function tx_mgmt_pkt_need_ack_num_retx_show (line 374) | static ssize_t tx_mgmt_pkt_need_ack_num_retx_show(struct device *input_d...
  function tx_mgmt_pkt_need_ack_num_retx_store (line 385) | static ssize_t tx_mgmt_pkt_need_ack_num_retx_store(struct device *input_...
  function tx_data_pkt_need_ack_num_retx_fail_show (line 400) | static ssize_t tx_data_pkt_need_ack_num_retx_fail_show(struct device *in...
  function tx_data_pkt_need_ack_num_retx_fail_store (line 414) | static ssize_t tx_data_pkt_need_ack_num_retx_fail_store(struct device *i...
  function tx_mgmt_pkt_need_ack_num_retx_fail_show (line 429) | static ssize_t tx_mgmt_pkt_need_ack_num_retx_fail_show(struct device *in...
  function tx_mgmt_pkt_need_ack_num_retx_fail_store (line 440) | static ssize_t tx_mgmt_pkt_need_ack_num_retx_fail_store(struct device *i...
  function tx_data_pkt_mcs_realtime_show (line 455) | static ssize_t tx_data_pkt_mcs_realtime_show(struct device *input_dev, s...
  function tx_data_pkt_mcs_realtime_store (line 466) | static ssize_t tx_data_pkt_mcs_realtime_store(struct device *input_dev, ...
  function tx_mgmt_pkt_mcs_realtime_show (line 480) | static ssize_t tx_mgmt_pkt_mcs_realtime_show(struct device *input_dev, s...
  function tx_mgmt_pkt_mcs_realtime_store (line 491) | static ssize_t tx_mgmt_pkt_mcs_realtime_store(struct device *input_dev, ...
  function tx_mgmt_pkt_fail_mcs_realtime_show (line 505) | static ssize_t tx_mgmt_pkt_fail_mcs_realtime_show(struct device *input_d...
  function tx_mgmt_pkt_fail_mcs_realtime_store (line 516) | static ssize_t tx_mgmt_pkt_fail_mcs_realtime_store(struct device *input_...
  function tx_data_pkt_fail_mcs_realtime_show (line 530) | static ssize_t tx_data_pkt_fail_mcs_realtime_show(struct device *input_d...
  function tx_data_pkt_fail_mcs_realtime_store (line 541) | static ssize_t tx_data_pkt_fail_mcs_realtime_store(struct device *input_...
  function rx_target_sender_mac_addr_show (line 555) | static ssize_t rx_target_sender_mac_addr_show(struct device *input_dev, ...
  function rx_target_sender_mac_addr_store (line 563) | static ssize_t rx_target_sender_mac_addr_store(struct device *input_dev,...
  function rx_data_ok_agc_gain_value_realtime_show (line 577) | static ssize_t rx_data_ok_agc_gain_value_realtime_show(struct device *in...
  function rx_data_ok_agc_gain_value_realtime_store (line 585) | static ssize_t rx_data_ok_agc_gain_value_realtime_store(struct device *i...
  function rx_mgmt_ok_agc_gain_value_realtime_show (line 599) | static ssize_t rx_mgmt_ok_agc_gain_value_realtime_show(struct device *in...
  function rx_mgmt_ok_agc_gain_value_realtime_store (line 607) | static ssize_t rx_mgmt_ok_agc_gain_value_realtime_store(struct device *i...
  function rx_data_fail_agc_gain_value_realtime_show (line 621) | static ssize_t rx_data_fail_agc_gain_value_realtime_show(struct device *...
  function rx_data_fail_agc_gain_value_realtime_store (line 629) | static ssize_t rx_data_fail_agc_gain_value_realtime_store(struct device ...
  function rx_mgmt_fail_agc_gain_value_realtime_show (line 643) | static ssize_t rx_mgmt_fail_agc_gain_value_realtime_show(struct device *...
  function rx_mgmt_fail_agc_gain_value_realtime_store (line 651) | static ssize_t rx_mgmt_fail_agc_gain_value_realtime_store(struct device ...
  function rx_ack_ok_agc_gain_value_realtime_show (line 665) | static ssize_t rx_ack_ok_agc_gain_value_realtime_show(struct device *inp...
  function rx_ack_ok_agc_gain_value_realtime_store (line 673) | static ssize_t rx_ack_ok_agc_gain_value_realtime_store(struct device *in...
  function rx_monitor_all_show (line 687) | static ssize_t rx_monitor_all_show(struct device *input_dev, struct devi...
  function rx_monitor_all_store (line 695) | static ssize_t rx_monitor_all_store(struct device *input_dev, struct dev...
  function rx_data_pkt_num_total_show (line 718) | static ssize_t rx_data_pkt_num_total_show(struct device *input_dev, stru...
  function rx_data_pkt_num_total_store (line 726) | static ssize_t rx_data_pkt_num_total_store(struct device *input_dev, str...
  function rx_data_pkt_num_fail_show (line 740) | static ssize_t rx_data_pkt_num_fail_show(struct device *input_dev, struc...
  function rx_data_pkt_num_fail_store (line 748) | static ssize_t rx_data_pkt_num_fail_store(struct device *input_dev, stru...
  function rx_mgmt_pkt_num_total_show (line 762) | static ssize_t rx_mgmt_pkt_num_total_show(struct device *input_dev, stru...
  function rx_mgmt_pkt_num_total_store (line 770) | static ssize_t rx_mgmt_pkt_num_total_store(struct device *input_dev, str...
  function rx_mgmt_pkt_num_fail_show (line 784) | static ssize_t rx_mgmt_pkt_num_fail_show(struct device *input_dev, struc...
  function rx_mgmt_pkt_num_fail_store (line 792) | static ssize_t rx_mgmt_pkt_num_fail_store(struct device *input_dev, stru...
  function rx_ack_pkt_num_total_show (line 806) | static ssize_t rx_ack_pkt_num_total_show(struct device *input_dev, struc...
  function rx_ack_pkt_num_total_store (line 814) | static ssize_t rx_ack_pkt_num_total_store(struct device *input_dev, stru...
  function rx_ack_pkt_num_fail_show (line 828) | static ssize_t rx_ack_pkt_num_fail_show(struct device *input_dev, struct...
  function rx_ack_pkt_num_fail_store (line 836) | static ssize_t rx_ack_pkt_num_fail_store(struct device *input_dev, struc...
  function rx_data_pkt_mcs_realtime_show (line 850) | static ssize_t rx_data_pkt_mcs_realtime_show(struct device *input_dev, s...
  function rx_data_pkt_mcs_realtime_store (line 858) | static ssize_t rx_data_pkt_mcs_realtime_store(struct device *input_dev, ...
  function rx_data_pkt_fail_mcs_realtime_show (line 872) | static ssize_t rx_data_pkt_fail_mcs_realtime_show(struct device *input_d...
  function rx_data_pkt_fail_mcs_realtime_store (line 880) | static ssize_t rx_data_pkt_fail_mcs_realtime_store(struct device *input_...
  function rx_mgmt_pkt_mcs_realtime_show (line 894) | static ssize_t rx_mgmt_pkt_mcs_realtime_show(struct device *input_dev, s...
  function rx_mgmt_pkt_mcs_realtime_store (line 902) | static ssize_t rx_mgmt_pkt_mcs_realtime_store(struct device *input_dev, ...
  function rx_mgmt_pkt_fail_mcs_realtime_show (line 916) | static ssize_t rx_mgmt_pkt_fail_mcs_realtime_show(struct device *input_d...
  function rx_mgmt_pkt_fail_mcs_realtime_store (line 924) | static ssize_t rx_mgmt_pkt_fail_mcs_realtime_store(struct device *input_...
  function rx_ack_pkt_mcs_realtime_show (line 938) | static ssize_t rx_ack_pkt_mcs_realtime_show(struct device *input_dev, st...
  function rx_ack_pkt_mcs_realtime_store (line 946) | static ssize_t rx_ack_pkt_mcs_realtime_store(struct device *input_dev, s...
  function restrict_freq_mhz_show (line 960) | static ssize_t restrict_freq_mhz_show(struct device *input_dev, struct d...
  function restrict_freq_mhz_store (line 968) | static ssize_t restrict_freq_mhz_store(struct device *input_dev, struct ...
  function csma_cfg0_show (line 990) | static ssize_t csma_cfg0_show(struct device *input_dev, struct device_at...
  function csma_cfg0_store (line 1011) | static ssize_t csma_cfg0_store(struct device *input_dev, struct device_a...
  function cw_max_min_cfg_show (line 1038) | static ssize_t cw_max_min_cfg_show(struct device *input_dev, struct devi...
  function cw_max_min_cfg_store (line 1076) | static ssize_t cw_max_min_cfg_store(struct device *input_dev, struct dev...
  function dbg_ch0_show (line 1094) | static ssize_t dbg_ch0_show(struct device *input_dev, struct device_attr...
  function dbg_ch0_store (line 1102) | static ssize_t dbg_ch0_store(struct device *input_dev, struct device_att...
  function dbg_ch1_show (line 1120) | static ssize_t dbg_ch1_show(struct device *input_dev, struct device_attr...
  function dbg_ch1_store (line 1128) | static ssize_t dbg_ch1_store(struct device *input_dev, struct device_att...
  function dbg_ch2_show (line 1142) | static ssize_t dbg_ch2_show(struct device *input_dev, struct device_attr...
  function dbg_ch2_store (line 1150) | static ssize_t dbg_ch2_store(struct device *input_dev, struct device_att...
  type attribute (line 1212) | struct attribute
  type attribute_group (line 1267) | struct attribute_group

FILE: driver/tx_intf/tx_intf.c
  function u32 (line 29) | static inline u32 reg_read(u32 reg)
  function reg_write (line 34) | static inline void reg_write(u32 reg, u32 value)
  function u32 (line 39) | static inline u32 TX_INTF_REG_MULTI_RST_read(void){
  function u32 (line 43) | static inline u32 TX_INTF_REG_ARBITRARY_IQ_read(void){
  function u32 (line 47) | static inline u32 TX_INTF_REG_WIFI_TX_MODE_read(void){
  function u32 (line 51) | static inline u32 TX_INTF_REG_CTS_TOSELF_CONFIG_read(void){
  function u32 (line 55) | static inline u32 TX_INTF_REG_CSI_FUZZER_read(void){
  function u32 (line 59) | static inline u32 TX_INTF_REG_CTS_TOSELF_WAIT_SIFS_TOP_read(void){
  function u32 (line 63) | static inline u32 TX_INTF_REG_ARBITRARY_IQ_CTL_read(void){
  function u32 (line 67) | static inline u32 TX_INTF_REG_TX_CONFIG_read(void){
  function u32 (line 71) | static inline u32 TX_INTF_REG_NUM_DMA_SYMBOL_TO_PS_read(void){
  function u32 (line 75) | static inline u32 TX_INTF_REG_CFG_DATA_TO_ANT_read(void){
  function u32 (line 79) | static inline u32 TX_INTF_REG_S_AXIS_FIFO_TH_read(void){
  function u32 (line 83) | static inline u32 TX_INTF_REG_TX_HOLD_THRESHOLD_read(void){
  function u32 (line 87) | static inline u32 TX_INTF_REG_INTERRUPT_SEL_read(void){
  function u32 (line 91) | static inline u32 TX_INTF_REG_AMPDU_ACTION_CONFIG_read(void){
  function u32 (line 95) | static inline u32 TX_INTF_REG_BB_GAIN_read(void){
  function u32 (line 99) | static inline u32 TX_INTF_REG_ANT_SEL_read(void){
  function u32 (line 103) | static inline u32 TX_INTF_REG_PHY_HDR_CONFIG_read(void){
  function u32 (line 107) | static inline u32 TX_INTF_REG_S_AXIS_FIFO_NO_ROOM_read(void){
  function u32 (line 111) | static inline u32 TX_INTF_REG_PKT_INFO1_read(void){
  function u32 (line 115) | static inline u32 TX_INTF_REG_PKT_INFO2_read(void){
  function u32 (line 119) | static inline u32 TX_INTF_REG_PKT_INFO3_read(void){
  function u32 (line 123) | static inline u32 TX_INTF_REG_PKT_INFO4_read(void){
  function u32 (line 127) | static inline u32 TX_INTF_REG_QUEUE_FIFO_DATA_COUNT_read(void){
  function TX_INTF_REG_MULTI_RST_write (line 133) | static inline void TX_INTF_REG_MULTI_RST_write(u32 value){
  function TX_INTF_REG_ARBITRARY_IQ_write (line 137) | static inline void TX_INTF_REG_ARBITRARY_IQ_write(u32 value){
  function TX_INTF_REG_WIFI_TX_MODE_write (line 141) | static inline void TX_INTF_REG_WIFI_TX_MODE_write(u32 value){
  function TX_INTF_REG_CTS_TOSELF_CONFIG_write (line 145) | static inline void TX_INTF_REG_CTS_TOSELF_CONFIG_write(u32 value){
  function TX_INTF_REG_CSI_FUZZER_write (line 149) | static inline void TX_INTF_REG_CSI_FUZZER_write(u32 value){
  function TX_INTF_REG_CTS_TOSELF_WAIT_SIFS_TOP_write (line 153) | static inline void TX_INTF_REG_CTS_TOSELF_WAIT_SIFS_TOP_write(u32 value){
  function TX_INTF_REG_ARBITRARY_IQ_CTL_write (line 157) | static inline void TX_INTF_REG_ARBITRARY_IQ_CTL_write(u32 value){
  function TX_INTF_REG_TX_CONFIG_write (line 161) | static inline void TX_INTF_REG_TX_CONFIG_write(u32 value){
  function TX_INTF_REG_NUM_DMA_SYMBOL_TO_PS_write (line 165) | static inline void TX_INTF_REG_NUM_DMA_SYMBOL_TO_PS_write(u32 value){
  function TX_INTF_REG_CFG_DATA_TO_ANT_write (line 169) | static inline void TX_INTF_REG_CFG_DATA_TO_ANT_write(u32 value){
  function TX_INTF_REG_S_AXIS_FIFO_TH_write (line 173) | static inline void TX_INTF_REG_S_AXIS_FIFO_TH_write(u32 value){
  function TX_INTF_REG_TX_HOLD_THRESHOLD_write (line 177) | static inline void TX_INTF_REG_TX_HOLD_THRESHOLD_write(u32 value){
  function TX_INTF_REG_INTERRUPT_SEL_write (line 181) | static inline void TX_INTF_REG_INTERRUPT_SEL_write(u32 value){
  function TX_INTF_REG_AMPDU_ACTION_CONFIG_write (line 185) | static inline void TX_INTF_REG_AMPDU_ACTION_CONFIG_write(u32 value){
  function TX_INTF_REG_BB_GAIN_write (line 189) | static inline void TX_INTF_REG_BB_GAIN_write(u32 value){
  function TX_INTF_REG_ANT_SEL_write (line 193) | static inline void TX_INTF_REG_ANT_SEL_write(u32 value){
  function TX_INTF_REG_PHY_HDR_CONFIG_write (line 197) | static inline void TX_INTF_REG_PHY_HDR_CONFIG_write(u32 value){
  function TX_INTF_REG_S_AXIS_FIFO_NO_ROOM_write (line 201) | static inline void TX_INTF_REG_S_AXIS_FIFO_NO_ROOM_write(u32 value){
  function TX_INTF_REG_PKT_INFO1_write (line 205) | static inline void TX_INTF_REG_PKT_INFO1_write(u32 value){
  function TX_INTF_REG_PKT_INFO2_write (line 209) | static inline void TX_INTF_REG_PKT_INFO2_write(u32 value){
  function TX_INTF_REG_PKT_INFO3_write (line 213) | static inline void TX_INTF_REG_PKT_INFO3_write(u32 value){
  function TX_INTF_REG_PKT_INFO4_write (line 217) | static inline void TX_INTF_REG_PKT_INFO4_write(u32 value){
  type of_device_id (line 221) | struct of_device_id
  type tx_intf_driver_api (line 227) | struct tx_intf_driver_api
  type tx_intf_driver_api (line 228) | struct tx_intf_driver_api
  function u32 (line 231) | static inline u32 hw_init(enum tx_intf_mode mode, u32 tx_config, u32 num...
  function dev_probe (line 365) | static int dev_probe(struct platform_device *pdev)
  function dev_remove (line 458) | static int dev_remove(struct platform_device *pdev)
  type platform_driver (line 470) | struct platform_driver

FILE: driver/xilinx_dma/xilinx_dma.c
  type xilinx_vdma_desc_hw (line 206) | struct xilinx_vdma_desc_hw {
  type xilinx_axidma_desc_hw (line 228) | struct xilinx_axidma_desc_hw {
  type xilinx_cdma_desc_hw (line 251) | struct xilinx_cdma_desc_hw {
  type xilinx_vdma_tx_segment (line 268) | struct xilinx_vdma_tx_segment {
  type xilinx_axidma_tx_segment (line 280) | struct xilinx_axidma_tx_segment {
  type xilinx_cdma_tx_segment (line 292) | struct xilinx_cdma_tx_segment {
  type xilinx_dma_tx_descriptor (line 305) | struct xilinx_dma_tx_descriptor {
  type xilinx_dma_chan (line 350) | struct xilinx_dma_chan {
  type xdma_ip_type (line 397) | enum xdma_ip_type {
  type xilinx_dma_config (line 403) | struct xilinx_dma_config {
  type xilinx_dma_device (line 431) | struct xilinx_dma_device {
  function u32 (line 462) | static inline u32 dma_read(struct xilinx_dma_chan *chan, u32 reg)
  function dma_write (line 467) | static inline void dma_write(struct xilinx_dma_chan *chan, u32 reg, u32 ...
  function vdma_desc_write (line 472) | static inline void vdma_desc_write(struct xilinx_dma_chan *chan, u32 reg,
  function u32 (line 478) | static inline u32 dma_ctrl_read(struct xilinx_dma_chan *chan, u32 reg)
  function dma_ctrl_write (line 483) | static inline void dma_ctrl_write(struct xilinx_dma_chan *chan, u32 reg,
  function dma_ctrl_clr (line 489) | static inline void dma_ctrl_clr(struct xilinx_dma_chan *chan, u32 reg,
  function dma_ctrl_set (line 495) | static inline void dma_ctrl_set(struct xilinx_dma_chan *chan, u32 reg,
  function vdma_desc_write_64 (line 512) | static inline void vdma_desc_write_64(struct xilinx_dma_chan *chan, u32 ...
  function dma_writeq (line 522) | static inline void dma_writeq(struct xilinx_dma_chan *chan, u32 reg, u64...
  function xilinx_write (line 527) | static inline void xilinx_write(struct xilinx_dma_chan *chan, u32 reg,
  function xilinx_axidma_buf (line 536) | static inline void xilinx_axidma_buf(struct xilinx_dma_chan *chan,
  type xilinx_vdma_tx_segment (line 560) | struct xilinx_vdma_tx_segment
  type xilinx_dma_chan (line 561) | struct xilinx_dma_chan
  type xilinx_vdma_tx_segment (line 563) | struct xilinx_vdma_tx_segment
  type xilinx_cdma_tx_segment (line 581) | struct xilinx_cdma_tx_segment
  type xilinx_dma_chan (line 582) | struct xilinx_dma_chan
  type xilinx_cdma_tx_segment (line 584) | struct xilinx_cdma_tx_segment
  type xilinx_axidma_tx_segment (line 602) | struct xilinx_axidma_tx_segment
  type xilinx_dma_chan (line 603) | struct xilinx_dma_chan
  type xilinx_axidma_tx_segment (line 605) | struct xilinx_axidma_tx_segment
  function xilinx_dma_clean_hw_desc (line 620) | static void xilinx_dma_clean_hw_desc(struct xilinx_axidma_desc_hw *hw)
  function xilinx_dma_free_tx_segment (line 636) | static void xilinx_dma_free_tx_segment(struct xilinx_dma_chan *chan,
  function xilinx_cdma_free_tx_segment (line 649) | static void xilinx_cdma_free_tx_segment(struct xilinx_dma_chan *chan,
  function xilinx_vdma_free_tx_segment (line 660) | static void xilinx_vdma_free_tx_segment(struct xilinx_dma_chan *chan,
  type xilinx_dma_tx_descriptor (line 672) | struct xilinx_dma_tx_descriptor
  type xilinx_dma_chan (line 673) | struct xilinx_dma_chan
  type xilinx_dma_tx_descriptor (line 675) | struct xilinx_dma_tx_descriptor
  function xilinx_dma_free_tx_descriptor (line 691) | static void
  function xilinx_dma_free_desc_list (line 731) | static void xilinx_dma_free_desc_list(struct xilinx_dma_chan *chan,
  function xilinx_dma_free_descriptors (line 746) | static void xilinx_dma_free_descriptors(struct xilinx_dma_chan *chan)
  function xilinx_dma_free_chan_resources (line 763) | static void xilinx_dma_free_chan_resources(struct dma_chan *dchan)
  function xilinx_dma_chan_handle_cyclic (line 799) | static void xilinx_dma_chan_handle_cyclic(struct xilinx_dma_chan *chan,
  function xilinx_dma_chan_desc_cleanup (line 819) | static void xilinx_dma_chan_desc_cleanup(struct xilinx_dma_chan *chan)
  function xilinx_dma_do_tasklet (line 857) | static void xilinx_dma_do_tasklet(unsigned long data)
  function xilinx_dma_alloc_chan_resources (line 870) | static int xilinx_dma_alloc_chan_resources(struct dma_chan *dchan)
  function xilinx_dma_tx_status (line 973) | static enum dma_status xilinx_dma_tx_status(struct dma_chan *dchan,
  function xilinx_dma_stop_transfer (line 1019) | static int xilinx_dma_stop_transfer(struct xilinx_dma_chan *chan)
  function xilinx_cdma_stop_transfer (line 1037) | static int xilinx_cdma_stop_transfer(struct xilinx_dma_chan *chan)
  function xilinx_dma_start (line 1050) | static void xilinx_dma_start(struct xilinx_dma_chan *chan)
  function xilinx_vdma_start_transfer (line 1074) | static void xilinx_vdma_start_transfer(struct xilinx_dma_chan *chan)
  function xilinx_cdma_start_transfer (line 1203) | static void xilinx_cdma_start_transfer(struct xilinx_dma_chan *chan)
  function xilinx_dma_start_transfer (line 1275) | static void xilinx_dma_start_transfer(struct xilinx_dma_chan *chan)
  function xilinx_dma_issue_pending (line 1378) | static void xilinx_dma_issue_pending(struct dma_chan *dchan)
  function xilinx_dma_complete_descriptor (line 1394) | static void xilinx_dma_complete_descriptor(struct xilinx_dma_chan *chan)
  function xilinx_dma_reset (line 1416) | static int xilinx_dma_reset(struct xilinx_dma_chan *chan)
  function xilinx_dma_chan_reset (line 1448) | static int xilinx_dma_chan_reset(struct xilinx_dma_chan *chan)
  function irqreturn_t (line 1471) | static irqreturn_t xilinx_dma_irq_handler(int irq, void *data)
  function append_desc_queue (line 1534) | static void append_desc_queue(struct xilinx_dma_chan *chan,
  function dma_cookie_t (line 1589) | static dma_cookie_t xilinx_dma_tx_submit(struct dma_async_tx_descriptor ...
  type dma_async_tx_descriptor (line 1636) | struct dma_async_tx_descriptor
  type dma_chan (line 1637) | struct dma_chan
  type dma_interleaved_template (line 1638) | struct dma_interleaved_template
  type xilinx_dma_chan (line 1641) | struct xilinx_dma_chan
  type xilinx_dma_tx_descriptor (line 1642) | struct xilinx_dma_tx_descriptor
  type xilinx_vdma_tx_segment (line 1643) | struct xilinx_vdma_tx_segment
  type xilinx_vdma_desc_hw (line 1644) | struct xilinx_vdma_desc_hw
  type dma_async_tx_descriptor (line 1719) | struct dma_async_tx_descriptor
  type dma_chan (line 1720) | struct dma_chan
  type xilinx_dma_chan (line 1723) | struct xilinx_dma_chan
  type xilinx_dma_tx_descriptor (line 1724) | struct xilinx_dma_tx_descriptor
  type xilinx_cdma_tx_segment (line 1725) | struct xilinx_cdma_tx_segment
  type xilinx_cdma_desc_hw (line 1726) | struct xilinx_cdma_desc_hw
  type dma_async_tx_descriptor (line 1776) | struct dma_async_tx_descriptor
  type dma_chan (line 1777) | struct dma_chan
  type scatterlist (line 1777) | struct scatterlist
  type scatterlist (line 1778) | struct scatterlist
  type xilinx_dma_chan (line 1781) | struct xilinx_dma_chan
  type xilinx_dma_tx_descriptor (line 1782) | struct xilinx_dma_tx_descriptor
  type xilinx_cdma_tx_segment (line 1783) | struct xilinx_cdma_tx_segment
  type xilinx_cdma_desc_hw (line 1784) | struct xilinx_cdma_desc_hw
  type dma_async_tx_descriptor (line 1886) | struct dma_async_tx_descriptor
  type dma_chan (line 1887) | struct dma_chan
  type scatterlist (line 1887) | struct scatterlist
  type dma_transfer_direction (line 1888) | enum dma_transfer_direction
  type xilinx_dma_chan (line 1891) | struct xilinx_dma_chan
  type xilinx_dma_tx_descriptor (line 1892) | struct xilinx_dma_tx_descriptor
  type xilinx_axidma_tx_segment (line 1893) | struct xilinx_axidma_tx_segment
  type scatterlist (line 1895) | struct scatterlist
  type xilinx_axidma_desc_hw (line 1917) | struct xilinx_axidma_desc_hw
  type dma_async_tx_descriptor (line 1985) | struct dma_async_tx_descriptor
  type dma_chan (line 1986) | struct dma_chan
  type dma_transfer_direction (line 1987) | enum dma_transfer_direction
  type xilinx_dma_chan (line 1990) | struct xilinx_dma_chan
  type xilinx_dma_tx_descriptor (line 1991) | struct xilinx_dma_tx_descriptor
  type xilinx_axidma_tx_segment (line 1992) | struct xilinx_axidma_tx_segment
  type xilinx_axidma_desc_hw (line 2024) | struct xilinx_axidma_desc_hw
  type dma_async_tx_descriptor (line 2092) | struct dma_async_tx_descriptor
  type dma_chan (line 2093) | struct dma_chan
  type dma_interleaved_template (line 2094) | struct dma_interleaved_template
  type xilinx_dma_chan (line 2097) | struct xilinx_dma_chan
  type xilinx_dma_tx_descriptor (line 2098) | struct xilinx_dma_tx_descriptor
  type xilinx_axidma_tx_segment (line 2099) | struct xilinx_axidma_tx_segment
  type xilinx_axidma_desc_hw (line 2100) | struct xilinx_axidma_desc_hw
  function xilinx_dma_terminate_all (line 2173) | static int xilinx_dma_terminate_all(struct dma_chan *dchan)
  function xilinx_vdma_channel_set_config (line 2221) | int xilinx_vdma_channel_set_config(struct dma_chan *dchan,
  function xilinx_dma_chan_remove (line 2283) | static void xilinx_dma_chan_remove(struct xilinx_dma_chan *chan)
  function axidma_clk_init (line 2297) | static int axidma_clk_init(struct platform_device *pdev, struct clk **ax...
  function axicdma_clk_init (line 2360) | static int axicdma_clk_init(struct platform_device *pdev, struct clk **a...
  function axivdma_clk_init (line 2404) | static int axivdma_clk_init(struct platform_device *pdev, struct clk **a...
  function xdma_disable_allclks (line 2477) | static void xdma_disable_allclks(struct xilinx_dma_device *xdev)
  function xilinx_dma_chan_probe (line 2497) | static int xilinx_dma_chan_probe(struct xilinx_dma_device *xdev,
  function xilinx_dma_child_probe (line 2647) | static int xilinx_dma_child_probe(struct xilinx_dma_device *xdev,
  type dma_chan (line 2671) | struct dma_chan
  type of_phandle_args (line 2671) | struct of_phandle_args
  type of_dma (line 2672) | struct of_dma
  type xilinx_dma_device (line 2674) | struct xilinx_dma_device
  type xilinx_dma_config (line 2683) | struct xilinx_dma_config
  type xilinx_dma_config (line 2688) | struct xilinx_dma_config
  type xilinx_dma_config (line 2693) | struct xilinx_dma_config
  type of_device_id (line 2698) | struct of_device_id
  function xilinx_dma_probe (line 2712) | static int xilinx_dma_probe(struct platform_device *pdev)
  function xilinx_dma_remove (line 2889) | static int xilinx_dma_remove(struct platform_device *pdev)
  type platform_driver (line 2907) | struct platform_driver

FILE: driver/xpu/xpu.c
  function u32 (line 31) | static inline u32 reg_read(u32 reg)
  function reg_write (line 36) | static inline void reg_write(u32 reg, u32 value)
  function XPU_REG_MULTI_RST_write (line 41) | static inline void XPU_REG_MULTI_RST_write(u32 Data) {
  function u32 (line 45) | static inline u32 XPU_REG_MULTI_RST_read(void){
  function XPU_REG_SRC_SEL_write (line 49) | static inline void XPU_REG_SRC_SEL_write(u32 Data) {
  function u32 (line 53) | static inline u32 XPU_REG_SRC_SEL_read(void){
  function XPU_REG_RECV_ACK_COUNT_TOP0_write (line 57) | static inline void XPU_REG_RECV_ACK_COUNT_TOP0_write(u32 Data) {
  function u32 (line 61) | static inline u32 XPU_REG_RECV_ACK_COUNT_TOP0_read(void){
  function XPU_REG_RECV_ACK_COUNT_TOP1_write (line 65) | static inline void XPU_REG_RECV_ACK_COUNT_TOP1_write(u32 Data) {
  function u32 (line 69) | static inline u32 XPU_REG_RECV_ACK_COUNT_TOP1_read(void){
  function XPU_REG_SEND_ACK_WAIT_TOP_write (line 73) | static inline void XPU_REG_SEND_ACK_WAIT_TOP_write(u32 Data) {
  function u32 (line 77) | static inline u32 XPU_REG_SEND_ACK_WAIT_TOP_read(void){
  function XPU_REG_FILTER_FLAG_write (line 81) | static inline void XPU_REG_FILTER_FLAG_write(u32 Data) {
  function u32 (line 85) | static inline u32 XPU_REG_FILTER_FLAG_read(void){
  function XPU_REG_CTS_TO_RTS_CONFIG_write (line 89) | static inline void XPU_REG_CTS_TO_RTS_CONFIG_write(u32 Data) {
  function u32 (line 93) | static inline u32 XPU_REG_CTS_TO_RTS_CONFIG_read(void){
  function XPU_REG_MAC_ADDR_LOW_write (line 97) | static inline void XPU_REG_MAC_ADDR_LOW_write(u32 Data) {
  function u32 (line 101) | static inline u32 XPU_REG_MAC_ADDR_LOW_read(void){
  function XPU_REG_MAC_ADDR_HIGH_write (line 105) | static inline void XPU_REG_MAC_ADDR_HIGH_write(u32 Data) {
  function u32 (line 109) | static inline u32 XPU_REG_MAC_ADDR_HIGH_read(void){
  function XPU_REG_BSSID_FILTER_LOW_write (line 113) | static inline void XPU_REG_BSSID_FILTER_LOW_write(u32 Data) {
  function u32 (line 117) | static inline u32 XPU_REG_BSSID_FILTER_LOW_read(void){
  function XPU_REG_BSSID_FILTER_HIGH_write (line 121) | static inline void XPU_REG_BSSID_FILTER_HIGH_write(u32 Data) {
  function u32 (line 125) | static inline u32 XPU_REG_BSSID_FILTER_HIGH_read(void){
  function XPU_REG_BAND_CHANNEL_write (line 129) | static inline void XPU_REG_BAND_CHANNEL_write(u32 Data) {
  function u32 (line 133) | static inline u32 XPU_REG_BAND_CHANNEL_read(void){
  function XPU_REG_DIFS_ADVANCE_write (line 137) | static inline void XPU_REG_DIFS_ADVANCE_write(u32 Data) {
  function u32 (line 141) | static inline u32 XPU_REG_DIFS_ADVANCE_read(void){
  function XPU_REG_FORCE_IDLE_MISC_write (line 145) | static inline void XPU_REG_FORCE_IDLE_MISC_write(u32 Data) {
  function u32 (line 149) | static inline u32 XPU_REG_FORCE_IDLE_MISC_read(void){
  function u32 (line 153) | static inline u32 XPU_REG_TSF_RUNTIME_VAL_LOW_read(void){
  function u32 (line 157) | static inline u32 XPU_REG_TSF_RUNTIME_VAL_HIGH_read(void){
  function XPU_REG_TSF_LOAD_VAL_LOW_write (line 161) | static inline void XPU_REG_TSF_LOAD_VAL_LOW_write(u32 value){
  function XPU_REG_TSF_LOAD_VAL_HIGH_write (line 165) | static inline void XPU_REG_TSF_LOAD_VAL_HIGH_write(u32 value){
  function XPU_REG_TSF_LOAD_VAL_write (line 169) | static inline void XPU_REG_TSF_LOAD_VAL_write(u32 high_value, u32 low_va...
  function XPU_REG_LBT_TH_write (line 175) | static inline void XPU_REG_LBT_TH_write(u32 value) {
  function u32 (line 179) | static inline u32 XPU_REG_RSSI_DB_CFG_read(void){
  function XPU_REG_RSSI_DB_CFG_write (line 183) | static inline void XPU_REG_RSSI_DB_CFG_write(u32 Data) {
  function u32 (line 187) | static inline u32 XPU_REG_LBT_TH_read(void){
  function XPU_REG_CSMA_DEBUG_write (line 191) | static inline void XPU_REG_CSMA_DEBUG_write(u32 value){
  function u32 (line 195) | static inline u32 XPU_REG_CSMA_DEBUG_read(void){
  function XPU_REG_CSMA_CFG_write (line 199) | static inline void XPU_REG_CSMA_CFG_write(u32 value){
  function u32 (line 203) | static inline u32 XPU_REG_CSMA_CFG_read(void){
  function XPU_REG_SLICE_COUNT_TOTAL_write (line 207) | static inline void XPU_REG_SLICE_COUNT_TOTAL_write(u32 value){
  function XPU_REG_SLICE_COUNT_START_write (line 210) | static inline void XPU_REG_SLICE_COUNT_START_write(u32 value){
  function XPU_REG_SLICE_COUNT_END_write (line 213) | static inline void XPU_REG_SLICE_COUNT_END_write(u32 value){
  function u32 (line 218) | static inline u32 XPU_REG_SLICE_COUNT_TOTAL_read(void){
  function u32 (line 221) | static inline u32 XPU_REG_SLICE_COUNT_START_read(void){
  function u32 (line 224) | static inline u32 XPU_REG_SLICE_COUNT_END_read(void){
  function XPU_REG_BB_RF_DELAY_write (line 228) | static inline void XPU_REG_BB_RF_DELAY_write(u32 value){
  function XPU_REG_ACK_CTL_MAX_NUM_RETRANS_write (line 232) | static inline void XPU_REG_ACK_CTL_MAX_NUM_RETRANS_write(u32 value){
  function u32 (line 235) | static inline u32 XPU_REG_ACK_CTL_MAX_NUM_RETRANS_read(void){
  function XPU_REG_AMPDU_ACTION_write (line 239) | static inline void XPU_REG_AMPDU_ACTION_write(u32 Data) {
  function u32 (line 243) | static inline u32 XPU_REG_AMPDU_ACTION_read(void){
  function XPU_REG_SPI_DISABLE_write (line 247) | static inline void XPU_REG_SPI_DISABLE_write(u32 Data) {
  function u32 (line 251) | static inline u32 XPU_REG_SPI_DISABLE_read(void){
  function XPU_REG_MAC_ADDR_write (line 255) | static inline void XPU_REG_MAC_ADDR_write(u8 *mac_addr) {//, u32 en_flag){
  type of_device_id (line 267) | struct of_device_id
  type xpu_driver_api (line 273) | struct xpu_driver_api
  type xpu_driver_api (line 274) | struct xpu_driver_api
  function u32 (line 277) | static inline u32 hw_init(enum xpu_mode mode){
  function dev_probe (line 405) | static int dev_probe(struct platform_device *pdev)
  function dev_remove (line 532) | static int dev_remove(struct platform_device *pdev)
  type platform_driver (line 544) | struct platform_driver

FILE: user_space/fast_reg_log/fast_reg_log.c
  function main (line 15) | int main()

FILE: user_space/inject_80211/analyze_80211.c
  type RECORD_t (line 27) | struct RECORD_t
  function main (line 40) | int main(int argc, char **argv)

FILE: user_space/inject_80211/ieee80211_radiotap.h
  type ieee80211_radiotap_header (line 26) | struct ieee80211_radiotap_header {
  type ieee80211_radiotap_presence (line 52) | enum ieee80211_radiotap_presence {
  type ieee80211_radiotap_flags (line 88) | enum ieee80211_radiotap_flags {
  type ieee80211_radiotap_channel_flags (line 99) | enum ieee80211_radiotap_channel_flags {
  type ieee80211_radiotap_rx_flags (line 110) | enum ieee80211_radiotap_rx_flags {
  type ieee80211_radiotap_tx_flags (line 115) | enum ieee80211_radiotap_tx_flags {
  type ieee80211_radiotap_mcs_have (line 124) | enum ieee80211_radiotap_mcs_have {
  type ieee80211_radiotap_mcs_flags (line 133) | enum ieee80211_radiotap_mcs_flags {
  type ieee80211_radiotap_ampdu_flags (line 151) | enum ieee80211_radiotap_ampdu_flags {
  type ieee80211_radiotap_vht_known (line 163) | enum ieee80211_radiotap_vht_known {
  type ieee80211_radiotap_vht_flags (line 175) | enum ieee80211_radiotap_vht_flags {
  type ieee80211_radiotap_vht_coding (line 184) | enum ieee80211_radiotap_vht_coding {
  type ieee80211_radiotap_timestamp_unit_spos (line 192) | enum ieee80211_radiotap_timestamp_unit_spos {
  type ieee80211_radiotap_timestamp_flags (line 205) | enum ieee80211_radiotap_timestamp_flags {
  type ieee80211_radiotap_he (line 211) | struct ieee80211_radiotap_he {
  type ieee80211_radiotap_he_bits (line 215) | enum ieee80211_radiotap_he_bits {
  type ieee80211_radiotap_he_mu (line 305) | struct ieee80211_radiotap_he_mu {
  type ieee80211_radiotap_he_mu_bits (line 311) | enum ieee80211_radiotap_he_mu_bits {
  type ieee80211_radiotap_lsig_data1 (line 337) | enum ieee80211_radiotap_lsig_data1 {
  type ieee80211_radiotap_lsig_data2 (line 342) | enum ieee80211_radiotap_lsig_data2 {
  type ieee80211_radiotap_lsig (line 347) | struct ieee80211_radiotap_lsig {
  type ieee80211_radiotap_zero_len_psdu_type (line 351) | enum ieee80211_radiotap_zero_len_psdu_type {

FILE: user_space/inject_80211/inject_80211.c
  function gen_rand_str (line 96) | void gen_rand_str(int size, char *rand_char)
  function assign_mac_addr (line 120) | void assign_mac_addr(u64 a, u8 *hdr)
  function usage (line 132) | void usage(void)
  function main (line 163) | int main(int argc, char *argv[])

FILE: user_space/inject_80211/inject_80211.h
  type u64 (line 15) | typedef unsigned long long int u64;
  type u32 (line 16) | typedef unsigned int u32;
  type u16 (line 17) | typedef unsigned short u16;
  type u8 (line 18) | typedef unsigned char u8;
  type u32 (line 19) | typedef u32 __le32;

FILE: user_space/inject_80211/radiotap.c
  type radiotap_align_size (line 52) | struct radiotap_align_size {
  type ieee80211_radiotap_namespace (line 56) | struct ieee80211_radiotap_namespace {
  type ieee80211_radiotap_vendor_namespaces (line 63) | struct ieee80211_radiotap_vendor_namespaces {
  type radiotap_align_size (line 71) | struct radiotap_align_size
  type ieee80211_radiotap_namespace (line 98) | struct ieee80211_radiotap_namespace
  function ieee80211_radiotap_iterator_init (line 143) | int ieee80211_radiotap_iterator_init(
  function find_ns (line 215) | static void find_ns(struct ieee80211_radiotap_iterator *iterator,
  function ieee80211_radiotap_iterator_next (line 261) | int ieee80211_radiotap_iterator_next(

FILE: user_space/inject_80211/radiotap.h
  type ieee80211_radiotap_iterator (line 33) | struct ieee80211_radiotap_iterator {
  type ieee80211_radiotap_iterator (line 54) | struct ieee80211_radiotap_iterator
  type ieee80211_radiotap_header (line 55) | struct ieee80211_radiotap_header
  type ieee80211_radiotap_vendor_namespaces (line 56) | struct ieee80211_radiotap_vendor_namespaces
  type ieee80211_radiotap_iterator (line 59) | struct ieee80211_radiotap_iterator

FILE: user_space/inject_80211/unaligned.h
  function u16 (line 22) | static inline u16 get_unaligned_le16(const void *p)
  function u16 (line 28) | static inline u16 get_unaligned_be16(const void *p)
  function put_unaligned_le16 (line 34) | static inline void put_unaligned_le16(u16 val, void *p)
  function put_unaligned_be16 (line 41) | static inline void put_unaligned_be16(u16 val, void *p)

FILE: user_space/inject_80211/uthash.h
  type UT_hash_bucket (line 880) | typedef struct UT_hash_bucket {
  type UT_hash_table (line 904) | typedef struct UT_hash_table {
  type UT_hash_handle (line 937) | typedef struct UT_hash_handle {

FILE: user_space/sdrctl_src/cmd.c
  function cb_reg_handler (line 21) | static int cb_reg_handler(struct nl_msg *msg, void *arg)
  function handle_set_reg (line 42) | static int handle_set_reg(struct nl80211_state *state,
  function handle_get_reg (line 109) | static int handle_get_reg(struct nl80211_state *state,
  function cb_openwifi_rssi_th_handler (line 167) | static int cb_openwifi_rssi_th_handler(struct nl_msg *msg, void *arg)
  function handle_set_rssi_th (line 185) | static int handle_set_rssi_th(struct nl80211_state *state,
  function handle_set_tsf (line 221) | static int handle_set_tsf(struct nl80211_state *state,
  function handle_get_rssi_th (line 286) | static int handle_get_rssi_th(struct nl80211_state *state,
  function cb_openwifi_slice_total_handler (line 310) | static int cb_openwifi_slice_total_handler(struct nl_msg *msg, void *arg)
  function handle_set_slice_total (line 330) | static int handle_set_slice_total(struct nl80211_state *state,
  function handle_get_slice_total (line 365) | static int handle_get_slice_total(struct nl80211_state *state,
  function cb_openwifi_slice_start_handler (line 467) | static int cb_openwifi_slice_start_handler(struct nl_msg *msg, void *arg)
  function handle_set_slice_start (line 487) | static int handle_set_slice_start(struct nl80211_state *state,
  function handle_get_slice_start (line 522) | static int handle_get_slice_start(struct nl80211_state *state,
  function cb_openwifi_slice_end_handler (line 625) | static int cb_openwifi_slice_end_handler(struct nl_msg *msg, void *arg)
  function handle_set_slice_end (line 645) | static int handle_set_slice_end(struct nl80211_state *state,
  function handle_get_slice_end (line 680) | static int handle_get_slice_end(struct nl80211_state *state,
  function cb_openwifi_slice_idx_handler (line 783) | static int cb_openwifi_slice_idx_handler(struct nl_msg *msg, void *arg)
  function handle_set_slice_idx (line 801) | static int handle_set_slice_idx(struct nl80211_state *state,
  function handle_get_slice_idx (line 840) | static int handle_get_slice_idx(struct nl80211_state *state,
  function cb_openwifi_slice_target_mac_addr_handler (line 864) | static int cb_openwifi_slice_target_mac_addr_handler(struct nl_msg *msg,...
  function handle_set_slice_target_mac_addr (line 882) | static int handle_set_slice_target_mac_addr(struct nl80211_state *state,
  function handle_get_slice_target_mac_addr (line 915) | static int handle_get_slice_target_mac_addr(struct nl80211_state *state,
  function cb_openwifi_gap_handler (line 939) | static int cb_openwifi_gap_handler(struct nl_msg *msg, void *arg)
  function handle_set_gap (line 957) | static int handle_set_gap(struct nl80211_state *state,
  function handle_get_gap (line 988) | static int handle_get_gap(struct nl80211_state *state,

FILE: user_space/sdrctl_src/nl80211.h
  type nl80211_commands (line 990) | enum nl80211_commands {
  type nl80211_attrs (line 2147) | enum nl80211_attrs {
  type nl80211_iftype (line 2656) | enum nl80211_iftype {
  type nl80211_sta_flags (line 2700) | enum nl80211_sta_flags {
  type nl80211_sta_p2p_ps_status (line 2722) | enum nl80211_sta_p2p_ps_status {
  type nl80211_sta_flag_update (line 2738) | struct nl80211_sta_flag_update {
  type nl80211_rate_info (line 2777) | enum nl80211_rate_info {
  type nl80211_sta_bss_param (line 2814) | enum nl80211_sta_bss_param {
  type nl80211_sta_info (line 2892) | enum nl80211_sta_info {
  type nl80211_tid_stats (line 2947) | enum nl80211_tid_stats {
  type nl80211_mpath_flags (line 2969) | enum nl80211_mpath_flags {
  type nl80211_mpath_info (line 2996) | enum nl80211_mpath_info {
  type nl80211_band_attr (line 3029) | enum nl80211_band_attr {
  type nl80211_frequency_attr (line 3107) | enum nl80211_frequency_attr {
  type nl80211_bitrate_attr (line 3149) | enum nl80211_bitrate_attr {
  type nl80211_reg_initiator (line 3175) | enum nl80211_reg_initiator {
  type nl80211_reg_type (line 3198) | enum nl80211_reg_type {
  type nl80211_reg_rule_attr (line 3230) | enum nl80211_reg_rule_attr {
  type nl80211_sched_scan_match_attr (line 3275) | enum nl80211_sched_scan_match_attr {
  type nl80211_reg_rule_flags (line 3315) | enum nl80211_reg_rule_flags {
  type nl80211_dfs_regions (line 3351) | enum nl80211_dfs_regions {
  type nl80211_user_reg_hint_type (line 3375) | enum nl80211_user_reg_hint_type {
  type nl80211_survey_info (line 3408) | enum nl80211_survey_info {
  type nl80211_mntr_flags (line 3452) | enum nl80211_mntr_flags {
  type nl80211_mesh_power_mode (line 3484) | enum nl80211_mesh_power_mode {
  type nl80211_meshconf_params (line 3602) | enum nl80211_meshconf_params {
  type nl80211_mesh_setup_params (line 3687) | enum nl80211_mesh_setup_params {
  type nl80211_txq_attr (line 3717) | enum nl80211_txq_attr {
  type nl80211_ac (line 3730) | enum nl80211_ac {
  type nl80211_channel_type (line 3754) | enum nl80211_channel_type {
  type nl80211_chan_width (line 3780) | enum nl80211_chan_width {
  type nl80211_bss_scan_width (line 3800) | enum nl80211_bss_scan_width {
  type nl80211_bss (line 3855) | enum nl80211_bss {
  type nl80211_bss_status (line 3893) | enum nl80211_bss_status {
  type nl80211_auth_type (line 3916) | enum nl80211_auth_type {
  type nl80211_key_type (line 3939) | enum nl80211_key_type {
  type nl80211_mfp (line 3952) | enum nl80211_mfp {
  type nl80211_wpa_versions (line 3957) | enum nl80211_wpa_versions {
  type nl80211_key_default_types (line 3971) | enum nl80211_key_default_types {
  type nl80211_key_attributes (line 4001) | enum nl80211_key_attributes {
  type nl80211_tx_rate_attributes (line 4032) | enum nl80211_tx_rate_attributes {
  type nl80211_txrate_vht (line 4051) | struct nl80211_txrate_vht {
  type nl80211_txrate_gi (line 4055) | enum nl80211_txrate_gi {
  type nl80211_band (line 4069) | enum nl80211_band {
  type nl80211_ps_state (line 4082) | enum nl80211_ps_state {
  type nl80211_attr_cqm (line 4120) | enum nl80211_attr_cqm {
  type nl80211_cqm_rssi_threshold_event (line 4145) | enum nl80211_cqm_rssi_threshold_event {
  type nl80211_tx_power_setting (line 4158) | enum nl80211_tx_power_setting {
  type nl80211_packet_pattern_attr (line 4185) | enum nl80211_packet_pattern_attr {
  type nl80211_pattern_support (line 4208) | struct nl80211_pattern_support {
  type nl80211_wowlan_triggers (line 4313) | enum nl80211_wowlan_triggers {
  type nl80211_wowlan_tcp_data_seq (line 4373) | struct nl80211_wowlan_tcp_data_seq {
  type nl80211_wowlan_tcp_data_token (line 4384) | struct nl80211_wowlan_tcp_data_token {
  type nl80211_wowlan_tcp_data_token_feature (line 4395) | struct nl80211_wowlan_tcp_data_token_feature {
  type nl80211_wowlan_tcp_attrs (line 4431) | enum nl80211_wowlan_tcp_attrs {
  type nl80211_coalesce_rule_support (line 4459) | struct nl80211_coalesce_rule_support {
  type nl80211_attr_coalesce_rule (line 4476) | enum nl80211_attr_coalesce_rule {
  type nl80211_coalesce_condition (line 4494) | enum nl80211_coalesce_condition {
  type nl80211_iface_limit_attrs (line 4509) | enum nl80211_iface_limit_attrs {
  type nl80211_if_combination_attrs (line 4568) | enum nl80211_if_combination_attrs {
  type nl80211_plink_state (line 4602) | enum nl80211_plink_state {
  type plink_actions (line 4624) | enum plink_actions {
  type nl80211_rekey_data (line 4646) | enum nl80211_rekey_data {
  type nl80211_hidden_ssid (line 4666) | enum nl80211_hidden_ssid {
  type nl80211_sta_wme_attr (line 4682) | enum nl80211_sta_wme_attr {
  type nl80211_pmksa_candidate_attr (line 4704) | enum nl80211_pmksa_candidate_attr {
  type nl80211_tdls_operation (line 4723) | enum nl80211_tdls_operation {
  type nl80211_feature_flags (line 4832) | enum nl80211_feature_flags {
  type nl80211_ext_feature_index (line 4922) | enum nl80211_ext_feature_index {
  type nl80211_probe_resp_offload_support_attr (line 4960) | enum nl80211_probe_resp_offload_support_attr {
  type nl80211_connect_failed_reason (line 4973) | enum nl80211_connect_failed_reason {
  type nl80211_timeout_reason (line 4986) | enum nl80211_timeout_reason {
  type nl80211_scan_flags (line 5017) | enum nl80211_scan_flags {
  type nl80211_acl_policy (line 5037) | enum nl80211_acl_policy {
  type nl80211_smps_mode (line 5052) | enum nl80211_smps_mode {
  type nl80211_radar_event (line 5080) | enum nl80211_radar_event {
  type nl80211_dfs_state (line 5099) | enum nl80211_dfs_state {
  type nl80211_protocol_features (line 5113) | enum nl80211_protocol_features {
  type nl80211_crit_proto_id (line 5126) | enum nl80211_crit_proto_id {
  type nl80211_rxmgmt_flags (line 5145) | enum nl80211_rxmgmt_flags {
  type nl80211_vendor_cmd_info (line 5164) | struct nl80211_vendor_cmd_info {
  type nl80211_tdls_peer_capability (line 5179) | enum nl80211_tdls_peer_capability {
  type nl80211_sched_scan_plan (line 5198) | enum nl80211_sched_scan_plan {
  type nl80211_bss_select_rssi_adjust (line 5216) | struct nl80211_bss_select_rssi_adjust {
  type nl80211_bss_select_attr (line 5243) | enum nl80211_bss_select_attr {
  type nl80211_nan_function_type (line 5263) | enum nl80211_nan_function_type {
  type nl80211_nan_publish_type (line 5281) | enum nl80211_nan_publish_type {
  type nl80211_nan_func_term_reason (line 5295) | enum nl80211_nan_func_term_reason {
  type nl80211_nan_func_attributes (line 5347) | enum nl80211_nan_func_attributes {
  type nl80211_nan_srf_attributes (line 5386) | enum nl80211_nan_srf_attributes {
  type nl80211_nan_match_attributes (line 5411) | enum nl80211_nan_match_attributes {

FILE: user_space/sdrctl_src/nl80211_testmode_def.h
  type openwifi_testmode_attr (line 8) | enum openwifi_testmode_attr {
  type openwifi_testmode_cmd (line 32) | enum openwifi_testmode_cmd {
  type nla_policy (line 69) | struct nla_policy

FILE: user_space/sdrctl_src/sdrctl.c
  type nl_handle (line 30) | struct nl_handle
  function nl_socket_free (line 35) | static inline void nl_socket_free(struct nl_sock *h)
  function nl_socket_set_buffer_size (line 40) | static inline int nl_socket_set_buffer_size(struct nl_sock *sk,
  function nl80211_init (line 49) | static int nl80211_init(struct nl80211_state *state)
  function nl80211_cleanup (line 81) | static void nl80211_cleanup(struct nl80211_state *state)
  type cmd (line 88) | struct cmd
  type cmd (line 89) | struct cmd
  function __usage_cmd (line 96) | static void __usage_cmd(const struct cmd *cmd, char *indent, bool full)
  function usage_options (line 177) | static void usage_options(void)
  function usage (line 185) | static void usage(int argc, char **argv)
  function print_help (line 232) | static int print_help(struct nl80211_state *state,
  function usage_cmd (line 244) | static void usage_cmd(const struct cmd *cmd)
  function version (line 251) | static void version(void)
  function phy_lookup (line 256) | static int phy_lookup(char *name)
  function error_handler (line 276) | static int error_handler(struct sockaddr_nl *nla, struct nlmsgerr *err,
  function finish_handler (line 284) | static int finish_handler(struct nl_msg *msg, void *arg)
  function ack_handler (line 291) | static int ack_handler(struct nl_msg *msg, void *arg)
  function __handle_cmd (line 298) | static int __handle_cmd(struct nl80211_state *state, enum id_input idby,
  function handle_cmd (line 491) | int handle_cmd(struct nl80211_state *state, enum id_input idby,
  function main (line 497) | int main(int argc, char **argv)

FILE: user_space/sdrctl_src/sdrctl.h
  type nl80211_state (line 27) | struct nl80211_state {
  type command_identify_by (line 32) | enum command_identify_by {
  type id_input (line 39) | enum id_input {
  type cmd (line 47) | struct cmd {
  type nl80211_state (line 123) | struct nl80211_state
  type id_input (line 123) | enum id_input
  type print_event_args (line 126) | struct print_event_args {
  type nl80211_state (line 132) | struct nl80211_state
  type nl80211_state (line 134) | struct nl80211_state
  type nl80211_state (line 135) | struct nl80211_state
  type print_event_args (line 137) | struct print_event_args
  type nl_msg (line 146) | struct nl_msg
  type nl80211_chan_width (line 154) | enum nl80211_chan_width
  type nl80211_iftype (line 155) | enum nl80211_iftype
  type nl80211_commands (line 156) | enum nl80211_commands
  type nl80211_band (line 157) | enum nl80211_band
  type nl_sock (line 162) | struct nl_sock
  type print_ie_type (line 169) | enum print_ie_type {
  type print_ie_type (line 177) | enum print_ie_type
  type nlattr (line 179) | struct nlattr

FILE: user_space/side_ch_ctl_src/iq_capture.py
  function display_iq (line 13) | def display_iq(iq_capture, agc_gain, rssi_half_db, ch_idle, demod, tx_rf...
  function parse_iq (line 58) | def parse_iq(iq, iq_len):

FILE: user_space/side_ch_ctl_src/iq_capture_2ant.py
  function display_iq (line 11) | def display_iq(iq0_capture, iq1_capture):
  function parse_iq (line 32) | def parse_iq(iq, iq_len):

FILE: user_space/side_ch_ctl_src/iq_capture_freq_offset.py
  function phase_offset_to_freq_offset (line 44) | def phase_offset_to_freq_offset(phase_offset):
  function plot_agc_gain (line 48) | def plot_agc_gain(agc_gain):
  function plot_phase_offset (line 72) | def plot_phase_offset(phase_offset_fpga, phase_offset_ltf):
  function ltf_freq_offset_estimation (line 90) | def ltf_freq_offset_estimation(iq_capture, start_idx_demod_is_ongoing):
  function parse_iq (line 176) | def parse_iq(iq, iq_len):

FILE: user_space/side_ch_ctl_src/side_ch_ctl.c
  type sockaddr_nl (line 26) | struct sockaddr_nl
  type nlmsghdr (line 27) | struct nlmsghdr
  type iovec (line 28) | struct iovec
  type msghdr (line 30) | struct msghdr
  function take_reg_idx_string_for_write (line 48) | int take_reg_idx_string_for_write(char *para) { // return into tmp_str t...
  function take_reg_val_string_for_write (line 68) | int take_reg_val_string_for_write(char *para) {
  function all_zero_in_string (line 84) | int all_zero_in_string(char *para) {
  function atoi_my (line 101) | long int atoi_my(char *para) {
  function hextoi_my (line 118) | long int hextoi_my(char *para) {
  function parse_para_string (line 140) | int parse_para_string(char *para, int *action_flag, int *reg_type, int *...
  function print_usage (line 268) | void print_usage(void) {
  function sigint_callback_handler (line 279) | void sigint_callback_handler(int signum)
  function main (line 285) | int main(const int argc, char * const argv[])

FILE: user_space/side_ch_ctl_src/side_info_display.py
  function display_side_info (line 13) | def display_side_info(freq_offset, csi, equalizer, waterfall_flag):
  function parse_side_info (line 107) | def parse_side_info(side_info, num_eq):
Condensed preview — 233 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,139K chars).
[
  {
    "path": ".github/ISSUE_TEMPLATE/issue-description.md",
    "chars": 761,
    "preview": "---\nname: Issue description\nabout: Please report issue by this template\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n0. Coul"
  },
  {
    "path": ".gitmodules",
    "chars": 196,
    "preview": "[submodule \"adi-linux\"]\n\tpath = adi-linux\n\turl = https://github.com/analogdevicesinc/linux.git\n[submodule \"adi-linux-64\""
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 479,
    "preview": "<!--\nAuthor: Xianjun jiao\nSPDX-FileCopyrightText: 2019 UGent\nSPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\nCLA([Indivi"
  },
  {
    "path": "LICENSE",
    "chars": 34520,
    "preview": "                    GNU AFFERO GENERAL PUBLIC LICENSE\n                       Version 3, 19 November 2007\n\n Copyright (C)"
  },
  {
    "path": "LICENSES/AGPL-3.0-or-later.txt",
    "chars": 34520,
    "preview": "                    GNU AFFERO GENERAL PUBLIC LICENSE\n                       Version 3, 19 November 2007\n\n Copyright (C)"
  },
  {
    "path": "LICENSES/BSD-3-Clause.txt",
    "chars": 1598,
    "preview": "Modified BSD license (no advertisement clause):\n\nCopyright (c) 2002-2017, Jouni Malinen <j@w1.fi> and contributors\nAll R"
  },
  {
    "path": "LICENSES/GPL-2.0-or-later.txt",
    "chars": 18560,
    "preview": "\nGNU GENERAL PUBLIC LICENSE\nVersion 2, June 1991\n\nCopyright (C) 1989, 1991 Free Software Foundation, Inc.\n51 Franklin St"
  },
  {
    "path": "LICENSES/ISC.txt",
    "chars": 723,
    "preview": "Copyright <YEAR> <OWNER>\n\nPermission to use, copy, modify, and/or distribute this software for any purpose with or witho"
  },
  {
    "path": "README.md",
    "chars": 20589,
    "preview": "<!--\nAuthor: Xianjun jiao, Michael Mehari, Wei Liu\nSPDX-FileCopyrightText: 2019 UGent\nSPDX-License-Identifier: AGPL-3.0-"
  },
  {
    "path": "doc/README.md",
    "chars": 36581,
    "preview": "<!--\nAuthor: Xianjun jiao, Michael Mehari, Wei Liu\nSPDX-FileCopyrightText: 2019 UGent\nSPDX-License-Identifier: AGPL-3.0-"
  },
  {
    "path": "doc/app_notes/40mhz.png.license",
    "chars": 106,
    "preview": "# Author: Xianjun jiao\n\n# SPDX-FileCopyrightText: 2019 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later\n"
  },
  {
    "path": "doc/app_notes/README.md",
    "chars": 1642,
    "preview": "<!--\nAuthor: Xianjun jiao\nSPDX-FileCopyrightText: 2019 UGent\nSPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\nApplication"
  },
  {
    "path": "doc/app_notes/ad-hoc-two-sdr.md",
    "chars": 2475,
    "preview": "<!--\nAuthor: Xianjun jiao\nSPDX-FileCopyrightText: 2019 UGent\nSPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n**NOTE** th"
  },
  {
    "path": "doc/app_notes/ap-client-two-sdr.md",
    "chars": 3101,
    "preview": "<!--\nAuthor: Xianjun jiao\nSPDX-FileCopyrightText: 2019 UGent\nSPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n**NOTE** th"
  },
  {
    "path": "doc/app_notes/csi-architecture.jpg.license",
    "chars": 106,
    "preview": "# Author: Xianjun jiao\n\n# SPDX-FileCopyrightText: 2019 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later\n"
  },
  {
    "path": "doc/app_notes/csi-information-format.jpg.license",
    "chars": 106,
    "preview": "# Author: Xianjun jiao\n\n# SPDX-FileCopyrightText: 2019 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later\n"
  },
  {
    "path": "doc/app_notes/csi-screen-shot.jpg.license",
    "chars": 106,
    "preview": "# Author: Xianjun jiao\n\n# SPDX-FileCopyrightText: 2019 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later\n"
  },
  {
    "path": "doc/app_notes/csi.md",
    "chars": 6856,
    "preview": "<!--\nAuthor: Xianjun jiao\nSPDX-FileCopyrightText: 2019 UGent\nSPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n\nWe extend "
  },
  {
    "path": "doc/app_notes/csi_fuzzer.md",
    "chars": 1975,
    "preview": "<!--\nAuthor: Xianjun jiao\nSPDX-FileCopyrightText: 2021 UGent\nSPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n- [ACM WiSe"
  },
  {
    "path": "doc/app_notes/driver_stat.md",
    "chars": 7575,
    "preview": "Comprehensive statistics are offered at the driver level via the [Linux sysfs](https://en.wikipedia.org/wiki/Sysfs#:~:te"
  },
  {
    "path": "doc/app_notes/drv_fpga_dynamic_loading.md",
    "chars": 5270,
    "preview": "The **wgd.sh** (running on board) supports reloading driver and/or FPGA image dynamically without rebooting/power-cycle."
  },
  {
    "path": "doc/app_notes/frequent_trick.md",
    "chars": 13498,
    "preview": "Some usual/frequent control trick over the openwifi FPGA. You need to do these controls on board in the openwifi directo"
  },
  {
    "path": "doc/app_notes/guard-interval.png.license",
    "chars": 108,
    "preview": "# Author: Michael Mehari\n\n# SPDX-FileCopyrightText: 2019 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later\n"
  },
  {
    "path": "doc/app_notes/hls.md",
    "chars": 3420,
    "preview": "<!--\nAuthor: Thijs Havinga\nSPDX-FileCopyrightText: 2019 UGent\nSPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\nFCCM2023 P"
  },
  {
    "path": "doc/app_notes/ieee80211n.md",
    "chars": 2491,
    "preview": "<!--\nAuthor: Michael Mehari\nSPDX-FileCopyrightText: 2019 UGent\nSPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n## IEEE 8"
  },
  {
    "path": "doc/app_notes/inject_80211.md",
    "chars": 6284,
    "preview": "<!--\nAuthor: Michael Mehari, Xianjun Jiao\nSPDX-FileCopyrightText: 2019 UGent\nSPDX-License-Identifier: AGPL-3.0-or-later\n"
  },
  {
    "path": "doc/app_notes/iq-architecture.jpg.license",
    "chars": 106,
    "preview": "# Author: Xianjun jiao\n\n# SPDX-FileCopyrightText: 2019 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later\n"
  },
  {
    "path": "doc/app_notes/iq-capture-parameter.jpg.license",
    "chars": 106,
    "preview": "# Author: Xianjun jiao\n\n# SPDX-FileCopyrightText: 2019 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later\n"
  },
  {
    "path": "doc/app_notes/iq-information-format.jpg.license",
    "chars": 106,
    "preview": "# Author: Xianjun jiao\n\n# SPDX-FileCopyrightText: 2019 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later\n"
  },
  {
    "path": "doc/app_notes/iq-screen-shot.jpg.license",
    "chars": 106,
    "preview": "# Author: Xianjun jiao\n\n# SPDX-FileCopyrightText: 2019 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later\n"
  },
  {
    "path": "doc/app_notes/iq.md",
    "chars": 13489,
    "preview": "<!--\nAuthor: Xianjun jiao\nSPDX-FileCopyrightText: 2019 UGent\nSPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n\nWe impleme"
  },
  {
    "path": "doc/app_notes/iq_2ant-screen-shot.jpg.license",
    "chars": 106,
    "preview": "# Author: Xianjun jiao\n\n# SPDX-FileCopyrightText: 2019 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later\n"
  },
  {
    "path": "doc/app_notes/iq_2ant-setup.png.license",
    "chars": 106,
    "preview": "# Author: Xianjun jiao\n\n# SPDX-FileCopyrightText: 2019 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later\n"
  },
  {
    "path": "doc/app_notes/iq_2ant.md",
    "chars": 6650,
    "preview": "<!--\nAuthor: Xianjun jiao\nSPDX-FileCopyrightText: 2019 UGent\nSPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n\nInstead of"
  },
  {
    "path": "doc/app_notes/iq_ack_timing.md",
    "chars": 5803,
    "preview": "<!--\nAuthor: Xianjun jiao\nSPDX-FileCopyrightText: 2023 UGent\nSPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\nThsi app no"
  },
  {
    "path": "doc/app_notes/mimo.png.license",
    "chars": 109,
    "preview": "# Author: Michael Mehari\n\n# SPDX-FileCopyrightText: 2019 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later\n\n"
  },
  {
    "path": "doc/app_notes/mpdu-aggr.png.license",
    "chars": 109,
    "preview": "# Author: Michael Mehari\n\n# SPDX-FileCopyrightText: 2019 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later\n\n"
  },
  {
    "path": "doc/app_notes/packet-iq-self-loopback-test.md",
    "chars": 8020,
    "preview": "<!--\nAuthor: Xianjun Jiao\nSPDX-FileCopyrightText: 2022 UGent\nSPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\nOne super p"
  },
  {
    "path": "doc/app_notes/perf_counter.md",
    "chars": 3626,
    "preview": "<!--\nAuthor: Xianjun jiao\nSPDX-FileCopyrightText: 2019 UGent\nSPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\nCounter/sta"
  },
  {
    "path": "doc/app_notes/radar-self-csi.md",
    "chars": 3724,
    "preview": "<!--\nAuthor: Xianjun jiao\nSPDX-FileCopyrightText: 2019 UGent\nSPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\nOne super p"
  },
  {
    "path": "doc/app_notes/subcarriers.png.license",
    "chars": 109,
    "preview": "# Author: Michael Mehari\n\n# SPDX-FileCopyrightText: 2019 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later\n\n"
  },
  {
    "path": "doc/asic/skywater-130-pdk-and-asic-considerations.md",
    "chars": 4255,
    "preview": "Hello,\r\n\r\nThe skywater PDK and free MPW shuttle are interesting.  And indeed we are asked many times to consider sky130 "
  },
  {
    "path": "doc/cite-openwifi-github-code.md",
    "chars": 320,
    "preview": "```\n@electronic{openwifigithub,\n            author = {Jiao, Xianjun and Liu, Wei and Mehari, Michael and Thijs, Havinga "
  },
  {
    "path": "doc/cite-openwifi-vtc-paper.md",
    "chars": 356,
    "preview": "```\n@inproceedings{jiao2020openwifi,\n  title={openwifi: a free and open-source IEEE802. 11 SDR implementation on SoC},\n "
  },
  {
    "path": "doc/img_build_instruction/kuiper.md",
    "chars": 6121,
    "preview": "**IMPORTANT pre-conditions**:\n- Install Vivado 2022.2. Make sure install Vitis as well. You should have this directory: "
  },
  {
    "path": "doc/known_issue/notter.md",
    "chars": 8600,
    "preview": "# Known issue\n\n- [Network issue in quick start](#Network-issue-in-quick-start)\n- [EXT4 fs error rootfs issue](#EXT4-fs-e"
  },
  {
    "path": "doc/openwifi-detail.jpg.license",
    "chars": 107,
    "preview": "\n# Author: Xianjun jiao\n\n# SPDX-FileCopyrightText: 2019 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later\n"
  },
  {
    "path": "doc/publications.md",
    "chars": 20321,
    "preview": "<!--\nAuthor: Xianjun jiao\nSPDX-FileCopyrightText: 2021 UGent\nSPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\nIf openwifi"
  },
  {
    "path": "doc/rf-digital-if-chain-config.jpg.license",
    "chars": 107,
    "preview": "\n# Author: Xianjun jiao\n\n# SPDX-FileCopyrightText: 2019 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later\n"
  },
  {
    "path": "doc/rf-digital-if-chain-spectrum.jpg.license",
    "chars": 107,
    "preview": "\n# Author: Xianjun jiao\n\n# SPDX-FileCopyrightText: 2019 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later\n"
  },
  {
    "path": "doc/videos.md",
    "chars": 3335,
    "preview": "- The 1st public demo video [[Youtube](https://youtu.be/NpjEaszd5u4)], [[link for CHN user](https://www.zhihu.com/zvideo"
  },
  {
    "path": "driver/Makefile",
    "chars": 314,
    "preview": "# Xianjun jiao. putaoshu@msn.com; xianjun.jiao@imec.be\n\nobj-m += sdr.o openofdm_rx/openofdm_rx.o openofdm_tx/openofdm_tx"
  },
  {
    "path": "driver/hw_def.h",
    "chars": 18114,
    "preview": "// Author: Xianjun jiao, Michael Mehari, Wei Liu\n// SPDX-FileCopyrightText: 2019 UGent\n// SPDX-License-Identifier: AGPL-"
  },
  {
    "path": "driver/make_all.sh",
    "chars": 3410,
    "preview": "#!/bin/bash\n\n# Author: Xianjun jiao\n# SPDX-FileCopyrightText: 2019 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later\n\np"
  },
  {
    "path": "driver/openofdm_rx/Makefile",
    "chars": 228,
    "preview": "# by Xianjun jiao. putaoshu@msn.com; xianjun.jiao@imec.be\n\nobj-m += openofdm_rx.o\n\nall:\n\tmake -C $(KDIR) M=$(PWD) module"
  },
  {
    "path": "driver/openofdm_rx/openofdm_rx.c",
    "chars": 6942,
    "preview": "/*\n * Author: Xianjun jiao, Michael Mehari, Wei Liu\n * SPDX-FileCopyrightText: 2019 UGent\n * SPDX-License-Identifier: AG"
  },
  {
    "path": "driver/openofdm_tx/Makefile",
    "chars": 227,
    "preview": "# by Xianjun jiao. putaoshu@msn.com; xianjun.jiao@imec.be\n\nobj-m += openofdm_tx.o\n\nall:\n\tmake -C $(KDIR) M=$(PWD) module"
  },
  {
    "path": "driver/openofdm_tx/openofdm_tx.c",
    "chars": 4973,
    "preview": "/*\n * axi lite register access driver\n * Author: Xianjun jiao, Michael Mehari, Wei Liu\n * SPDX-FileCopyrightText: 2019 U"
  },
  {
    "path": "driver/rx_intf/Makefile",
    "chars": 223,
    "preview": "# by Xianjun jiao. putaoshu@msn.com; xianjun.jiao@imec.be\n\nobj-m += rx_intf.o\n\nall:\n\tmake -C $(KDIR) M=$(PWD) modules\n\t#"
  },
  {
    "path": "driver/rx_intf/rx_intf.c",
    "chars": 17144,
    "preview": "/*\n * axi lite register access driver\n * Author: Xianjun Jiao, Michael Mehari, Wei Liu\n * SPDX-FileCopyrightText: 2019 U"
  },
  {
    "path": "driver/sdr.c",
    "chars": 117597,
    "preview": "// Author: Xianjun Jiao, Michael Mehari, Wei Liu, Jetmir Haxhibeqiri, Pablo Avila Campos\n// SPDX-FileCopyrightText: 2022"
  },
  {
    "path": "driver/sdr.h",
    "chars": 18353,
    "preview": "// Author: Xianjun Jiao, Michael Mehari, Wei Liu\n// SPDX-FileCopyrightText: 2019 UGent\n// SPDX-License-Identifier: AGPL-"
  },
  {
    "path": "driver/sdrctl_intf.c",
    "chars": 20892,
    "preview": "// Author: Xianjun Jiao, Michael Mehari, Wei Liu\n// SPDX-FileCopyrightText: 2019 UGent\n// SPDX-License-Identifier: AGPL-"
  },
  {
    "path": "driver/side_ch/Makefile",
    "chars": 247,
    "preview": "# by Xianjun jiao. putaoshu@msn.com; xianjun.jiao@imec.be\n\nobj-m += side_ch.o\n# obj-m += axidmatest.o\n\nall:\n\tmake -C $(K"
  },
  {
    "path": "driver/side_ch/make_driver.sh",
    "chars": 1590,
    "preview": "#!/bin/bash\n\n# Author: Xianjun Jiao, Wei Liu\n# SPDX-FileCopyrightText: 2019 UGent\n# SPDX-License-Identifier: AGPL-3.0-or"
  },
  {
    "path": "driver/side_ch/side_ch.c",
    "chars": 21595,
    "preview": "/*\n * openwifi side channel driver\n * Author: Xianjun Jiao\n * SPDX-FileCopyrightText: 2019 UGent\n * SPDX-License-Identif"
  },
  {
    "path": "driver/side_ch/side_ch.h",
    "chars": 1465,
    "preview": "// Author: Xianjun Jiao\n// SPDX-FileCopyrightText: 2019 UGent\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\n// --------"
  },
  {
    "path": "driver/sysfs_intf.c",
    "chars": 47508,
    "preview": "// Author: Xianjun Jiao, Michael Mehari, Wei Liu\n// SPDX-FileCopyrightText: 2019 UGent\n// SPDX-License-Identifier: AGPL-"
  },
  {
    "path": "driver/tx_intf/Makefile",
    "chars": 223,
    "preview": "# by Xianjun jiao. putaoshu@msn.com; xianjun.jiao@imec.be\n\nobj-m += tx_intf.o\n\nall:\n\tmake -C $(KDIR) M=$(PWD) modules\n\t#"
  },
  {
    "path": "driver/tx_intf/tx_intf.c",
    "chars": 17775,
    "preview": "/*\n * axi lite register access driver\n * Author: Xianjun Jiao, Michael Mehari, Wei Liu\n * SPDX-FileCopyrightText: 2019 U"
  },
  {
    "path": "driver/xilinx_dma/README.md",
    "chars": 3946,
    "preview": "<!--\nAuthor: Xianjun Jiao\nSPDX-FileCopyrightText: 2021 UGent\nSPDX-License-Identifier: AGPL-3.0-or-later\n-->\nWe don't mai"
  },
  {
    "path": "driver/xilinx_dma/make_xilinx_dma.sh",
    "chars": 1467,
    "preview": "#!/bin/bash\n\n# Author: Xianjun Jiao\n# SPDX-FileCopyrightText: 2019 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later\n\ni"
  },
  {
    "path": "driver/xilinx_dma/xilinx_dma.c",
    "chars": 81237,
    "preview": "/*\n * DMA driver for Xilinx Video DMA Engine\n * SPDX-FileCopyrightText: Copyright (C) 2010-2014 Xilinx, Inc. All rights "
  },
  {
    "path": "driver/xpu/Makefile",
    "chars": 220,
    "preview": "# by Xianjun jiao. putaoshu@msn.com; xianjun.jiao@imec.be\n\nobj-m += xpu.o\n\nall:\n\tmake -C $(KDIR) M=$(PWD) modules\n\t# ARC"
  },
  {
    "path": "driver/xpu/xpu.c",
    "chars": 21059,
    "preview": "/*\n * axi lite register access driver\n * Author: Xianjun Jiao, Michael Mehari, Wei Liu\n * SPDX-FileCopyrightText: 2019 U"
  },
  {
    "path": "kernel_boot/10-network-device.rules",
    "chars": 80,
    "preview": "SUBSYSTEM==\"net\", ACTION==\"add\", ATTR{address}==\"66:55:44:33:22:*\", NAME=\"sdr0\"\n"
  },
  {
    "path": "kernel_boot/70-persistent-net.rules",
    "chars": 150,
    "preview": "SUBSYSTEM==\"net\", ACTION==\"add\", DRIVERS==\"?*\", ATTR{address}==\"66:55:44:33:22:*\", ATTR{dev_id}==\"0x0\", ATTR{type}==\"1\","
  },
  {
    "path": "kernel_boot/ad9361.patch",
    "chars": 3468,
    "preview": "diff --git a/drivers/iio/adc/ad9361.c b/drivers/iio/adc/ad9361.c\nindex 91f166675024..8403edc6f482 100644\n--- a/drivers/i"
  },
  {
    "path": "kernel_boot/ad9361_conv.patch",
    "chars": 683,
    "preview": "diff --git a/drivers/iio/adc/ad9361_conv.c b/drivers/iio/adc/ad9361_conv.c\nindex 1902e7d07501..ef421dbd5e70 100644\n--- a"
  },
  {
    "path": "kernel_boot/ad9361_private.patch",
    "chars": 634,
    "preview": "diff --git a/drivers/iio/adc/ad9361_private.h b/drivers/iio/adc/ad9361_private.h\nindex dfffc4fa88a9..99dadf844614 100644"
  },
  {
    "path": "kernel_boot/axi_hdmi_crtc.patch",
    "chars": 601,
    "preview": "diff --git a/drivers/gpu/drm/adi_axi_hdmi/axi_hdmi_crtc.c b/drivers/gpu/drm/adi_axi_hdmi/axi_hdmi_crtc.c\nindex e8241767b"
  },
  {
    "path": "kernel_boot/boards/adrv9361z7035/devicetree.dts",
    "chars": 24250,
    "preview": "/dts-v1/;\n\n/ {\n\t#address-cells = <0x1>;\n\t#size-cells = <0x1>;\n\tcompatible = \"xlnx,zynq-7000\";\n\tinterrupt-parent = <0x1>;"
  },
  {
    "path": "kernel_boot/boards/adrv9361z7035_fmc/devicetree.dts",
    "chars": 29473,
    "preview": "/dts-v1/;\n\n/ {\n\t#address-cells = <0x1>;\n\t#size-cells = <0x1>;\n\tcompatible = \"xlnx,zynq-7000\";\n\tinterrupt-parent = <0x1>;"
  },
  {
    "path": "kernel_boot/boards/adrv9364z7020/devicetree.dts",
    "chars": 27421,
    "preview": "/dts-v1/;\n\n/ {\n\t#address-cells = <0x01>;\n\t#size-cells = <0x01>;\n\tcompatible = \"xlnx,zynq-7000\";\n\tinterrupt-parent = <0x0"
  },
  {
    "path": "kernel_boot/boards/antsdr/devicetree.dts",
    "chars": 23169,
    "preview": "/dts-v1/;\n\n/ {\n\t#address-cells = <0x1>;\n\t#size-cells = <0x1>;\n\tcompatible = \"xlnx,zynq-7000\";\n\tinterrupt-parent = <0x1>;"
  },
  {
    "path": "kernel_boot/boards/antsdr/notes.md",
    "chars": 1077,
    "preview": "# antsdr for openwifi-hw\n\n## Introduction\n[ANTSDR](https://github.com/MicroPhase/antsdr-fw) is a SDR hardware platform b"
  },
  {
    "path": "kernel_boot/boards/antsdr_e200/README.md",
    "chars": 1031,
    "preview": "# ANTSDR-E200\n\nANTSDR-E200 is similar to MicroPhase ANTSDR-E310 device. \n\nANTSDR-E200 has a smaller size and some differ"
  },
  {
    "path": "kernel_boot/boards/antsdr_e200/devicetree.dts",
    "chars": 23053,
    "preview": "/dts-v1/;\n\n/ {\n\t#address-cells = <0x1>;\n\t#size-cells = <0x1>;\n\tcompatible = \"xlnx,zynq-7000\";\n\tinterrupt-parent = <0x1>;"
  },
  {
    "path": "kernel_boot/boards/e310v2/README.md",
    "chars": 960,
    "preview": "# ANTSDR-E310V2\n\n**AntSDR E310V2** is a powerful and versatile  software-defined radio (SDR) platform. It is a low-cost,"
  },
  {
    "path": "kernel_boot/boards/e310v2/devicetree.dts",
    "chars": 26448,
    "preview": "/dts-v1/;\n\n/ {\n\t#address-cells = <0x01>;\n\t#size-cells = <0x01>;\n\tcompatible = \"xlnx,zynq-7000\";\n\tinterrupt-parent = <0x0"
  },
  {
    "path": "kernel_boot/boards/neptunesdr/devicetree.dts",
    "chars": 27387,
    "preview": "/dts-v1/;\n\n/ {\n\t#address-cells = <0x01>;\n\t#size-cells = <0x01>;\n\tcompatible = \"xlnx,zynq-7000\";\n\tinterrupt-parent = <0x0"
  },
  {
    "path": "kernel_boot/boards/sdrpi/devicetree.dts",
    "chars": 23302,
    "preview": "/dts-v1/;\n\n/ {\n\t#address-cells = <0x1>;\n\t#size-cells = <0x1>;\n\tcompatible = \"xlnx,zynq-7000\";\n\tinterrupt-parent = <0x1>;"
  },
  {
    "path": "kernel_boot/boards/sdrpi/notes.md",
    "chars": 962,
    "preview": "# sdrpi for openwifi\n\n## Introduction\n[SDRPi](https://github.com/hexsdr/) is a smart and powerful SDR platform according"
  },
  {
    "path": "kernel_boot/boards/zc702_fmcs2/devicetree.dts",
    "chars": 30751,
    "preview": "/dts-v1/;\n\n/ {\n\t#address-cells = <0x01>;\n\t#size-cells = <0x01>;\n\tcompatible = \"xlnx,zynq-7000\";\n\tinterrupt-parent = <0x0"
  },
  {
    "path": "kernel_boot/boards/zc706_fmcs2/devicetree.dts",
    "chars": 28205,
    "preview": "/dts-v1/;\n\n/ {\n\t#address-cells = <0x1>;\n\t#size-cells = <0x1>;\n\tcompatible = \"xlnx,zynq-7000\";\n\tinterrupt-parent = <0x1>;"
  },
  {
    "path": "kernel_boot/boards/zcu102_fmcs2/system.dts",
    "chars": 74632,
    "preview": "/dts-v1/;\n\n/ {\n\tcompatible = \"xlnx,zynqmp-zcu102-rev1.0\\0xlnx,zynqmp-zcu102\\0xlnx,zynqmp\";\n\t#address-cells = <0x02>;\n\t#s"
  },
  {
    "path": "kernel_boot/boards/zed_fmcs2/devicetree.dts",
    "chars": 27522,
    "preview": "/dts-v1/;\n\n/ {\n\t#address-cells = <0x1>;\n\t#size-cells = <0x1>;\n\tcompatible = \"xlnx,zynq-7000\";\n\tinterrupt-parent = <0x1>;"
  },
  {
    "path": "kernel_boot/build_boot_bin.sh",
    "chars": 3025,
    "preview": "#!/bin/bash\nset -ex\n\nHDF_FILE=$1\nUBOOT_FILE=$2\nBUILD_DIR=build_boot_bin\nOUTPUT_DIR=output_boot_bin\n\nusage () {\n\techo \"us"
  },
  {
    "path": "kernel_boot/build_zynqmp_boot_bin.sh",
    "chars": 5181,
    "preview": "#!/bin/bash\nset -ex\n\nXSA_FILE=$1\nUBOOT_FILE=$2\nATF_FILE=${3:-download}\nBUILD_DIR=build_boot_bin\nOUTPUT_DIR=output_boot_b"
  },
  {
    "path": "kernel_boot/kernel_config",
    "chars": 169868,
    "preview": "#\n# Automatically generated file; DO NOT EDIT.\n# Linux/arm 5.15.36 Kernel Configuration\n#\nCONFIG_KERNEL_ALL_ADI_DRIVERS="
  },
  {
    "path": "kernel_boot/kernel_config_zynqmp",
    "chars": 197486,
    "preview": "#\n# Automatically generated file; DO NOT EDIT.\n# Linux/arm64 5.15.36 Kernel Configuration\n#\nCONFIG_KERNEL_ALL_ADI_DRIVER"
  },
  {
    "path": "kernel_boot/kernel_patch_readme.md",
    "chars": 371,
    "preview": "axi_hdmi_crtc.patch to avoid axi hdmi compiling error after enable Xilinx axi dma.\n\nad9361.patch to expose some APIs for"
  },
  {
    "path": "openwifi-arch.jpg.license",
    "chars": 107,
    "preview": "\n# Author: Xianjun jiao\n\n# SPDX-FileCopyrightText: 2019 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later\n"
  },
  {
    "path": "user_space/agc_settings.sh",
    "chars": 2029,
    "preview": "#!/bin/bash\n\nif [ \"$#\" -ne 1 ]; then\n    echo \"You must enter 1 to apply new settings or 0 to restore default settings\"\n"
  },
  {
    "path": "user_space/arbitrary_iq_gen/iq_single_carrier_1000000Hz_512.txt",
    "chars": 6243,
    "preview": "16311,1542\n15036,6507\n12290,10835\n8340,14102\n3574,15989\n-1542,16311\n-6507,15036\n-10835,12290\n-14102,8340\n-15989,3574\n-16"
  },
  {
    "path": "user_space/arbitrary_iq_gen/single_carrier_gen.m",
    "chars": 1187,
    "preview": "% Author: Xianjun Jiao (xianjun.jiao@imec.be; putaoshu@msn.com)\n% SPDX-FileCopyrightText: 2023 UGent\n% SPDX-License-Iden"
  },
  {
    "path": "user_space/boot_bin_gen.sh",
    "chars": 2812,
    "preview": "#!/bin/bash\n\n# Author: Xianjun Jiao\n# SPDX-FileCopyrightText: 2019 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later\n\ni"
  },
  {
    "path": "user_space/build_wpa_supplicant_wo11b.sh",
    "chars": 650,
    "preview": "#!/bin/bash\n\n# Author: Michael Mehari\n# SPDX-FileCopyrightText: 2019 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later\n"
  },
  {
    "path": "user_space/cd_adi_iio_dir.sh",
    "chars": 1070,
    "preview": "#!/bin/sh\n\n# Author: Xianjun Jiao\n# SPDX-FileCopyrightText: 2022 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later\n\nset"
  },
  {
    "path": "user_space/check_calib_inf.sh",
    "chars": 1189,
    "preview": "#!/bin/bash\n\nset -x\nif test -f \"/sys/kernel/debug/iio/iio:device0/direct_reg_access\"; then\n  device_path=/sys/kernel/deb"
  },
  {
    "path": "user_space/csi_fuzzer.sh",
    "chars": 1311,
    "preview": "  \n#!/bin/bash\n\n# Author: Xianjun Jiao\n# SPDX-FileCopyrightText: 2021 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later"
  },
  {
    "path": "user_space/csi_fuzzer_scan.sh",
    "chars": 2153,
    "preview": "#!/bin/bash\n\n# Author: Xianjun Jiao\n# SPDX-FileCopyrightText: 2021 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later\n\ni"
  },
  {
    "path": "user_space/cw_disable.sh",
    "chars": 316,
    "preview": "#!/bin/bash\n\nhome_dir=$(pwd)\n\nif test -d \"/sys/devices/platform/fpga-axi@0/fpga-axi@0:sdr\"; then\n  cd /sys/devices/platf"
  },
  {
    "path": "user_space/cw_max_min_cfg.sh",
    "chars": 324,
    "preview": "#!/bin/bash\n\nhome_dir=$(pwd)\n\nif test -d \"/sys/devices/platform/fpga-axi@0/fpga-axi@0:sdr\"; then\n  cd /sys/devices/platf"
  },
  {
    "path": "user_space/dhcpd.conf",
    "chars": 3979,
    "preview": "#\n# Sample configuration file for ISC dhcpd for Debian\n#\n# Attention: If /etc/ltsp/dhcpd.conf exists, that will be used "
  },
  {
    "path": "user_space/difs_disable.sh",
    "chars": 316,
    "preview": "#!/bin/bash\n\nhome_dir=$(pwd)\n\nif test -d \"/sys/devices/platform/fpga-axi@0/fpga-axi@0:sdr\"; then\n  cd /sys/devices/platf"
  },
  {
    "path": "user_space/driver_nl80211.patch",
    "chars": 481,
    "preview": "--- wpa_supplicant-2.1/src/drivers/driver_nl80211.c\t2014-02-04 12:23:35.000000000 +0100\n+++ driver_nl80211.c\t2020-01-09 "
  },
  {
    "path": "user_space/drv_and_fpga_package_gen.sh",
    "chars": 4599,
    "preview": "  \n#!/bin/bash\n\n# Author: Xianjun Jiao\n# SPDX-FileCopyrightText: 2022 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later"
  },
  {
    "path": "user_space/eifs_by_last_rx_fail_disable.sh",
    "chars": 316,
    "preview": "#!/bin/bash\n\nhome_dir=$(pwd)\n\nif test -d \"/sys/devices/platform/fpga-axi@0/fpga-axi@0:sdr\"; then\n  cd /sys/devices/platf"
  },
  {
    "path": "user_space/eifs_by_last_tx_fail_disable.sh",
    "chars": 316,
    "preview": "#!/bin/bash\n\nhome_dir=$(pwd)\n\nif test -d \"/sys/devices/platform/fpga-axi@0/fpga-axi@0:sdr\"; then\n  cd /sys/devices/platf"
  },
  {
    "path": "user_space/eifs_disable.sh",
    "chars": 316,
    "preview": "#!/bin/bash\n\nhome_dir=$(pwd)\n\nif test -d \"/sys/devices/platform/fpga-axi@0/fpga-axi@0:sdr\"; then\n  cd /sys/devices/platf"
  },
  {
    "path": "user_space/fast_reg_log/fast_reg_log.c",
    "chars": 1848,
    "preview": "// Author: Xianjun Jiao (xianjun.jiao@imec.be; putaoshu@msn.com)\n// SPDX-FileCopyrightText: 2023 UGent\n// SPDX-License-I"
  },
  {
    "path": "user_space/fast_reg_log/fast_reg_log_analyzer.m",
    "chars": 2094,
    "preview": "% Author: Xianjun Jiao (xianjun.jiao@imec.be; putaoshu@msn.com)\n% SPDX-FileCopyrightText: 2023 UGent\n% SPDX-License-Iden"
  },
  {
    "path": "user_space/fosdem-11ag.sh",
    "chars": 561,
    "preview": "#!/bin/bash\n\n# Author: Xianjun Jiao\n# SPDX-FileCopyrightText: 2019 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later\n\n#"
  },
  {
    "path": "user_space/fosdem.sh",
    "chars": 556,
    "preview": "#!/bin/bash\n\n# Author: Xianjun Jiao\n# SPDX-FileCopyrightText: 2019 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later\n\n#"
  },
  {
    "path": "user_space/hostapd-openwifi-11ag.conf",
    "chars": 331,
    "preview": "interface=sdr0\ndriver=nl80211\ncountry_code=BE\nssid=openwifi\nhw_mode=a\nchannel=36\nsupported_rates=60 90 120 180 240 360 4"
  },
  {
    "path": "user_space/hostapd-openwifi.conf",
    "chars": 329,
    "preview": "interface=sdr0\ndriver=nl80211\ncountry_code=BE\nssid=openwifi\nhw_mode=a\nchannel=36\nsupported_rates=60 90 120 180 240 360 4"
  },
  {
    "path": "user_space/inject_80211/Makefile",
    "chars": 382,
    "preview": "\nall: inject_80211 analyze_80211\n\ninject_80211: inject_80211.c\n#\tgcc  -Wall -Werror inject_80211.c -o inject_80211 -lpca"
  },
  {
    "path": "user_space/inject_80211/analyze_80211.c",
    "chars": 3878,
    "preview": "\n// Author: Michael Mehari\n// SPDX-FileCopyrightText: 2020 UGent\n// SPDX-License-Identifier: GPL-2.0-or-later\n\n/*\n *   T"
  },
  {
    "path": "user_space/inject_80211/ieee80211_radiotap.h",
    "chars": 13436,
    "preview": "/*\n * Copyright (c) 2017\t\tIntel Deutschland GmbH\n * Copyright (c) 2018-2019\tIntel Corporation\n *\n * Permission to use, c"
  },
  {
    "path": "user_space/inject_80211/inject_80211.c",
    "chars": 10938,
    "preview": "// Modified by: Michael Mehari\n// SPDX-FileCopyrightText: 2020 UGent\n// SPDX-FileCopyrightText: 2007 Andy Green <andy@wa"
  },
  {
    "path": "user_space/inject_80211/inject_80211.h",
    "chars": 687,
    "preview": "/*\n * Author: Michael Mehari\n * SPDX-FileCopyrightText: 2019 UGent\n * SPDX-License-Identifier: AGPL-3.0-or-later\n*/\n\n#in"
  },
  {
    "path": "user_space/inject_80211/inject_80211.sh",
    "chars": 414,
    "preview": "#!/bin/bash\n\n# Author: Michael Mehari\n# SPDX-FileCopyrightText: 2019 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later\n"
  },
  {
    "path": "user_space/inject_80211/radiotap.c",
    "chars": 13719,
    "preview": "/*\n * Radiotap parser\n *\n * Copyright 2007\t\tAndy Green <andy@warmcat.com>\n * Copyright 2009\t\tJohannes Berg <johannes@sip"
  },
  {
    "path": "user_space/inject_80211/radiotap.h",
    "chars": 2266,
    "preview": "#include \"ieee80211_radiotap.h\"\n\n// -----ieee80211_radiotap_iterator from cfg80211.h ----- //\n/**\n * struct ieee80211_ra"
  },
  {
    "path": "user_space/inject_80211/unaligned.h",
    "chars": 2862,
    "preview": "/* SPDX-License-Identifier: GPL-2.0-only */\n/*\n *  Port on Texas Instruments TMS320C6x architecture\n *\n *  Copyright (C)"
  },
  {
    "path": "user_space/inject_80211/uthash.h",
    "chars": 61254,
    "preview": "/*\nCopyright (c) 2003-2013, Troy D. Hanson     http://troydhanson.github.com/uthash/\nAll rights reserved.\n\nRedistributio"
  },
  {
    "path": "user_space/link_perf_test.sh",
    "chars": 1681,
    "preview": "#!/bin/bash\n\n# Author: Michael Mehari\n# SPDX-FileCopyrightText: 2019 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later\n"
  },
  {
    "path": "user_space/load_fpga_img.sh",
    "chars": 2023,
    "preview": "#!/bin/bash\n\n# Author: Xianjun Jiao\n# SPDX-FileCopyrightText: 2022 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later\n\n#"
  },
  {
    "path": "user_space/monitor_ch.sh",
    "chars": 577,
    "preview": "#!/bin/bash\n\n# Author: Xianjun Jiao\n# SPDX-FileCopyrightText: 2019 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later\n\ni"
  },
  {
    "path": "user_space/nav_disable.sh",
    "chars": 316,
    "preview": "#!/bin/bash\n\nhome_dir=$(pwd)\n\nif test -d \"/sys/devices/platform/fpga-axi@0/fpga-axi@0:sdr\"; then\n  cd /sys/devices/platf"
  },
  {
    "path": "user_space/nic_back_to_normal.sh",
    "chars": 460,
    "preview": "#!/bin/bash\n\n# Author: Xianjun Jiao\n# SPDX-FileCopyrightText: 2019 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later\n\ni"
  },
  {
    "path": "user_space/openwifi_ad9361_fir.ftr",
    "chars": 569,
    "preview": "# Data Sample Frequency = 40000000 Hz\nTX 3 GAIN 0 INT 1\nRX 3 GAIN -6 DEC 1\nRTX 1280000000 160000000 80000000 40000000 40"
  },
  {
    "path": "user_space/openwifi_ad9361_fir_tx_0MHz.ftr",
    "chars": 585,
    "preview": "# Data Sample Frequency = 40000000 Hz\nTX 3 GAIN 0 INT 1\nRX 3 GAIN -6 DEC 1\nRTX 1280000000 160000000 80000000 40000000 40"
  },
  {
    "path": "user_space/openwifi_ad9361_fir_tx_0MHz_11n.ftr",
    "chars": 1464,
    "preview": "# Generated with AD9361 Filter Design Wizard 16.1.3\r\n# MATLAB 9.10.0.1602886 (R2021a), 18-Nov-2021 11:34:55\r\n# Rx settin"
  },
  {
    "path": "user_space/openwifi_ad9361_fir_tx_0MHz_11n_narrow1.ftr",
    "chars": 1464,
    "preview": "# Generated with AD9361 Filter Design Wizard 16.1.3\r\n# MATLAB 9.10.0.1602886 (R2021a), 31-Oct-2022 15:56:07\r\n# Rx settin"
  },
  {
    "path": "user_space/populate_driver_userspace.sh",
    "chars": 152,
    "preview": "#!/bin/bash\n\n# Author: Xianjun Jiao\n# SPDX-FileCopyrightText: 2024 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later\n\ns"
  },
  {
    "path": "user_space/populate_kernel_image_module_reboot.sh",
    "chars": 1231,
    "preview": "#!/bin/bash\n\n# Author: Xianjun Jiao\n# SPDX-FileCopyrightText: 2019 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later\n\ns"
  },
  {
    "path": "user_space/post_config.sh",
    "chars": 1636,
    "preview": "#!/bin/bash\n\n# Author: Xianjun Jiao\n# SPDX-FileCopyrightText: 2019 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later\n\ns"
  },
  {
    "path": "user_space/prepare_kernel.sh",
    "chars": 3205,
    "preview": "  \n#!/bin/bash\n\n# Author: Xianjun Jiao\n# SPDX-FileCopyrightText: 2019 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later"
  },
  {
    "path": "user_space/receiver_phase_offset_override.sh",
    "chars": 685,
    "preview": "#!/bin/bash\n\n# Author: Xianjun Jiao\n# SPDX-FileCopyrightText: 2023 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later\n\n#"
  },
  {
    "path": "user_space/rf_init.sh",
    "chars": 3408,
    "preview": "#!/bin/sh\n\n# Author: Xianjun Jiao\n# SPDX-FileCopyrightText: 2019 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later\n\nhom"
  },
  {
    "path": "user_space/rf_init_11n.sh",
    "chars": 3398,
    "preview": "#!/bin/sh\n\n# Author: Xianjun Jiao\n# SPDX-FileCopyrightText: 2019 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later\n\nhom"
  },
  {
    "path": "user_space/rssi_ad9361_show.sh",
    "chars": 1426,
    "preview": "#!/bin/bash\n\n# Reads RSSI in dB from RX1, let's call it \"r\".  \n# Linear fit offset \"o\" depends on frequency (2.4GHz or 5"
  },
  {
    "path": "user_space/rssi_openwifi_show.sh",
    "chars": 388,
    "preview": "#!/bin/bash\n\nrssi_raw=$(./sdrctl dev sdr0 get reg xpu 57)\necho $rssi_raw\n\nrssi_raw=${rssi_raw: -8}\necho $rssi_raw\n\nrssi_"
  },
  {
    "path": "user_space/rx_gain_show.sh",
    "chars": 439,
    "preview": "#!/bin/bash\n\nhome_dir=$(pwd)\n\nif test -d \"/sys/devices/platform/fpga-axi@0/fpga-axi@0:sdr\"; then\n  cd /sys/devices/platf"
  },
  {
    "path": "user_space/rx_stat_show.sh",
    "chars": 2018,
    "preview": "#!/bin/bash\n\nhome_dir=$(pwd)\n\nif test -d \"/sys/devices/platform/fpga-axi@0/fpga-axi@0:sdr\"; then\n  cd /sys/devices/platf"
  },
  {
    "path": "user_space/sdcard_boot_update.sh",
    "chars": 2555,
    "preview": "#!/bin/bash\n\n# Author: Xianjun Jiao\n# SPDX-FileCopyrightText: 2019 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later\n\ni"
  },
  {
    "path": "user_space/sdr-ad-hoc-join.sh",
    "chars": 762,
    "preview": "#!/bin/bash\n\n# Author: Xianjun Jiao\n# SPDX-FileCopyrightText: 2019 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later\n\ni"
  },
  {
    "path": "user_space/sdr-ad-hoc-up.sh",
    "chars": 669,
    "preview": "#!/bin/bash\n\n# Author: Xianjun Jiao\n# SPDX-FileCopyrightText: 2019 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later\n\ni"
  },
  {
    "path": "user_space/sdrctl_src/Makefile",
    "chars": 2947,
    "preview": "MAKEFLAGS += --no-print-directory\n\nPREFIX ?= /usr\nSBINDIR ?= $(PREFIX)/sbin\nMANDIR ?= $(PREFIX)/share/man\nPKG_CONFIG ?= "
  },
  {
    "path": "user_space/sdrctl_src/cmd.c",
    "chars": 26350,
    "preview": "// Author: Xianjun Jiao\n// SPDX-FileCopyrightText: 2019 UGent\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\n#include <s"
  },
  {
    "path": "user_space/sdrctl_src/nl80211.h",
    "chars": 231644,
    "preview": "#ifndef __LINUX_NL80211_H\n#define __LINUX_NL80211_H\n/*\n * 802.11 netlink interface public header\n *\n * SPDX-FileCopyrigh"
  },
  {
    "path": "user_space/sdrctl_src/nl80211_testmode_def.h",
    "chars": 2411,
    "preview": "// Author: Xianjun Jiao\n// SPDX-FileCopyrightText: 2019 UGent\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\n//---nl8021"
  },
  {
    "path": "user_space/sdrctl_src/sdrctl.c",
    "chars": 11746,
    "preview": "/*\n * nl80211 userspace tool\n *\n * SPDX-FileCopyrightText: Copyright 2007, 2008 Johannes Berg <johannes@sipsolutions.net"
  },
  {
    "path": "user_space/sdrctl_src/sdrctl.h",
    "chars": 5574,
    "preview": "/*\n * Author: Xianjun Jiao\n * SPDX-FileCopyrightText: 2019 UGent\n * SPDX-License-Identifier: AGPL-3.0-or-later\n*/\n\n#ifnd"
  },
  {
    "path": "user_space/sdrctl_src/sections.c",
    "chars": 164,
    "preview": "/*\n * Author: Xianjun Jiao\n * SPDX-FileCopyrightText: 2019 UGent\n * SPDX-License-Identifier: AGPL-3.0-or-later\n*/\n\n#incl"
  },
  {
    "path": "user_space/sdrctl_src/version.sh",
    "chars": 608,
    "preview": "#!/bin/sh\n\n# Author: Xianjun Jiao\n# SPDX-FileCopyrightText: 2019 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later\n\nVER"
  },
  {
    "path": "user_space/set_dbg_ch0.sh",
    "chars": 297,
    "preview": "#!/bin/bash\n\nhome_dir=$(pwd)\n\nif test -d \"/sys/devices/platform/fpga-axi@0/fpga-axi@0:sdr\"; then\n  cd /sys/devices/platf"
  },
  {
    "path": "user_space/set_dbg_ch1.sh",
    "chars": 297,
    "preview": "#!/bin/bash\n\nhome_dir=$(pwd)\n\nif test -d \"/sys/devices/platform/fpga-axi@0/fpga-axi@0:sdr\"; then\n  cd /sys/devices/platf"
  },
  {
    "path": "user_space/set_dbg_ch2.sh",
    "chars": 297,
    "preview": "#!/bin/bash\n\nhome_dir=$(pwd)\n\nif test -d \"/sys/devices/platform/fpga-axi@0/fpga-axi@0:sdr\"; then\n  cd /sys/devices/platf"
  },
  {
    "path": "user_space/set_lbt_th.sh",
    "chars": 267,
    "preview": "#!/bin/bash\n\nif [[ -n $1 ]]; then\n  lbt_th=$1\nelse\n  lbt_th=987654321 # no input\nfi\n\nset -x\n#set\nif [ $lbt_th -ne 987654"
  },
  {
    "path": "user_space/set_restrict_freq.sh",
    "chars": 317,
    "preview": "#!/bin/bash\n\nhome_dir=$(pwd)\n\nif test -d \"/sys/devices/platform/fpga-axi@0/fpga-axi@0:sdr\"; then\n  cd /sys/devices/platf"
  },
  {
    "path": "user_space/set_rx_gain_auto.sh",
    "chars": 2199,
    "preview": "#!/bin/sh\n\n# Author: Xianjun Jiao\n# SPDX-FileCopyrightText: 2019 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later\n\nhom"
  },
  {
    "path": "user_space/set_rx_gain_manual.sh",
    "chars": 1336,
    "preview": "#!/bin/sh\n\n# Author: Xianjun Jiao\n# SPDX-FileCopyrightText: 2019 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later\n\ngai"
  },
  {
    "path": "user_space/set_rx_monitor_all.sh",
    "chars": 356,
    "preview": "#!/bin/bash\n\nhome_dir=$(pwd)\n\nif test -d \"/sys/devices/platform/fpga-axi@0/fpga-axi@0:sdr\"; then\n  cd /sys/devices/platf"
  },
  {
    "path": "user_space/set_rx_target_sender_mac_addr.sh",
    "chars": 347,
    "preview": "#!/bin/bash\n\nhome_dir=$(pwd)\n\nif test -d \"/sys/devices/platform/fpga-axi@0/fpga-axi@0:sdr\"; then\n  cd /sys/devices/platf"
  },
  {
    "path": "user_space/set_tx_lo.sh",
    "chars": 1889,
    "preview": "#!/bin/bash\n\nset -x\nif test -f \"/sys/kernel/debug/iio/iio:device0/direct_reg_access\"; then\n  cd /sys/kernel/debug/iio/ii"
  },
  {
    "path": "user_space/set_tx_port.sh",
    "chars": 1905,
    "preview": "#!/bin/bash\n\nset -x\nif test -f \"/sys/kernel/debug/iio/iio:device0/direct_reg_access\"; then\n  cd /sys/kernel/debug/iio/ii"
  },
  {
    "path": "user_space/setup_once.sh",
    "chars": 2451,
    "preview": "#!/bin/bash\n\n# Author: Xianjun Jiao\n# SPDX-FileCopyrightText: 2023 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later\n\ns"
  },
  {
    "path": "user_space/side_ch_ctl_src/iq_capture.py",
    "chars": 4692,
    "preview": "#\n# openwifi side info receive and display program\n# Xianjun jiao. putaoshu@msn.com; xianjun.jiao@imec.be\n#\nimport os\nim"
  },
  {
    "path": "user_space/side_ch_ctl_src/iq_capture_2ant.py",
    "chars": 3409,
    "preview": "#\n# openwifi side info receive and display program\n# Xianjun jiao. putaoshu@msn.com; xianjun.jiao@imec.be\n#\nimport os\nim"
  },
  {
    "path": "user_space/side_ch_ctl_src/iq_capture_freq_offset.py",
    "chars": 10582,
    "preview": "#\n# openwifi iq capture and frequency offset calculation program\n# Xianjun jiao. putaoshu@msn.com; xianjun.jiao@imec.be\n"
  },
  {
    "path": "user_space/side_ch_ctl_src/save_iq_to_txt_for_verilog_sim.m",
    "chars": 871,
    "preview": "% Xianjun Jiao. xianjun.jiao@imec.be; putaoshu@msn.com\n\nfunction save_iq_to_txt_for_verilog_sim(mat_filename, varargin)\n"
  },
  {
    "path": "user_space/side_ch_ctl_src/show_iq_snr.m",
    "chars": 1667,
    "preview": "% iq_mat_filename is the mat file generated by test_iq_file_display.m\n% First run without threshold input for you to dec"
  },
  {
    "path": "user_space/side_ch_ctl_src/side_ch_ctl.c",
    "chars": 12754,
    "preview": "/*\n * openwifi side channel user space program\n * Author: Xianjun Jiao\n * SPDX-FileCopyrightText: 2019 UGent\n * SPDX-Lic"
  },
  {
    "path": "user_space/side_ch_ctl_src/side_info_display.py",
    "chars": 8309,
    "preview": "#\n# openwifi side info receive and display program\n# Xianjun jiao. putaoshu@msn.com; xianjun.jiao@imec.be\n#\nimport os\nim"
  },
  {
    "path": "user_space/side_ch_ctl_src/test_iq_2ant_file_display.m",
    "chars": 3055,
    "preview": "% Xianjun Jiao. xianjun.jiao@imec.be; putaoshu@msn.com\n\n% clear all;\n% close all;\nfunction timestamp = test_iq_2ant_file"
  },
  {
    "path": "user_space/side_ch_ctl_src/test_iq_file_ack_timing_display.m",
    "chars": 8792,
    "preview": "% Xianjun Jiao. xianjun.jiao@imec.be; putaoshu@msn.com\n\n% clear all;\n% close all;\n\nfunction timestamp = test_iq_file_ack"
  },
  {
    "path": "user_space/side_ch_ctl_src/test_iq_file_display.m",
    "chars": 4952,
    "preview": "% Xianjun Jiao. xianjun.jiao@imec.be; putaoshu@msn.com\n\n% clear all;\n% close all;\n\nfunction timestamp = test_iq_file_dis"
  },
  {
    "path": "user_space/side_ch_ctl_src/test_side_info_file_display.m",
    "chars": 2247,
    "preview": "% Xianjun Jiao. xianjun.jiao@imec.be; putaoshu@msn.com\n\nfunction [timestamp, csi, freq_offset, equalizer_out] = test_sid"
  },
  {
    "path": "user_space/slice_cfg.sh",
    "chars": 644,
    "preview": "#!/bin/bash\n\n# Author: Xianjun Jiao\n# SPDX-FileCopyrightText: 2019 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later\n\ni"
  },
  {
    "path": "user_space/stat_enable.sh",
    "chars": 333,
    "preview": "#!/bin/bash\n\nhome_dir=$(pwd)\n\nif test -d \"/sys/devices/platform/fpga-axi@0/fpga-axi@0:sdr\"; then\n  cd /sys/devices/platf"
  },
  {
    "path": "user_space/system_top.bif",
    "chars": 58,
    "preview": "all:\n{\n        system_top.bit /* Bitstream file name */\n}\n"
  },
  {
    "path": "user_space/transfer_driver_userspace_to_board.sh",
    "chars": 990,
    "preview": "  \n#!/bin/bash\n\n# Author: Xianjun Jiao\n# SPDX-FileCopyrightText: 2019 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later"
  },
  {
    "path": "user_space/transfer_kernel_image_module_to_board.sh",
    "chars": 2348,
    "preview": "  \n#!/bin/bash\n\n# Author: Xianjun Jiao\n# SPDX-FileCopyrightText: 2019 UGent\n# SPDX-License-Identifier: AGPL-3.0-or-later"
  },
  {
    "path": "user_space/tx_intf_iq_data_to_sysfs.sh",
    "chars": 339,
    "preview": "#!/bin/bash\n\nhome_dir=$(pwd)\n\nset -x\nif test -d \"/sys/devices/platform/fpga-axi@0/fpga-axi@0:sdr\"; then\n  cd /sys/device"
  },
  {
    "path": "user_space/tx_intf_iq_send.sh",
    "chars": 276,
    "preview": "#!/bin/bash\n\nhome_dir=$(pwd)\n\nset -x\nif test -d \"/sys/devices/platform/fpga-axi@0/fpga-axi@0:sdr\"; then\n  cd /sys/device"
  },
  {
    "path": "user_space/tx_prio_queue_show.sh",
    "chars": 324,
    "preview": "#!/bin/bash\n\nhome_dir=$(pwd)\n\nif test -d \"/sys/devices/platform/fpga-axi@0/fpga-axi@0:sdr\"; then\n  cd /sys/devices/platf"
  },
  {
    "path": "user_space/tx_stat_show.sh",
    "chars": 1217,
    "preview": "#!/bin/bash\n\nhome_dir=$(pwd)\n\nif test -d \"/sys/devices/platform/fpga-axi@0/fpga-axi@0:sdr\"; then\n  cd /sys/devices/platf"
  }
]

// ... and 33 more files (download for full content)

About this extraction

This page contains the full source code of the open-sdr/openwifi GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 233 files (1.9 MB), approximately 658.0k tokens, and a symbol index with 800 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!