Merge branch 'net-ReST-convert'
Mauro Carvalho Chehab says: ==================== net: manually convert files to ReST format - part 1 There are very few documents upstream that aren't converted upstream. This series convert part of the networking text files into ReST. It is part of a bigger set of patches, which were split on parts, in order to make reviewing task easier. The full series (including those ones) are at: https://git.linuxtv.org/mchehab/experimental.git/log/?h=net-docs And the documents, converted to HTML via the building system are at: https://www.infradead.org/~mchehab/kernel_docs/networking/ ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
c76c223016
|
@ -356,7 +356,7 @@
|
|||
shot down by NMI
|
||||
|
||||
autoconf= [IPV6]
|
||||
See Documentation/networking/ipv6.txt.
|
||||
See Documentation/networking/ipv6.rst.
|
||||
|
||||
show_lapic= [APIC,X86] Advanced Programmable Interrupt Controller
|
||||
Limit apic dumping. The parameter defines the maximal
|
||||
|
@ -831,7 +831,7 @@
|
|||
|
||||
decnet.addr= [HW,NET]
|
||||
Format: <area>[,<node>]
|
||||
See also Documentation/networking/decnet.txt.
|
||||
See also Documentation/networking/decnet.rst.
|
||||
|
||||
default_hugepagesz=
|
||||
[same as hugepagesz=] The size of the default
|
||||
|
@ -872,7 +872,7 @@
|
|||
miss to occur.
|
||||
|
||||
disable= [IPV6]
|
||||
See Documentation/networking/ipv6.txt.
|
||||
See Documentation/networking/ipv6.rst.
|
||||
|
||||
hardened_usercopy=
|
||||
[KNL] Under CONFIG_HARDENED_USERCOPY, whether
|
||||
|
@ -912,7 +912,7 @@
|
|||
to workaround buggy firmware.
|
||||
|
||||
disable_ipv6= [IPV6]
|
||||
See Documentation/networking/ipv6.txt.
|
||||
See Documentation/networking/ipv6.rst.
|
||||
|
||||
disable_mtrr_cleanup [X86]
|
||||
The kernel tries to adjust MTRR layout from continuous
|
||||
|
@ -4910,7 +4910,7 @@
|
|||
Set the number of tcp_metrics_hash slots.
|
||||
Default value is 8192 or 16384 depending on total
|
||||
ram pages. This is used to specify the TCP metrics
|
||||
cache size. See Documentation/networking/ip-sysctl.txt
|
||||
cache size. See Documentation/networking/ip-sysctl.rst
|
||||
"tcp_no_metrics_save" section for more details.
|
||||
|
||||
tdfx= [HW,DRM]
|
||||
|
|
|
@ -353,8 +353,8 @@ socket's buffer. It will not take effect unless PF_UNIX flag is specified.
|
|||
|
||||
3. /proc/sys/net/ipv4 - IPV4 settings
|
||||
-------------------------------------
|
||||
Please see: Documentation/networking/ip-sysctl.txt and ipvs-sysctl.txt for
|
||||
descriptions of these entries.
|
||||
Please see: Documentation/networking/ip-sysctl.rst and
|
||||
Documentation/admin-guide/sysctl/net.rst for descriptions of these entries.
|
||||
|
||||
|
||||
4. Appletalk
|
||||
|
|
|
@ -7,7 +7,7 @@ Filter) facility, with a focus on the extended BPF version (eBPF).
|
|||
|
||||
This kernel side documentation is still work in progress. The main
|
||||
textual documentation is (for historical reasons) described in
|
||||
`Documentation/networking/filter.txt`_, which describe both classical
|
||||
`Documentation/networking/filter.rst`_, which describe both classical
|
||||
and extended BPF instruction-set.
|
||||
The Cilium project also maintains a `BPF and XDP Reference Guide`_
|
||||
that goes into great technical depth about the BPF Architecture.
|
||||
|
@ -59,7 +59,7 @@ Testing and debugging BPF
|
|||
|
||||
|
||||
.. Links:
|
||||
.. _Documentation/networking/filter.txt: ../networking/filter.txt
|
||||
.. _Documentation/networking/filter.rst: ../networking/filter.txt
|
||||
.. _man-pages: https://www.kernel.org/doc/man-pages/
|
||||
.. _bpf(2): http://man7.org/linux/man-pages/man2/bpf.2.html
|
||||
.. _BPF and XDP Reference Guide: http://cilium.readthedocs.io/en/latest/bpf/
|
||||
|
|
|
@ -1,18 +1,27 @@
|
|||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
==============
|
||||
6pack Protocol
|
||||
==============
|
||||
|
||||
This is the 6pack-mini-HOWTO, written by
|
||||
|
||||
Andreas Könsgen DG3KQ
|
||||
Internet: ajk@comnets.uni-bremen.de
|
||||
AMPR-net: dg3kq@db0pra.ampr.org
|
||||
AX.25: dg3kq@db0ach.#nrw.deu.eu
|
||||
|
||||
:Internet: ajk@comnets.uni-bremen.de
|
||||
:AMPR-net: dg3kq@db0pra.ampr.org
|
||||
:AX.25: dg3kq@db0ach.#nrw.deu.eu
|
||||
|
||||
Last update: April 7, 1998
|
||||
|
||||
1. What is 6pack, and what are the advantages to KISS?
|
||||
======================================================
|
||||
|
||||
6pack is a transmission protocol for data exchange between the PC and
|
||||
the TNC over a serial line. It can be used as an alternative to KISS.
|
||||
|
||||
6pack has two major advantages:
|
||||
|
||||
- The PC is given full control over the radio
|
||||
channel. Special control data is exchanged between the PC and the TNC so
|
||||
that the PC knows at any time if the TNC is receiving data, if a TNC
|
||||
|
@ -36,6 +45,7 @@ More details about 6pack are described in the file 6pack.ps that is located
|
|||
in the doc directory of the AX.25 utilities package.
|
||||
|
||||
2. Who has developed the 6pack protocol?
|
||||
========================================
|
||||
|
||||
The 6pack protocol has been developed by Ekki Plicht DF4OR, Henning Rech
|
||||
DF9IC and Gunter Jost DK7WJ. A driver for 6pack, written by Gunter Jost and
|
||||
|
@ -44,12 +54,14 @@ They have also written a firmware for TNCs to perform the 6pack
|
|||
protocol (see section 4 below).
|
||||
|
||||
3. Where can I get the latest version of 6pack for LinuX?
|
||||
=========================================================
|
||||
|
||||
At the moment, the 6pack stuff can obtained via anonymous ftp from
|
||||
db0bm.automation.fh-aachen.de. In the directory /incoming/dg3kq,
|
||||
there is a file named 6pack.tgz.
|
||||
|
||||
4. Preparing the TNC for 6pack operation
|
||||
========================================
|
||||
|
||||
To be able to use 6pack, a special firmware for the TNC is needed. The EPROM
|
||||
of a newly bought TNC does not contain 6pack, so you will have to
|
||||
|
@ -75,12 +87,14 @@ and the status LED are lit for about a second if the firmware initialises
|
|||
the TNC correctly.
|
||||
|
||||
5. Building and installing the 6pack driver
|
||||
===========================================
|
||||
|
||||
The driver has been tested with kernel version 2.1.90. Use with older
|
||||
kernels may lead to a compilation error because the interface to a kernel
|
||||
function has been changed in the 2.1.8x kernels.
|
||||
|
||||
How to turn on 6pack support:
|
||||
=============================
|
||||
|
||||
- In the linux kernel configuration program, select the code maturity level
|
||||
options menu and turn on the prompting for development drivers.
|
||||
|
@ -94,13 +108,13 @@ To use the driver, the kissattach program delivered with the AX.25 utilities
|
|||
has to be modified.
|
||||
|
||||
- Do a cd to the directory that holds the kissattach sources. Edit the
|
||||
kissattach.c file. At the top, insert the following lines:
|
||||
kissattach.c file. At the top, insert the following lines::
|
||||
|
||||
#ifndef N_6PACK
|
||||
#define N_6PACK (N_AX25+1)
|
||||
#endif
|
||||
|
||||
Then find the line
|
||||
Then find the line:
|
||||
|
||||
int disc = N_AX25;
|
||||
|
||||
|
@ -109,6 +123,7 @@ has to be modified.
|
|||
- Recompile kissattach. Rename it to spattach to avoid confusions.
|
||||
|
||||
Installing the driver:
|
||||
----------------------
|
||||
|
||||
- Do an insmod 6pack. Look at your /var/log/messages file to check if the
|
||||
module has printed its initialization message.
|
||||
|
@ -138,6 +153,7 @@ from the PC to the TNC over the serial line, the status LED if data is
|
|||
sent to the PC.
|
||||
|
||||
6. Known problems
|
||||
=================
|
||||
|
||||
When testing the driver with 2.0.3x kernels and
|
||||
operating with data rates on the radio channel of 9600 Baud or higher,
|
|
@ -1,6 +1,12 @@
|
|||
Altera Triple-Speed Ethernet MAC driver
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
Copyright (C) 2008-2014 Altera Corporation
|
||||
.. include:: <isonum.txt>
|
||||
|
||||
=======================================
|
||||
Altera Triple-Speed Ethernet MAC driver
|
||||
=======================================
|
||||
|
||||
Copyright |copy| 2008-2014 Altera Corporation
|
||||
|
||||
This is the driver for the Altera Triple-Speed Ethernet (TSE) controllers
|
||||
using the SGDMA and MSGDMA soft DMA IP components. The driver uses the
|
||||
|
@ -46,23 +52,33 @@ Jumbo frames are not supported at this time.
|
|||
The driver limits PHY operations to 10/100Mbps, and has not yet been fully
|
||||
tested for 1Gbps. This support will be added in a future maintenance update.
|
||||
|
||||
1) Kernel Configuration
|
||||
1. Kernel Configuration
|
||||
=======================
|
||||
|
||||
The kernel configuration option is ALTERA_TSE:
|
||||
|
||||
Device Drivers ---> Network device support ---> Ethernet driver support --->
|
||||
Altera Triple-Speed Ethernet MAC support (ALTERA_TSE)
|
||||
|
||||
2) Driver parameters list:
|
||||
debug: message level (0: no output, 16: all);
|
||||
dma_rx_num: Number of descriptors in the RX list (default is 64);
|
||||
dma_tx_num: Number of descriptors in the TX list (default is 64).
|
||||
2. Driver parameters list
|
||||
=========================
|
||||
|
||||
- debug: message level (0: no output, 16: all);
|
||||
- dma_rx_num: Number of descriptors in the RX list (default is 64);
|
||||
- dma_tx_num: Number of descriptors in the TX list (default is 64).
|
||||
|
||||
3. Command line options
|
||||
=======================
|
||||
|
||||
Driver parameters can be also passed in command line by using::
|
||||
|
||||
3) Command line options
|
||||
Driver parameters can be also passed in command line by using:
|
||||
altera_tse=dma_rx_num:128,dma_tx_num:512
|
||||
|
||||
4) Driver information and notes
|
||||
4. Driver information and notes
|
||||
===============================
|
||||
|
||||
4.1) Transmit process
|
||||
4.1. Transmit process
|
||||
---------------------
|
||||
When the driver's transmit routine is called by the kernel, it sets up a
|
||||
transmit descriptor by calling the underlying DMA transmit routine (SGDMA or
|
||||
MSGDMA), and initiates a transmit operation. Once the transmit is complete, an
|
||||
|
@ -70,7 +86,8 @@ interrupt is driven by the transmit DMA logic. The driver handles the transmit
|
|||
completion in the context of the interrupt handling chain by recycling
|
||||
resource required to send and track the requested transmit operation.
|
||||
|
||||
4.2) Receive process
|
||||
4.2. Receive process
|
||||
--------------------
|
||||
The driver will post receive buffers to the receive DMA logic during driver
|
||||
initialization. Receive buffers may or may not be queued depending upon the
|
||||
underlying DMA logic (MSGDMA is able queue receive buffers, SGDMA is not able
|
||||
|
@ -79,34 +96,39 @@ received, the DMA logic generates an interrupt. The driver handles a receive
|
|||
interrupt by obtaining the DMA receive logic status, reaping receive
|
||||
completions until no more receive completions are available.
|
||||
|
||||
4.3) Interrupt Mitigation
|
||||
4.3. Interrupt Mitigation
|
||||
-------------------------
|
||||
The driver is able to mitigate the number of its DMA interrupts
|
||||
using NAPI for receive operations. Interrupt mitigation is not yet supported
|
||||
for transmit operations, but will be added in a future maintenance release.
|
||||
|
||||
4.4) Ethtool support
|
||||
--------------------
|
||||
Ethtool is supported. Driver statistics and internal errors can be taken using:
|
||||
ethtool -S ethX command. It is possible to dump registers etc.
|
||||
|
||||
4.5) PHY Support
|
||||
----------------
|
||||
The driver is compatible with PAL to work with PHY and GPHY devices.
|
||||
|
||||
4.7) List of source files:
|
||||
o Kconfig
|
||||
o Makefile
|
||||
o altera_tse_main.c: main network device driver
|
||||
o altera_tse_ethtool.c: ethtool support
|
||||
o altera_tse.h: private driver structure and common definitions
|
||||
o altera_msgdma.h: MSGDMA implementation function definitions
|
||||
o altera_sgdma.h: SGDMA implementation function definitions
|
||||
o altera_msgdma.c: MSGDMA implementation
|
||||
o altera_sgdma.c: SGDMA implementation
|
||||
o altera_sgdmahw.h: SGDMA register and descriptor definitions
|
||||
o altera_msgdmahw.h: MSGDMA register and descriptor definitions
|
||||
o altera_utils.c: Driver utility functions
|
||||
o altera_utils.h: Driver utility function definitions
|
||||
--------------------------
|
||||
- Kconfig
|
||||
- Makefile
|
||||
- altera_tse_main.c: main network device driver
|
||||
- altera_tse_ethtool.c: ethtool support
|
||||
- altera_tse.h: private driver structure and common definitions
|
||||
- altera_msgdma.h: MSGDMA implementation function definitions
|
||||
- altera_sgdma.h: SGDMA implementation function definitions
|
||||
- altera_msgdma.c: MSGDMA implementation
|
||||
- altera_sgdma.c: SGDMA implementation
|
||||
- altera_sgdmahw.h: SGDMA register and descriptor definitions
|
||||
- altera_msgdmahw.h: MSGDMA register and descriptor definitions
|
||||
- altera_utils.c: Driver utility functions
|
||||
- altera_utils.h: Driver utility function definitions
|
||||
|
||||
5) Debug Information
|
||||
5. Debug Information
|
||||
====================
|
||||
|
||||
The driver exports debug information such as internal statistics,
|
||||
debug information, MAC and DMA registers etc.
|
||||
|
@ -118,17 +140,18 @@ or sees the MAC registers: e.g. using: ethtool -d ethX
|
|||
The developer can also use the "debug" module parameter to get
|
||||
further debug information.
|
||||
|
||||
6) Statistics Support
|
||||
6. Statistics Support
|
||||
=====================
|
||||
|
||||
The controller and driver support a mix of IEEE standard defined statistics,
|
||||
RFC defined statistics, and driver or Altera defined statistics. The four
|
||||
specifications containing the standard definitions for these statistics are
|
||||
as follows:
|
||||
|
||||
o IEEE 802.3-2012 - IEEE Standard for Ethernet.
|
||||
o RFC 2863 found at http://www.rfc-editor.org/rfc/rfc2863.txt.
|
||||
o RFC 2819 found at http://www.rfc-editor.org/rfc/rfc2819.txt.
|
||||
o Altera Triple Speed Ethernet User Guide, found at http://www.altera.com
|
||||
- IEEE 802.3-2012 - IEEE Standard for Ethernet.
|
||||
- RFC 2863 found at http://www.rfc-editor.org/rfc/rfc2863.txt.
|
||||
- RFC 2819 found at http://www.rfc-editor.org/rfc/rfc2819.txt.
|
||||
- Altera Triple Speed Ethernet User Guide, found at http://www.altera.com
|
||||
|
||||
The statistics supported by the TSE and the device driver are as follows:
|
||||
|
File diff suppressed because it is too large
Load Diff
|
@ -1,11 +1,18 @@
|
|||
----------------------------------------------------------------------------
|
||||
NOTE: See also arcnet-hardware.txt in this directory for jumper-setting
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
======
|
||||
ARCnet
|
||||
======
|
||||
|
||||
.. note::
|
||||
|
||||
See also arcnet-hardware.txt in this directory for jumper-setting
|
||||
and cabling information if you're like many of us and didn't happen to get a
|
||||
manual with your ARCnet card.
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
Since no one seems to listen to me otherwise, perhaps a poem will get your
|
||||
attention:
|
||||
attention::
|
||||
|
||||
This driver's getting fat and beefy,
|
||||
But my cat is still named Fifi.
|
||||
|
||||
|
@ -24,9 +31,7 @@ Come on, be a sport! Send me a success report!
|
|||
(hey, that was even better than my original poem... this is getting bad!)
|
||||
|
||||
|
||||
--------
|
||||
WARNING:
|
||||
--------
|
||||
.. warning::
|
||||
|
||||
If you don't e-mail me about your success/failure soon, I may be forced to
|
||||
start SINGING. And we don't want that, do we?
|
||||
|
@ -38,13 +43,8 @@ whether it's working or not.)
|
|||
|
||||
My e-mail address is: apenwarr@worldvisions.ca
|
||||
|
||||
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
|
||||
These are the ARCnet drivers for Linux.
|
||||
|
||||
|
||||
This new release (2.91) has been put together by David Woodhouse
|
||||
<dwmw2@infradead.org>, in an attempt to tidy up the driver after adding support
|
||||
for yet another chipset. Now the generic support has been separated from the
|
||||
|
@ -68,6 +68,7 @@ REAL NAME" to listserv@tichy.ch.uj.edu.pl. Then, to submit messages to the
|
|||
list, mail to linux-arcnet@tichy.ch.uj.edu.pl.
|
||||
|
||||
There are archives of the mailing list at:
|
||||
|
||||
http://epistolary.org/mailman/listinfo.cgi/arcnet
|
||||
|
||||
The people on linux-net@vger.kernel.org (now defunct, replaced by
|
||||
|
@ -80,15 +81,18 @@ Other Drivers and Info
|
|||
----------------------
|
||||
|
||||
You can try my ARCNET page on the World Wide Web at:
|
||||
|
||||
http://www.qis.net/~jschmitz/arcnet/
|
||||
|
||||
Also, SMC (one of the companies that makes ARCnet cards) has a WWW site you
|
||||
might be interested in, which includes several drivers for various cards
|
||||
including ARCnet. Try:
|
||||
|
||||
http://www.smc.com/
|
||||
|
||||
Performance Technologies makes various network software that supports
|
||||
ARCnet:
|
||||
|
||||
http://www.perftech.com/ or ftp to ftp.perftech.com.
|
||||
|
||||
Novell makes a networking stack for DOS which includes ARCnet drivers. Try
|
||||
|
@ -105,7 +109,8 @@ access.
|
|||
Installing the Driver
|
||||
---------------------
|
||||
|
||||
All you will need to do in order to install the driver is:
|
||||
All you will need to do in order to install the driver is::
|
||||
|
||||
make config
|
||||
(be sure to choose ARCnet in the network devices
|
||||
and at least one chipset driver.)
|
||||
|
@ -125,10 +130,12 @@ There are four chipset options:
|
|||
|
||||
This is the normal ARCnet card, which you've probably got. This is the only
|
||||
chipset driver which will autoprobe if not told where the card is.
|
||||
It following options on the command line:
|
||||
It following options on the command line::
|
||||
|
||||
com90xx=[<io>[,<irq>[,<shmem>]]][,<name>] | <name>
|
||||
|
||||
If you load the chipset support as a module, the options are:
|
||||
If you load the chipset support as a module, the options are::
|
||||
|
||||
io=<io> irq=<irq> shmem=<shmem> device=<name>
|
||||
|
||||
To disable the autoprobe, just specify "com90xx=" on the kernel command line.
|
||||
|
@ -140,10 +147,13 @@ This is the new chipset from SMC with support for promiscuous mode (packet
|
|||
sniffing), extra diagnostic information, etc. Unfortunately, there is no
|
||||
sensible method of autoprobing for these cards. You must specify the I/O
|
||||
address on the kernel command line.
|
||||
The command line options are:
|
||||
|
||||
The command line options are::
|
||||
|
||||
com20020=<io>[,<irq>[,<node_ID>[,backplane[,CKP[,timeout]]]]][,name]
|
||||
|
||||
If you load the chipset support as a module, the options are:
|
||||
If you load the chipset support as a module, the options are::
|
||||
|
||||
io=<io> irq=<irq> node=<node_ID> backplane=<backplane> clock=<CKP>
|
||||
timeout=<timeout> device=<name>
|
||||
|
||||
|
@ -160,7 +170,9 @@ you have a card which doesn't support shared memory, or (strangely) in case
|
|||
you have so many ARCnet cards in your machine that you run out of shmem slots.
|
||||
If you don't give the IO address on the kernel command line, then the driver
|
||||
will not find the card.
|
||||
The command line options are:
|
||||
|
||||
The command line options are::
|
||||
|
||||
com90io=<io>[,<irq>][,<name>]
|
||||
|
||||
If you load the chipset support as a module, the options are:
|
||||
|
@ -171,10 +183,12 @@ If you load the chipset support as a module, the options are:
|
|||
These are COM90xx chips which are _completely_ memory mapped. The support for
|
||||
these is not tested. If you have one, please mail the author with a success
|
||||
report. All options must be specified, except the device name.
|
||||
Command line options:
|
||||
Command line options::
|
||||
|
||||
arcrimi=<shmem>,<irq>,<node_ID>[,<name>]
|
||||
|
||||
If you load the chipset support as a module, the options are:
|
||||
If you load the chipset support as a module, the options are::
|
||||
|
||||
shmem=<shmem> irq=<irq> node=<node_ID> device=<name>
|
||||
|
||||
|
||||
|
@ -186,6 +200,8 @@ support" and to support for your ARCnet chipset if you want to use the
|
|||
loadable module. You can also say 'y' to "Generic ARCnet support" and 'm'
|
||||
to the chipset support if you wish.
|
||||
|
||||
::
|
||||
|
||||
make config
|
||||
make clean
|
||||
make zImage
|
||||
|
@ -196,7 +212,8 @@ you can specify various characteristics of your card on the command
|
|||
line. (In recent versions of the driver, autoprobing is much more reliable
|
||||
and works as a module, so most of this is now unnecessary.)
|
||||
|
||||
For example:
|
||||
For example::
|
||||
|
||||
cd /usr/src/linux/modules
|
||||
insmod arcnet.o
|
||||
insmod com90xx.o
|
||||
|
@ -228,21 +245,25 @@ ARCnet driver has somewhat suffered in this respect. COM90xx support, if
|
|||
compiled into the kernel, will (try to) autodetect all the installed cards.
|
||||
|
||||
If you have other cards, with support compiled into the kernel, then you can
|
||||
just repeat the options on the kernel command line, e.g.:
|
||||
just repeat the options on the kernel command line, e.g.::
|
||||
|
||||
LILO: linux com20020=0x2e0 com20020=0x380 com90io=0x260
|
||||
|
||||
If you have the chipset support built as a loadable module, then you need to
|
||||
do something like this:
|
||||
do something like this::
|
||||
|
||||
insmod -o arc0 com90xx
|
||||
insmod -o arc1 com20020 io=0x2e0
|
||||
insmod -o arc2 com90xx
|
||||
|
||||
The ARCnet drivers will now sort out their names automatically.
|
||||
|
||||
|
||||
How do I get it to work with...?
|
||||
--------------------------------
|
||||
|
||||
NFS: Should be fine linux->linux, just pretend you're using Ethernet cards.
|
||||
NFS:
|
||||
Should be fine linux->linux, just pretend you're using Ethernet cards.
|
||||
oak.oakland.edu:/simtel/msdos/nfs has some nice DOS clients. There
|
||||
is also a DOS-based NFS server called SOSS. It doesn't multitask
|
||||
quite the way Linux does (actually, it doesn't multitask AT ALL) but
|
||||
|
@ -257,16 +278,19 @@ NFS: Should be fine linux->linux, just pretend you're using Ethernet cards.
|
|||
don't know why the defaults on the Amiga didn't work; write to me if
|
||||
you know more.
|
||||
|
||||
DOS: If you're using the freeware arcether.com, you might want to install
|
||||
DOS:
|
||||
If you're using the freeware arcether.com, you might want to install
|
||||
the driver patch from my web page. It helps with PC/TCP, and also
|
||||
can get arcether to load if it timed out too quickly during
|
||||
initialization. In fact, if you use it on a 386+ you REALLY need
|
||||
the patch, really.
|
||||
|
||||
Windows: See DOS :) Trumpet Winsock works fine with either the Novell or
|
||||
Windows:
|
||||
See DOS :) Trumpet Winsock works fine with either the Novell or
|
||||
Arcether client, assuming you remember to load winpkt of course.
|
||||
|
||||
LAN Manager and Windows for Workgroups: These programs use protocols that
|
||||
LAN Manager and Windows for Workgroups:
|
||||
These programs use protocols that
|
||||
are incompatible with the Internet standard. They try to pretend
|
||||
the cards are Ethernet, and confuse everyone else on the network.
|
||||
|
||||
|
@ -278,7 +302,8 @@ LAN Manager and Windows for Workgroups: These programs use protocols that
|
|||
interface quite nicely with TCP/IP-based WfWg or Lan Manager
|
||||
networks.
|
||||
|
||||
Windows 95: Tools are included with Win95 that let you use either the LANMAN
|
||||
Windows 95:
|
||||
Tools are included with Win95 that let you use either the LANMAN
|
||||
style network drivers (NDIS) or Novell drivers (ODI) to handle your
|
||||
ARCnet packets. If you use ODI, you'll need to use the 'arc0'
|
||||
device with Linux. If you use NDIS, then try the 'arc0e' device.
|
||||
|
@ -286,7 +311,8 @@ Windows 95: Tools are included with Win95 that let you use either the LANMAN
|
|||
you're completely insane, and/or you need to build some kind of
|
||||
hybrid network that uses both encapsulation types.
|
||||
|
||||
OS/2: I've been told it works under Warp Connect with an ARCnet driver from
|
||||
OS/2:
|
||||
I've been told it works under Warp Connect with an ARCnet driver from
|
||||
SMC. You need to use the 'arc0e' interface for this. If you get
|
||||
the SMC driver to work with the TCP/IP stuff included in the
|
||||
"normal" Warp Bonus Pack, let me know.
|
||||
|
@ -295,7 +321,8 @@ OS/2: I've been told it works under Warp Connect with an ARCnet driver from
|
|||
which should use the same protocol as WfWg does. I had no luck
|
||||
installing it under Warp, however. Please mail me with any results.
|
||||
|
||||
NetBSD/AmiTCP: These use an old version of the Internet standard ARCnet
|
||||
NetBSD/AmiTCP:
|
||||
These use an old version of the Internet standard ARCnet
|
||||
protocol (RFC1051) which is compatible with the Linux driver v2.10
|
||||
ALPHA and above using the arc0s device. (See "Multiprotocol ARCnet"
|
||||
below.) ** Newer versions of NetBSD apparently support RFC1201.
|
||||
|
@ -307,7 +334,8 @@ Using Multiprotocol ARCnet
|
|||
The ARCnet driver v2.10 ALPHA supports three protocols, each on its own
|
||||
"virtual network device":
|
||||
|
||||
arc0 - RFC1201 protocol, the official Internet standard which just
|
||||
====== ===============================================================
|
||||
arc0 RFC1201 protocol, the official Internet standard which just
|
||||
happens to be 100% compatible with Novell's TRXNET driver.
|
||||
Version 1.00 of the ARCnet driver supported _only_ this
|
||||
protocol. arc0 is the fastest of the three protocols (for
|
||||
|
@ -316,7 +344,7 @@ The ARCnet driver v2.10 ALPHA supports three protocols, each on its own
|
|||
Unless you have a specific need to use a different protocol,
|
||||
I strongly suggest that you stick with this one.
|
||||
|
||||
arc0e - "Ethernet-Encapsulation" which sends packets over ARCnet
|
||||
arc0e "Ethernet-Encapsulation" which sends packets over ARCnet
|
||||
that are actually a lot like Ethernet packets, including the
|
||||
6-byte hardware addresses. This protocol is compatible with
|
||||
Microsoft's NDIS ARCnet driver, like the one in WfWg and
|
||||
|
@ -329,7 +357,7 @@ The ARCnet driver v2.10 ALPHA supports three protocols, each on its own
|
|||
reasons yet to be determined. (Probably it's the smaller
|
||||
MTU that does it.)
|
||||
|
||||
arc0s - The "[s]imple" RFC1051 protocol is the "previous" Internet
|
||||
arc0s The "[s]imple" RFC1051 protocol is the "previous" Internet
|
||||
standard that is completely incompatible with the new
|
||||
standard. Some software today, however, continues to
|
||||
support the old standard (and only the old standard)
|
||||
|
@ -341,6 +369,7 @@ The ARCnet driver v2.10 ALPHA supports three protocols, each on its own
|
|||
|
||||
The arc0s support was contributed by Tomasz Motylewski
|
||||
and modified somewhat by me. Bugs are probably my fault.
|
||||
====== ===============================================================
|
||||
|
||||
You can choose not to compile arc0e and arc0s into the driver if you want -
|
||||
this will save you a bit of memory and avoid confusion when eg. trying to
|
||||
|
@ -359,13 +388,15 @@ can set up your network then:
|
|||
only arc0 unless you have a good reason (like some other software, ie.
|
||||
WfWg, that only works with arc0e).
|
||||
|
||||
If you need only arc0, then the following commands should get you going:
|
||||
If you need only arc0, then the following commands should get you going::
|
||||
|
||||
ifconfig arc0 MY.IP.ADD.RESS
|
||||
route add MY.IP.ADD.RESS arc0
|
||||
route add -net SUB.NET.ADD.RESS arc0
|
||||
[add other local routes here]
|
||||
|
||||
If you need arc0e (and only arc0e), it's a little different:
|
||||
If you need arc0e (and only arc0e), it's a little different::
|
||||
|
||||
ifconfig arc0 MY.IP.ADD.RESS
|
||||
ifconfig arc0e MY.IP.ADD.RESS
|
||||
route add MY.IP.ADD.RESS arc0e
|
||||
|
@ -393,11 +424,13 @@ can set up your network then:
|
|||
|
||||
To start with, take a simple network with just insight and freedom.
|
||||
Insight needs to:
|
||||
|
||||
- talk to freedom via RFC1201 (arc0) protocol, because I like it
|
||||
more and it's faster.
|
||||
- use freedom as its Internet gateway.
|
||||
|
||||
That's pretty easy to do. Set up insight like this:
|
||||
That's pretty easy to do. Set up insight like this::
|
||||
|
||||
ifconfig arc0 insight
|
||||
route add insight arc0
|
||||
route add freedom arc0 /* I would use the subnet here (like I said
|
||||
|
@ -408,7 +441,8 @@ can set up your network then:
|
|||
things. */
|
||||
route add default gw freedom
|
||||
|
||||
And freedom gets configured like so:
|
||||
And freedom gets configured like so::
|
||||
|
||||
ifconfig arc0 freedom
|
||||
route add freedom arc0
|
||||
route add insight arc0
|
||||
|
@ -436,11 +470,12 @@ can set up your network then:
|
|||
the fact that both freedom and insight (courtesy of the arc0e device)
|
||||
could understand a direct transmission.
|
||||
|
||||
I compensate by giving freedom an extra IP address - aliased 'gatekeeper'
|
||||
- that is on my private subnet, the same subnet that patience is on. I
|
||||
I compensate by giving freedom an extra IP address - aliased 'gatekeeper' -
|
||||
that is on my private subnet, the same subnet that patience is on. I
|
||||
then define gatekeeper to be the default gateway for patience.
|
||||
|
||||
To configure freedom (in addition to the commands above):
|
||||
To configure freedom (in addition to the commands above)::
|
||||
|
||||
ifconfig arc0e gatekeeper
|
||||
route add gatekeeper arc0e
|
||||
route add patience arc0e
|
||||
|
@ -467,7 +502,7 @@ can set up your network then:
|
|||
hosts that would normally not be able to communicate at all.
|
||||
|
||||
For those who like diagrams, I have created two "virtual subnets" on the
|
||||
same physical ARCnet wire. You can picture it like this:
|
||||
same physical ARCnet wire. You can picture it like this::
|
||||
|
||||
|
||||
[RFC1201 NETWORK] [ETHER-ENCAP NETWORK]
|
||||
|
@ -491,6 +526,7 @@ It works: what now?
|
|||
Send mail describing your setup, preferably including driver version, kernel
|
||||
version, ARCnet card model, CPU type, number of systems on your network, and
|
||||
list of software in use to me at the following address:
|
||||
|
||||
apenwarr@worldvisions.ca
|
||||
|
||||
I do send (sometimes automated) replies to all messages I receive. My email
|
||||
|
@ -535,9 +571,11 @@ decides that the driver is broken). During a transmit, unused parts of the
|
|||
buffer will be cleared to 0x42 as well. This is to make it easier to figure
|
||||
out which bytes are being used by a packet.
|
||||
|
||||
You can change the debug level without recompiling the kernel by typing:
|
||||
You can change the debug level without recompiling the kernel by typing::
|
||||
|
||||
ifconfig arc0 down metric 1xxx
|
||||
/etc/rc.d/rc.inet1
|
||||
|
||||
where "xxx" is the debug level you want. For example, "metric 1015" would put
|
||||
you at debug level 15. Debug level 7 is currently the default.
|
||||
|
|
@ -1,3 +1,9 @@
|
|||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
===
|
||||
ATM
|
||||
===
|
||||
|
||||
In order to use anything but the most primitive functions of ATM,
|
||||
several user-mode programs are required to assist the kernel. These
|
||||
programs and related material can be found via the ATM on Linux Web
|
|
@ -1,3 +1,9 @@
|
|||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
=====
|
||||
AX.25
|
||||
=====
|
||||
|
||||
To use the amateur radio protocols within Linux you will need to get a
|
||||
suitable copy of the AX.25 Utilities. More detailed information about
|
||||
AX.25, NET/ROM and ROSE, associated programs and and utilities can be
|
|
@ -1,8 +1,12 @@
|
|||
LINUX DRIVERS FOR BAYCOM MODEMS
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
===============================
|
||||
Linux Drivers for Baycom Modems
|
||||
===============================
|
||||
|
||||
Thomas M. Sailer, HB9JNX/AE4WA, <sailer@ife.ee.ethz.ch>
|
||||
|
||||
!!NEW!! (04/98) The drivers for the baycom modems have been split into
|
||||
The drivers for the baycom modems have been split into
|
||||
separate drivers as they did not share any code, and the driver
|
||||
and device names have changed.
|
||||
|
||||
|
@ -10,10 +14,11 @@ This document describes the Linux Kernel Drivers for simple Baycom style
|
|||
amateur radio modems.
|
||||
|
||||
The following drivers are available:
|
||||
====================================
|
||||
|
||||
baycom_ser_fdx:
|
||||
This driver supports the SER12 modems either full or half duplex.
|
||||
Its baud rate may be changed via the `baud' module parameter,
|
||||
Its baud rate may be changed via the ``baud`` module parameter,
|
||||
therefore it supports just about every bit bang modem on a
|
||||
serial port. Its devices are called bcsf0 through bcsf3.
|
||||
This is the recommended driver for SER12 type modems,
|
||||
|
@ -37,7 +42,8 @@ baycom_epp:
|
|||
|
||||
The following modems are supported:
|
||||
|
||||
ser12: This is a very simple 1200 baud AFSK modem. The modem consists only
|
||||
======= ========================================================================
|
||||
ser12 This is a very simple 1200 baud AFSK modem. The modem consists only
|
||||
of a modulator/demodulator chip, usually a TI TCM3105. The computer
|
||||
is responsible for regenerating the receiver bit clock, as well as
|
||||
for handling the HDLC protocol. The modem connects to a serial port,
|
||||
|
@ -45,7 +51,7 @@ ser12: This is a very simple 1200 baud AFSK modem. The modem consists only
|
|||
port, the kernel driver for serial ports cannot be used, and this
|
||||
driver only supports standard serial hardware (8250, 16450, 16550)
|
||||
|
||||
par96: This is a modem for 9600 baud FSK compatible to the G3RUH standard.
|
||||
par96 This is a modem for 9600 baud FSK compatible to the G3RUH standard.
|
||||
The modem does all the filtering and regenerates the receiver clock.
|
||||
Data is transferred from and to the PC via a shift register.
|
||||
The shift register is filled with 16 bits and an interrupt is signalled.
|
||||
|
@ -54,18 +60,19 @@ par96: This is a modem for 9600 baud FSK compatible to the G3RUH standard.
|
|||
implementation of the HDLC protocol and the scrambler polynomial to
|
||||
the PC.
|
||||
|
||||
picpar: This is a redesign of the par96 modem by Henning Rech, DF9IC. The modem
|
||||
picpar This is a redesign of the par96 modem by Henning Rech, DF9IC. The modem
|
||||
is protocol compatible to par96, but uses only three low power ICs
|
||||
and can therefore be fed from the parallel port and does not require
|
||||
an additional power supply. Furthermore, it incorporates a carrier
|
||||
detect circuitry.
|
||||
|
||||
EPP: This is a high-speed modem adaptor that connects to an enhanced parallel port.
|
||||
EPP This is a high-speed modem adaptor that connects to an enhanced parallel
|
||||
port.
|
||||
|
||||
Its target audience is users working over a high speed hub (76.8kbit/s).
|
||||
|
||||
eppfpga: This is a redesign of the EPP adaptor.
|
||||
|
||||
|
||||
eppfpga This is a redesign of the EPP adaptor.
|
||||
======= ========================================================================
|
||||
|
||||
All of the above modems only support half duplex communications. However,
|
||||
the driver supports the KISS (see below) fullduplex command. It then simply
|
||||
|
@ -76,6 +83,7 @@ access protocol.
|
|||
|
||||
|
||||
The Interface of the drivers
|
||||
============================
|
||||
|
||||
Unlike previous drivers, these drivers are no longer character devices,
|
||||
but they are now true kernel network interfaces. Installation is therefore
|
||||
|
@ -88,20 +96,22 @@ me for WAMPES which allows attaching a kernel network interface directly.
|
|||
|
||||
|
||||
Configuring the driver
|
||||
======================
|
||||
|
||||
Every time a driver is inserted into the kernel, it has to know which
|
||||
modems it should access at which ports. This can be done with the setbaycom
|
||||
utility. If you are only using one modem, you can also configure the
|
||||
driver from the insmod command line (or by means of an option line in
|
||||
/etc/modprobe.d/*.conf).
|
||||
``/etc/modprobe.d/*.conf``).
|
||||
|
||||
Examples::
|
||||
|
||||
Examples:
|
||||
modprobe baycom_ser_fdx mode="ser12*" iobase=0x3f8 irq=4
|
||||
sethdlc -i bcsf0 -p mode "ser12*" io 0x3f8 irq 4
|
||||
|
||||
Both lines configure the first port to drive a ser12 modem at the first
|
||||
serial port (COM1 under DOS). The * in the mode parameter instructs the driver to use
|
||||
the software DCD algorithm (see below).
|
||||
serial port (COM1 under DOS). The * in the mode parameter instructs the driver
|
||||
to use the software DCD algorithm (see below)::
|
||||
|
||||
insmod baycom_par mode="picpar" iobase=0x378
|
||||
sethdlc -i bcp0 -p mode "picpar" io 0x378
|
||||
|
@ -115,29 +125,33 @@ Note that both utilities interpret the values slightly differently.
|
|||
|
||||
|
||||
Hardware DCD versus Software DCD
|
||||
================================
|
||||
|
||||
To avoid collisions on the air, the driver must know when the channel is
|
||||
busy. This is the task of the DCD circuitry/software. The driver may either
|
||||
utilise a software DCD algorithm (options=1) or use a DCD signal from
|
||||
the hardware (options=0).
|
||||
|
||||
ser12: if software DCD is utilised, the radio's squelch should always be
|
||||
======= =================================================================
|
||||
ser12 if software DCD is utilised, the radio's squelch should always be
|
||||
open. It is highly recommended to use the software DCD algorithm,
|
||||
as it is much faster than most hardware squelch circuitry. The
|
||||
disadvantage is a slightly higher load on the system.
|
||||
|
||||
par96: the software DCD algorithm for this type of modem is rather poor.
|
||||
par96 the software DCD algorithm for this type of modem is rather poor.
|
||||
The modem simply does not provide enough information to implement
|
||||
a reasonable DCD algorithm in software. Therefore, if your radio
|
||||
feeds the DCD input of the PAR96 modem, the use of the hardware
|
||||
DCD circuitry is recommended.
|
||||
|
||||
picpar: the picpar modem features a builtin DCD hardware, which is highly
|
||||
picpar the picpar modem features a builtin DCD hardware, which is highly
|
||||
recommended.
|
||||
======= =================================================================
|
||||
|
||||
|
||||
|
||||
Compatibility with the rest of the Linux kernel
|
||||
===============================================
|
||||
|
||||
The serial driver and the baycom serial drivers compete
|
||||
for the same hardware resources. Of course only one driver can access a given
|
||||
|
@ -154,5 +168,7 @@ The parallel port drivers (baycom_par, baycom_epp) now use the parport subsystem
|
|||
to arbitrate the ports between different client drivers.
|
||||
|
||||
vy 73s de
|
||||
|
||||
Tom Sailer, sailer@ife.ee.ethz.ch
|
||||
|
||||
hb9jnx @ hb9w.ampr.org
|
|
@ -1,10 +1,15 @@
|
|||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
===================================
|
||||
Linux Ethernet Bonding Driver HOWTO
|
||||
===================================
|
||||
|
||||
Latest update: 27 April 2011
|
||||
|
||||
Initial release: Thomas Davis <tadavis at lbl.gov>
|
||||
|
||||
Corrections, HA extensions: 2000/10/03-15:
|
||||
|
||||
- Willy Tarreau <willy at meta-x.org>
|
||||
- Constantine Gavrilov <const-g at xpert.com>
|
||||
- Chad N. Tindel <ctindel at ieee dot org>
|
||||
|
@ -13,6 +18,7 @@ Corrections, HA extensions : 2000/10/03-15 :
|
|||
|
||||
Reorganized and updated Feb 2005 by Jay Vosburgh
|
||||
Added Sysfs information: 2006/04/24
|
||||
|
||||
- Mitch Williams <mitch.a.williams at intel.com>
|
||||
|
||||
Introduction
|
||||
|
@ -32,8 +38,7 @@ with this version of the driver.
|
|||
For new versions of the driver, updated userspace tools, and
|
||||
who to ask for help, please follow the links at the end of this file.
|
||||
|
||||
Table of Contents
|
||||
=================
|
||||
.. Table of Contents
|
||||
|
||||
1. Bonding Driver Installation
|
||||
|
||||
|
@ -127,7 +132,7 @@ to the driver or configure more than one bonding device.
|
|||
Build and install the new kernel and modules.
|
||||
|
||||
1.2 Bonding Control Utility
|
||||
-------------------------------------
|
||||
---------------------------
|
||||
|
||||
It is recommended to configure bonding via iproute2 (netlink)
|
||||
or sysfs, the old ifenslave control utility is obsolete.
|
||||
|
@ -140,7 +145,7 @@ bonding module at load time, or are specified via sysfs.
|
|||
|
||||
Module options may be given as command line arguments to the
|
||||
insmod or modprobe command, but are usually specified in either the
|
||||
/etc/modprobe.d/*.conf configuration files, or in a distro-specific
|
||||
``/etc/modprobe.d/*.conf`` configuration files, or in a distro-specific
|
||||
configuration file (some of which are detailed in the next section).
|
||||
|
||||
Details on bonding support for sysfs is provided in the
|
||||
|
@ -246,10 +251,13 @@ ad_user_port_key
|
|||
|
||||
In an AD system, the port-key has three parts as shown below -
|
||||
|
||||
===== ============
|
||||
Bits Use
|
||||
===== ============
|
||||
00 Duplex
|
||||
01-05 Speed
|
||||
06-15 User-defined
|
||||
===== ============
|
||||
|
||||
This defines the upper 10 bits of the port key. The values can be
|
||||
from 0 - 1023. If not given, the system defaults to 0.
|
||||
|
@ -699,7 +707,7 @@ mode
|
|||
swapped with the new curr_active_slave that was
|
||||
chosen.
|
||||
|
||||
num_grat_arp
|
||||
num_grat_arp,
|
||||
num_unsol_na
|
||||
|
||||
Specify the number of peer notifications (gratuitous ARPs and
|
||||
|
@ -998,7 +1006,7 @@ Determining this is fairly straightforward.
|
|||
If this file is present in your system, then your system use interfaces. See
|
||||
Configuration with Interfaces Support.
|
||||
|
||||
Else, issue the command:
|
||||
Else, issue the command::
|
||||
|
||||
$ rpm -qf /sbin/ifup
|
||||
|
||||
|
@ -1007,7 +1015,7 @@ $ rpm -qf /sbin/ifup
|
|||
package that provides your network initialization scripts.
|
||||
|
||||
Next, to determine if your installation supports bonding,
|
||||
issue the command:
|
||||
issue the command::
|
||||
|
||||
$ grep ifenslave /sbin/ifup
|
||||
|
||||
|
@ -1031,7 +1039,7 @@ yast2 sysconfig configuration utility. The goal is for to create an
|
|||
ifcfg-id file for each slave device. The simplest way to accomplish
|
||||
this is to configure the devices for DHCP (this is only to get the
|
||||
file ifcfg-id file created; see below for some issues with DHCP). The
|
||||
name of the configuration file for each device will be of the form:
|
||||
name of the configuration file for each device will be of the form::
|
||||
|
||||
ifcfg-id-xx:xx:xx:xx:xx:xx
|
||||
|
||||
|
@ -1042,7 +1050,7 @@ the device's permanent MAC address.
|
|||
created, it is necessary to edit the configuration files for the slave
|
||||
devices (the MAC addresses correspond to those of the slave devices).
|
||||
Before editing, the file will contain multiple lines, and will look
|
||||
something like this:
|
||||
something like this::
|
||||
|
||||
BOOTPROTO='dhcp'
|
||||
STARTMODE='on'
|
||||
|
@ -1050,7 +1058,7 @@ USERCTL='no'
|
|||
UNIQUE='XNzu.WeZGOGF+4wE'
|
||||
_nm_name='bus-pci-0001:61:01.0'
|
||||
|
||||
Change the BOOTPROTO and STARTMODE lines to the following:
|
||||
Change the BOOTPROTO and STARTMODE lines to the following::
|
||||
|
||||
BOOTPROTO='none'
|
||||
STARTMODE='off'
|
||||
|
@ -1066,7 +1074,7 @@ ifcfg-bond0, the second is ifcfg-bond1, and so on. The sysconfig
|
|||
network configuration system will correctly start multiple instances
|
||||
of bonding.
|
||||
|
||||
The contents of the ifcfg-bondX file is as follows:
|
||||
The contents of the ifcfg-bondX file is as follows::
|
||||
|
||||
BOOTPROTO="static"
|
||||
BROADCAST="10.0.2.255"
|
||||
|
@ -1086,18 +1094,21 @@ values with the appropriate values for your network.
|
|||
The STARTMODE specifies when the device is brought online.
|
||||
The possible values are:
|
||||
|
||||
onboot: The device is started at boot time. If you're not
|
||||
======== ======================================================
|
||||
onboot The device is started at boot time. If you're not
|
||||
sure, this is probably what you want.
|
||||
|
||||
manual: The device is started only when ifup is called
|
||||
manual The device is started only when ifup is called
|
||||
manually. Bonding devices may be configured this
|
||||
way if you do not wish them to start automatically
|
||||
at boot for some reason.
|
||||
|
||||
hotplug: The device is started by a hotplug event. This is not
|
||||
hotplug The device is started by a hotplug event. This is not
|
||||
a valid choice for a bonding device.
|
||||
|
||||
off or ignore: The device configuration is ignored.
|
||||
off or The device configuration is ignored.
|
||||
ignore
|
||||
======== ======================================================
|
||||
|
||||
The line BONDING_MASTER='yes' indicates that the device is a
|
||||
bonding master device. The only useful value is "yes."
|
||||
|
@ -1122,7 +1133,7 @@ configurations will choose one or the other for all slave devices.
|
|||
|
||||
When all configuration files have been modified or created,
|
||||
networking must be restarted for the configuration changes to take
|
||||
effect. This can be accomplished via the following:
|
||||
effect. This can be accomplished via the following::
|
||||
|
||||
# /etc/init.d/network restart
|
||||
|
||||
|
@ -1137,11 +1148,11 @@ devices). It is necessary to edit the configuration file by hand to
|
|||
change the bonding configuration.
|
||||
|
||||
Additional general options and details of the ifcfg file
|
||||
format can be found in an example ifcfg template file:
|
||||
format can be found in an example ifcfg template file::
|
||||
|
||||
/etc/sysconfig/network/ifcfg.template
|
||||
|
||||
Note that the template does not document the various BONDING_
|
||||
Note that the template does not document the various ``BONDING_*``
|
||||
settings described above, but does describe many of the other options.
|
||||
|
||||
3.1.1 Using DHCP with Sysconfig
|
||||
|
@ -1167,7 +1178,7 @@ ifcfg-bondX files.
|
|||
|
||||
Because the sysconfig scripts supply the bonding module
|
||||
options in the ifcfg-bondX file, it is not necessary to add them to
|
||||
the system /etc/modules.d/*.conf configuration files.
|
||||
the system ``/etc/modules.d/*.conf`` configuration files.
|
||||
|
||||
3.2 Configuration with Initscripts Support
|
||||
------------------------------------------
|
||||
|
@ -1191,7 +1202,7 @@ a bondX link. Network script files are located in the directory:
|
|||
The file name must be prefixed with "ifcfg-eth" and suffixed
|
||||
with the adapter's physical adapter number. For example, the script
|
||||
for eth0 would be named /etc/sysconfig/network-scripts/ifcfg-eth0.
|
||||
Place the following text in the file:
|
||||
Place the following text in the file::
|
||||
|
||||
DEVICE=eth0
|
||||
USERCTL=no
|
||||
|
@ -1212,7 +1223,7 @@ second is bond1, and so on.
|
|||
script will be /etc/sysconfig/network-scripts/ifcfg-bondX where X is
|
||||
the number of the bond. For bond0 the file is named "ifcfg-bond0",
|
||||
for bond1 it is named "ifcfg-bond1", and so on. Within that file,
|
||||
place the following text:
|
||||
place the following text::
|
||||
|
||||
DEVICE=bond0
|
||||
IPADDR=192.168.1.1
|
||||
|
@ -1229,7 +1240,7 @@ NETMASK, NETWORK and BROADCAST) to match your network configuration.
|
|||
For later versions of initscripts, such as that found with Fedora
|
||||
7 (or later) and Red Hat Enterprise Linux version 5 (or later), it is possible,
|
||||
and, indeed, preferable, to specify the bonding options in the ifcfg-bond0
|
||||
file, e.g. a line of the format:
|
||||
file, e.g. a line of the format::
|
||||
|
||||
BONDING_OPTS="mode=active-backup arp_interval=60 arp_ip_target=192.168.1.254"
|
||||
|
||||
|
@ -1239,12 +1250,13 @@ except for the arp_ip_target field when using versions of initscripts older
|
|||
than and 8.57 (Fedora 8) and 8.45.19 (Red Hat Enterprise Linux 5.2). When
|
||||
using older versions each target should be included as a separate option and
|
||||
should be preceded by a '+' to indicate it should be added to the list of
|
||||
queried targets, e.g.,
|
||||
queried targets, e.g.,::
|
||||
|
||||
arp_ip_target=+192.168.1.1 arp_ip_target=+192.168.1.2
|
||||
|
||||
is the proper syntax to specify multiple targets. When specifying
|
||||
options via BONDING_OPTS, it is not necessary to edit /etc/modprobe.d/*.conf.
|
||||
options via BONDING_OPTS, it is not necessary to edit
|
||||
``/etc/modprobe.d/*.conf``.
|
||||
|
||||
For even older versions of initscripts that do not support
|
||||
BONDING_OPTS, it is necessary to edit /etc/modprobe.d/*.conf, depending upon
|
||||
|
@ -1305,7 +1317,7 @@ the global init script differs; for sysconfig, it is
|
|||
For example, if you wanted to make a simple bond of two e100
|
||||
devices (presumed to be eth0 and eth1), and have it persist across
|
||||
reboots, edit the appropriate file (/etc/init.d/boot.local or
|
||||
/etc/rc.d/rc.local), and add the following:
|
||||
/etc/rc.d/rc.local), and add the following::
|
||||
|
||||
modprobe bonding mode=balance-alb miimon=100
|
||||
modprobe e100
|
||||
|
@ -1319,11 +1331,11 @@ values for your configuration.
|
|||
|
||||
Unfortunately, this method will not provide support for the
|
||||
ifup and ifdown scripts on the bond devices. To reload the bonding
|
||||
configuration, it is necessary to run the initialization script, e.g.,
|
||||
configuration, it is necessary to run the initialization script, e.g.,::
|
||||
|
||||
# /etc/init.d/boot.local
|
||||
|
||||
or
|
||||
or::
|
||||
|
||||
# /etc/rc.d/rc.local
|
||||
|
||||
|
@ -1335,7 +1347,7 @@ enabled without re-running the entire global init script.
|
|||
To shut down the bonding devices, it is necessary to first
|
||||
mark the bonding device itself as being down, then remove the
|
||||
appropriate device driver modules. For our example above, you can do
|
||||
the following:
|
||||
the following::
|
||||
|
||||
# ifconfig bond0 down
|
||||
# rmmod bonding
|
||||
|
@ -1372,7 +1384,7 @@ network initialization scripts.
|
|||
specify a different name for each instance (the module loading system
|
||||
requires that every loaded module, even multiple instances of the same
|
||||
module, have a unique name). This is accomplished by supplying multiple
|
||||
sets of bonding options in /etc/modprobe.d/*.conf, for example:
|
||||
sets of bonding options in ``/etc/modprobe.d/*.conf``, for example::
|
||||
|
||||
alias bond0 bonding
|
||||
options bond0 -o bond0 mode=balance-rr miimon=100
|
||||
|
@ -1388,7 +1400,7 @@ bond1 device in balance-alb mode with an miimon of 50.
|
|||
In some circumstances (typically with older distributions),
|
||||
the above does not work, and the second bonding instance never sees
|
||||
its options. In that case, the second options line can be substituted
|
||||
as follows:
|
||||
as follows::
|
||||
|
||||
install bond1 /sbin/modprobe --ignore-install bonding -o bond1 \
|
||||
mode=balance-alb miimon=50
|
||||
|
@ -1426,16 +1438,21 @@ example paths accordingly.
|
|||
|
||||
Creating and Destroying Bonds
|
||||
-----------------------------
|
||||
To add a new bond foo:
|
||||
To add a new bond foo::
|
||||
|
||||
# echo +foo > /sys/class/net/bonding_masters
|
||||
|
||||
To remove an existing bond bar:
|
||||
To remove an existing bond bar::
|
||||
|
||||
# echo -bar > /sys/class/net/bonding_masters
|
||||
|
||||
To show all existing bonds:
|
||||
To show all existing bonds::
|
||||
|
||||
# cat /sys/class/net/bonding_masters
|
||||
|
||||
NOTE: due to 4K size limitation of sysfs files, this list may be
|
||||
.. note::
|
||||
|
||||
due to 4K size limitation of sysfs files, this list may be
|
||||
truncated if you have more than a few hundred bonds. This is unlikely
|
||||
to occur under normal operating conditions.
|
||||
|
||||
|
@ -1445,11 +1462,13 @@ Adding and Removing Slaves
|
|||
/sys/class/net/<bond>/bonding/slaves. The semantics for this file
|
||||
are the same as for the bonding_masters file.
|
||||
|
||||
To enslave interface eth0 to bond bond0:
|
||||
To enslave interface eth0 to bond bond0::
|
||||
|
||||
# ifconfig bond0 up
|
||||
# echo +eth0 > /sys/class/net/bond0/bonding/slaves
|
||||
|
||||
To free slave eth0 from bond bond0:
|
||||
To free slave eth0 from bond bond0::
|
||||
|
||||
# echo -eth0 > /sys/class/net/bond0/bonding/slaves
|
||||
|
||||
When an interface is enslaved to a bond, symlinks between the
|
||||
|
@ -1477,30 +1496,46 @@ current setting, simply cat the appropriate file.
|
|||
guidelines for each parameter, see the appropriate section in this
|
||||
document.
|
||||
|
||||
To configure bond0 for balance-alb mode:
|
||||
To configure bond0 for balance-alb mode::
|
||||
|
||||
# ifconfig bond0 down
|
||||
# echo 6 > /sys/class/net/bond0/bonding/mode
|
||||
- or -
|
||||
# echo balance-alb > /sys/class/net/bond0/bonding/mode
|
||||
NOTE: The bond interface must be down before the mode can be
|
||||
changed.
|
||||
|
||||
To enable MII monitoring on bond0 with a 1 second interval:
|
||||
.. note::
|
||||
|
||||
The bond interface must be down before the mode can be changed.
|
||||
|
||||
To enable MII monitoring on bond0 with a 1 second interval::
|
||||
|
||||
# echo 1000 > /sys/class/net/bond0/bonding/miimon
|
||||
NOTE: If ARP monitoring is enabled, it will disabled when MII
|
||||
|
||||
.. note::
|
||||
|
||||
If ARP monitoring is enabled, it will disabled when MII
|
||||
monitoring is enabled, and vice-versa.
|
||||
|
||||
To add ARP targets:
|
||||
To add ARP targets::
|
||||
|
||||
# echo +192.168.0.100 > /sys/class/net/bond0/bonding/arp_ip_target
|
||||
# echo +192.168.0.101 > /sys/class/net/bond0/bonding/arp_ip_target
|
||||
NOTE: up to 16 target addresses may be specified.
|
||||
|
||||
To remove an ARP target:
|
||||
.. note::
|
||||
|
||||
up to 16 target addresses may be specified.
|
||||
|
||||
To remove an ARP target::
|
||||
|
||||
# echo -192.168.0.100 > /sys/class/net/bond0/bonding/arp_ip_target
|
||||
|
||||
To configure the interval between learning packet transmits:
|
||||
To configure the interval between learning packet transmits::
|
||||
|
||||
# echo 12 > /sys/class/net/bond0/bonding/lp_interval
|
||||
NOTE: the lp_interval is the number of seconds between instances where
|
||||
|
||||
.. note::
|
||||
|
||||
the lp_interval is the number of seconds between instances where
|
||||
the bonding driver sends learning packets to each slaves peer switch. The
|
||||
default interval is 1 second.
|
||||
|
||||
|
@ -1512,7 +1547,7 @@ executed with sysfs, and without using ifenslave.
|
|||
To make a simple bond of two e100 devices (presumed to be eth0
|
||||
and eth1), and have it persist across reboots, edit the appropriate
|
||||
file (/etc/init.d/boot.local or /etc/rc.d/rc.local), and add the
|
||||
following:
|
||||
following::
|
||||
|
||||
modprobe bonding
|
||||
modprobe e100
|
||||
|
@ -1524,7 +1559,7 @@ echo +eth1 > /sys/class/net/bond0/bonding/slaves
|
|||
|
||||
To add a second bond, with two e1000 interfaces in
|
||||
active-backup mode, using ARP monitoring, add the following lines to
|
||||
your init script:
|
||||
your init script::
|
||||
|
||||
modprobe e1000
|
||||
echo +bond1 > /sys/class/net/bonding_masters
|
||||
|
@ -1544,8 +1579,8 @@ derivatives.
|
|||
|
||||
The ifup and ifdown commands on Debian don't support bonding out of
|
||||
the box. The ifenslave-2.6 package should be installed to provide bonding
|
||||
support. Once installed, this package will provide bond-* options to be used
|
||||
into /etc/network/interfaces.
|
||||
support. Once installed, this package will provide ``bond-*`` options
|
||||
to be used into /etc/network/interfaces.
|
||||
|
||||
Note that ifenslave-2.6 package will load the bonding module and use
|
||||
the ifenslave command when appropriate.
|
||||
|
@ -1554,7 +1589,7 @@ Example Configurations
|
|||
----------------------
|
||||
|
||||
In /etc/network/interfaces, the following stanza will configure bond0, in
|
||||
active-backup mode, with eth0 and eth1 as slaves.
|
||||
active-backup mode, with eth0 and eth1 as slaves::
|
||||
|
||||
auto bond0
|
||||
iface bond0 inet dhcp
|
||||
|
@ -1566,7 +1601,7 @@ iface bond0 inet dhcp
|
|||
If the above configuration doesn't work, you might have a system using
|
||||
upstart for system startup. This is most notably true for recent
|
||||
Ubuntu versions. The following stanza in /etc/network/interfaces will
|
||||
produce the same result on those systems.
|
||||
produce the same result on those systems::
|
||||
|
||||
auto bond0
|
||||
iface bond0 inet dhcp
|
||||
|
@ -1584,8 +1619,8 @@ iface eth1 inet manual
|
|||
bond-master bond0
|
||||
bond-primary eth0 eth1
|
||||
|
||||
For a full list of bond-* supported options in /etc/network/interfaces and some
|
||||
more advanced examples tailored to you particular distros, see the files in
|
||||
For a full list of ``bond-*`` supported options in /etc/network/interfaces and
|
||||
some more advanced examples tailored to you particular distros, see the files in
|
||||
/usr/share/doc/ifenslave-2.6.
|
||||
|
||||
3.6 Overriding Configuration for Special Cases
|
||||
|
@ -1610,7 +1645,7 @@ tx_queues can be used to change this value. There is no sysfs parameter
|
|||
available as the allocation is done at module init time.
|
||||
|
||||
The output of the file /proc/net/bonding/bondX has changed so the output Queue
|
||||
ID is now printed for each slave:
|
||||
ID is now printed for each slave::
|
||||
|
||||
Bonding Mode: fault-tolerance (active-backup)
|
||||
Primary Slave: None
|
||||
|
@ -1632,7 +1667,7 @@ Link Failure Count: 0
|
|||
Permanent HW addr: 00:1a:a0:12:8f:cc
|
||||
Slave queue ID: 2
|
||||
|
||||
The queue_id for a slave can be set using the command:
|
||||
The queue_id for a slave can be set using the command::
|
||||
|
||||
# echo "eth1:2" > /sys/class/net/bond0/bonding/queue_id
|
||||
|
||||
|
@ -1645,12 +1680,12 @@ These queue id's can be used in conjunction with the tc utility to configure
|
|||
a multiqueue qdisc and filters to bias certain traffic to transmit on certain
|
||||
slave devices. For instance, say we wanted, in the above configuration to
|
||||
force all traffic bound to 192.168.1.100 to use eth1 in the bond as its output
|
||||
device. The following commands would accomplish this:
|
||||
device. The following commands would accomplish this::
|
||||
|
||||
# tc qdisc add dev bond0 handle 1 root multiq
|
||||
|
||||
# tc filter add dev bond0 protocol ip parent 1: prio 1 u32 match ip dst \
|
||||
192.168.1.100 action skbedit queue_mapping 2
|
||||
# tc filter add dev bond0 protocol ip parent 1: prio 1 u32 match ip \
|
||||
dst 192.168.1.100 action skbedit queue_mapping 2
|
||||
|
||||
These commands tell the kernel to attach a multiqueue queue discipline to the
|
||||
bond0 interface and filter traffic enqueued to it, such that packets with a dst
|
||||
|
@ -1689,7 +1724,7 @@ few bonding parameters:
|
|||
(a) ad_actor_system : You can set a random mac-address that can be used for
|
||||
these LACPDU exchanges. The value can not be either NULL or Multicast.
|
||||
Also it's preferable to set the local-admin bit. Following shell code
|
||||
generates a random mac-address as described above.
|
||||
generates a random mac-address as described above::
|
||||
|
||||
# sys_mac_addr=$(printf '%02x:%02x:%02x:%02x:%02x:%02x' \
|
||||
$(( (RANDOM & 0xFE) | 0x02 )) \
|
||||
|
@ -1702,7 +1737,7 @@ few bonding parameters:
|
|||
|
||||
(b) ad_actor_sys_prio : Randomize the system priority. The default value
|
||||
is 65535, but system can take the value from 1 - 65535. Following shell
|
||||
code generates random priority and sets it.
|
||||
code generates random priority and sets it::
|
||||
|
||||
# sys_prio=$(( 1 + RANDOM + RANDOM ))
|
||||
# echo $sys_prio > /sys/class/net/bond0/bonding/ad_actor_sys_prio
|
||||
|
@ -1710,7 +1745,7 @@ few bonding parameters:
|
|||
(c) ad_user_port_key : Use the user portion of the port-key. The default
|
||||
keeps this empty. These are the upper 10 bits of the port-key and value
|
||||
ranges from 0 - 1023. Following shell code generates these 10 bits and
|
||||
sets it.
|
||||
sets it::
|
||||
|
||||
# usr_port_key=$(( RANDOM & 0x3FF ))
|
||||
# echo $usr_port_key > /sys/class/net/bond0/bonding/ad_user_port_key
|
||||
|
@ -1728,7 +1763,7 @@ about the bonding configuration, options and state of each slave.
|
|||
|
||||
For example, the contents of /proc/net/bonding/bond0 after the
|
||||
driver is loaded with parameters of mode=0 and miimon=1000 is
|
||||
generally as follows:
|
||||
generally as follows::
|
||||
|
||||
Ethernet Channel Bonding Driver: 2.6.1 (October 29, 2004)
|
||||
Bonding Mode: load balancing (round-robin)
|
||||
|
@ -1760,7 +1795,7 @@ contain information on which slaves are associated with which masters.
|
|||
In the example below, the bond0 interface is the master
|
||||
(MASTER) while eth0 and eth1 are slaves (SLAVE). Notice all slaves of
|
||||
bond0 have the same MAC address (HWaddr) as bond0 for all modes except
|
||||
TLB and ALB that require a unique MAC address for each slave.
|
||||
TLB and ALB that require a unique MAC address for each slave::
|
||||
|
||||
# /sbin/ifconfig
|
||||
bond0 Link encap:Ethernet HWaddr 00:C0:F0:1F:37:B4
|
||||
|
@ -1907,13 +1942,13 @@ down or have a problem making it unresponsive to ARP requests. Having
|
|||
an additional target (or several) increases the reliability of the ARP
|
||||
monitoring.
|
||||
|
||||
Multiple ARP targets must be separated by commas as follows:
|
||||
Multiple ARP targets must be separated by commas as follows::
|
||||
|
||||
# example options for ARP monitoring with three targets
|
||||
alias bond0 bonding
|
||||
options bond0 arp_interval=60 arp_ip_target=192.168.0.1,192.168.0.3,192.168.0.9
|
||||
|
||||
For just a single target the options would resemble:
|
||||
For just a single target the options would resemble::
|
||||
|
||||
# example options for ARP monitoring with one target
|
||||
alias bond0 bonding
|
||||
|
@ -1956,7 +1991,7 @@ up.
|
|||
devices not have routes that supersede routes of the master (or,
|
||||
generally, not have routes at all). For example, suppose the bonding
|
||||
device bond0 has two slaves, eth0 and eth1, and the routing table is
|
||||
as follows:
|
||||
as follows::
|
||||
|
||||
Kernel IP routing table
|
||||
Destination Gateway Genmask Flags MSS Window irtt Iface
|
||||
|
@ -1993,7 +2028,7 @@ that the same physical device always has the same "ethX" name), it may
|
|||
be necessary to add some special logic to config files in
|
||||
/etc/modprobe.d/.
|
||||
|
||||
For example, given a modules.conf containing the following:
|
||||
For example, given a modules.conf containing the following::
|
||||
|
||||
alias bond0 bonding
|
||||
options bond0 mode=some-mode miimon=50
|
||||
|
@ -2010,7 +2045,7 @@ when the e1000 driver loads, it will receive eth0 and eth1 for its
|
|||
devices, but the bonding configuration tries to enslave eth2 and eth3
|
||||
(which may later be assigned to the tg3 devices).
|
||||
|
||||
Adding the following:
|
||||
Adding the following::
|
||||
|
||||
add above bonding e1000 tg3
|
||||
|
||||
|
@ -2020,7 +2055,7 @@ modules.conf manual page.
|
|||
|
||||
On systems utilizing modprobe an equivalent problem can occur.
|
||||
In this case, the following can be added to config files in
|
||||
/etc/modprobe.d/ as:
|
||||
/etc/modprobe.d/ as::
|
||||
|
||||
softdep bonding pre: tg3 e1000
|
||||
|
||||
|
@ -2070,6 +2105,8 @@ with the eth0 interface. This configuration is shown below, the IP
|
|||
address 192.168.1.1 has an interface index of 2 which indexes to eth0
|
||||
in the ifDescr table (ifDescr.2).
|
||||
|
||||
::
|
||||
|
||||
interfaces.ifTable.ifEntry.ifDescr.1 = lo
|
||||
interfaces.ifTable.ifEntry.ifDescr.2 = eth0
|
||||
interfaces.ifTable.ifEntry.ifDescr.3 = eth1
|
||||
|
@ -2161,7 +2198,7 @@ network changes dramatically. In multiple switch topologies, there is
|
|||
a trade off between network availability and usable bandwidth.
|
||||
|
||||
Below is a sample network, configured to maximize the
|
||||
availability of the network:
|
||||
availability of the network::
|
||||
|
||||
| |
|
||||
|port3 port3|
|
||||
|
@ -2188,14 +2225,16 @@ broadcast modes are the only useful bonding modes when optimizing for
|
|||
availability; the other modes require all links to terminate on the
|
||||
same peer for them to behave rationally.
|
||||
|
||||
active-backup: This is generally the preferred mode, particularly if
|
||||
active-backup:
|
||||
This is generally the preferred mode, particularly if
|
||||
the switches have an ISL and play together well. If the
|
||||
network configuration is such that one switch is specifically
|
||||
a backup switch (e.g., has lower capacity, higher cost, etc),
|
||||
then the primary option can be used to insure that the
|
||||
preferred link is always used when it is available.
|
||||
|
||||
broadcast: This mode is really a special purpose mode, and is suitable
|
||||
broadcast:
|
||||
This mode is really a special purpose mode, and is suitable
|
||||
only for very specific needs. For example, if the two
|
||||
switches are not connected (no ISL), and the networks beyond
|
||||
them are totally independent. In this case, if it is
|
||||
|
@ -2249,7 +2288,7 @@ categorize them into either "gatewayed" or "local" configurations.
|
|||
|
||||
In a gatewayed configuration, the "switch" is acting primarily
|
||||
as a router, and the majority of traffic passes through this router to
|
||||
other networks. An example would be the following:
|
||||
other networks. An example would be the following::
|
||||
|
||||
|
||||
+----------+ +----------+
|
||||
|
@ -2277,7 +2316,7 @@ beyond the gateway.
|
|||
In a local configuration, the "switch" is acting primarily as
|
||||
a switch, and the majority of traffic passes through this switch to
|
||||
reach other stations on the same network. An example would be the
|
||||
following:
|
||||
following::
|
||||
|
||||
+----------+ +----------+ +--------+
|
||||
| |eth0 port1| +-------+ Host B |
|
||||
|
@ -2313,7 +2352,8 @@ mode is described below.
|
|||
although you will have to decide which bonding mode best suits your
|
||||
needs. The trade offs for each mode are detailed below:
|
||||
|
||||
balance-rr: This mode is the only mode that will permit a single
|
||||
balance-rr:
|
||||
This mode is the only mode that will permit a single
|
||||
TCP/IP connection to stripe traffic across multiple
|
||||
interfaces. It is therefore the only mode that will allow a
|
||||
single TCP/IP stream to utilize more than one interface's
|
||||
|
@ -2351,7 +2391,8 @@ balance-rr: This mode is the only mode that will permit a single
|
|||
This mode requires the switch to have the appropriate ports
|
||||
configured for "etherchannel" or "trunking."
|
||||
|
||||
active-backup: There is not much advantage in this network topology to
|
||||
active-backup:
|
||||
There is not much advantage in this network topology to
|
||||
the active-backup mode, as the inactive backup devices are all
|
||||
connected to the same peer as the primary. In this case, a
|
||||
load balancing mode (with link monitoring) will provide the
|
||||
|
@ -2361,7 +2402,8 @@ active-backup: There is not much advantage in this network topology to
|
|||
have value if the hardware available does not support any of
|
||||
the load balance modes.
|
||||
|
||||
balance-xor: This mode will limit traffic such that packets destined
|
||||
balance-xor:
|
||||
This mode will limit traffic such that packets destined
|
||||
for specific peers will always be sent over the same
|
||||
interface. Since the destination is determined by the MAC
|
||||
addresses involved, this mode works best in a "local" network
|
||||
|
@ -2373,10 +2415,12 @@ balance-xor: This mode will limit traffic such that packets destined
|
|||
As with balance-rr, the switch ports need to be configured for
|
||||
"etherchannel" or "trunking."
|
||||
|
||||
broadcast: Like active-backup, there is not much advantage to this
|
||||
broadcast:
|
||||
Like active-backup, there is not much advantage to this
|
||||
mode in this type of network topology.
|
||||
|
||||
802.3ad: This mode can be a good choice for this type of network
|
||||
802.3ad:
|
||||
This mode can be a good choice for this type of network
|
||||
topology. The 802.3ad mode is an IEEE standard, so all peers
|
||||
that implement 802.3ad should interoperate well. The 802.3ad
|
||||
protocol includes automatic configuration of the aggregates,
|
||||
|
@ -2404,7 +2448,8 @@ broadcast: Like active-backup, there is not much advantage to this
|
|||
Finally, the 802.3ad mode mandates the use of the MII monitor,
|
||||
therefore, the ARP monitor is not available in this mode.
|
||||
|
||||
balance-tlb: The balance-tlb mode balances outgoing traffic by peer.
|
||||
balance-tlb:
|
||||
The balance-tlb mode balances outgoing traffic by peer.
|
||||
Since the balancing is done according to MAC address, in a
|
||||
"gatewayed" configuration (as described above), this mode will
|
||||
send all traffic across a single device. However, in a
|
||||
|
@ -2422,7 +2467,8 @@ balance-tlb: The balance-tlb mode balances outgoing traffic by peer.
|
|||
network device driver of the slave interfaces, and the ARP
|
||||
monitor is not available.
|
||||
|
||||
balance-alb: This mode is everything that balance-tlb is, and more.
|
||||
balance-alb:
|
||||
This mode is everything that balance-tlb is, and more.
|
||||
It has all of the features (and restrictions) of balance-tlb,
|
||||
and will also balance incoming traffic from local network
|
||||
peers (as described in the Bonding Module Options section,
|
||||
|
@ -2446,7 +2492,7 @@ assurance as the ARP monitor).
|
|||
|
||||
Multiple switches may be utilized to optimize for throughput
|
||||
when they are configured in parallel as part of an isolated network
|
||||
between two or more systems, for example:
|
||||
between two or more systems, for example::
|
||||
|
||||
+-----------+
|
||||
| Host A |
|
||||
|
@ -2551,7 +2597,7 @@ a "ping" to some other host on the network, and noticing that the
|
|||
output from ping flags duplicates (typically one per slave).
|
||||
|
||||
For example, on a bond in active-backup mode with five slaves
|
||||
all connected to one switch, the output may appear as follows:
|
||||
all connected to one switch, the output may appear as follows::
|
||||
|
||||
# ping -n 10.0.4.2
|
||||
PING 10.0.4.2 (10.0.4.2) from 10.0.3.10 : 56(84) bytes of data.
|
||||
|
@ -2616,8 +2662,8 @@ network topology in order to function; these are detailed below.
|
|||
Additional BladeCenter-specific networking information can be
|
||||
found in two IBM Redbooks (www.ibm.com/redbooks):
|
||||
|
||||
"IBM eServer BladeCenter Networking Options"
|
||||
"IBM eServer BladeCenter Layer 2-7 Network Switching"
|
||||
- "IBM eServer BladeCenter Networking Options"
|
||||
- "IBM eServer BladeCenter Layer 2-7 Network Switching"
|
||||
|
||||
BladeCenter networking configuration
|
||||
------------------------------------
|
||||
|
@ -2694,11 +2740,13 @@ avoid fail-over delay issues when using bonding.
|
|||
==============================
|
||||
|
||||
1. Is it SMP safe?
|
||||
-------------------
|
||||
|
||||
Yes. The old 2.0.xx channel bonding patch was not SMP safe.
|
||||
The new driver was designed to be SMP safe from the start.
|
||||
|
||||
2. What type of cards will work with it?
|
||||
-----------------------------------------
|
||||
|
||||
Any Ethernet type cards (you can even mix cards - a Intel
|
||||
EtherExpress PRO/100 and a 3com 3c905b, for example). For most modes,
|
||||
|
@ -2708,16 +2756,19 @@ devices need not be of the same speed.
|
|||
slaves in active-backup mode.
|
||||
|
||||
3. How many bonding devices can I have?
|
||||
----------------------------------------
|
||||
|
||||
There is no limit.
|
||||
|
||||
4. How many slaves can a bonding device have?
|
||||
----------------------------------------------
|
||||
|
||||
This is limited only by the number of network interfaces Linux
|
||||
supports and/or the number of network cards you can place in your
|
||||
system.
|
||||
|
||||
5. What happens when a slave link dies?
|
||||
----------------------------------------
|
||||
|
||||
If link monitoring is enabled, then the failing device will be
|
||||
disabled. The active-backup mode will fail over to a backup link, and
|
||||
|
@ -2740,10 +2791,12 @@ resulting degradation of performance. The precise performance loss
|
|||
depends upon the bonding mode and network configuration.
|
||||
|
||||
6. Can bonding be used for High Availability?
|
||||
----------------------------------------------
|
||||
|
||||
Yes. See the section on High Availability for details.
|
||||
|
||||
7. Which switches/systems does it work with?
|
||||
---------------------------------------------
|
||||
|
||||
The full answer to this depends upon the desired mode.
|
||||
|
||||
|
@ -2764,6 +2817,7 @@ switches currently available support 802.3ad.
|
|||
The active-backup mode should work with any Layer-II switch.
|
||||
|
||||
8. Where does a bonding device get its MAC address from?
|
||||
---------------------------------------------------------
|
||||
|
||||
When using slave devices that have fixed MAC addresses, or when
|
||||
the fail_over_mac option is enabled, the bonding device's MAC address is
|
||||
|
@ -2776,14 +2830,14 @@ slaves and remains persistent (even if the first slave is removed) until
|
|||
the bonding device is brought down or reconfigured.
|
||||
|
||||
If you wish to change the MAC address, you can set it with
|
||||
ifconfig or ip link:
|
||||
ifconfig or ip link::
|
||||
|
||||
# ifconfig bond0 hw ether 00:11:22:33:44:55
|
||||
|
||||
# ip link set bond0 address 66:77:88:99:aa:bb
|
||||
|
||||
The MAC address can be also changed by bringing down/up the
|
||||
device and then changing its slaves (or their order):
|
||||
device and then changing its slaves (or their order)::
|
||||
|
||||
# ifconfig bond0 down ; modprobe -r bonding
|
||||
# ifconfig bond0 .... up
|
||||
|
@ -2793,7 +2847,7 @@ device and then changing its slaves (or their order):
|
|||
slave that is added.
|
||||
|
||||
To restore your slaves' MAC addresses, you need to detach them
|
||||
from the bond (`ifenslave -d bond0 eth0'). The bonding driver will
|
||||
from the bond (``ifenslave -d bond0 eth0``). The bonding driver will
|
||||
then restore the MAC addresses that the slaves had before they were
|
||||
enslaved.
|
||||
|
||||
|
@ -2804,7 +2858,7 @@ enslaved.
|
|||
version of the linux kernel, found on http://kernel.org
|
||||
|
||||
The latest version of this document can be found in the latest kernel
|
||||
source (named Documentation/networking/bonding.txt).
|
||||
source (named Documentation/networking/bonding.rst).
|
||||
|
||||
Discussions regarding the usage of the bonding driver take place on the
|
||||
bonding-devel mailing list, hosted at sourceforge.net. If you have questions or
|
||||
|
@ -2829,9 +2883,8 @@ be found at:
|
|||
http://vger.kernel.org/vger-lists.html#netdev
|
||||
|
||||
Donald Becker's Ethernet Drivers and diag programs may be found at :
|
||||
- http://web.archive.org/web/*/http://www.scyld.com/network/
|
||||
|
||||
- http://web.archive.org/web/%2E/http://www.scyld.com/network/
|
||||
|
||||
You will also find a lot of information regarding Ethernet, NWay, MII,
|
||||
etc. at www.scyld.com.
|
||||
|
||||
-- END --
|
|
@ -1,5 +1,3 @@
|
|||
:orphan:
|
||||
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
.. include:: <isonum.txt>
|
||||
|
||||
|
|
|
@ -0,0 +1,13 @@
|
|||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
CAIF
|
||||
====
|
||||
|
||||
Contents:
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
linux_caif
|
||||
caif
|
||||
spi_porting
|
|
@ -1,12 +1,19 @@
|
|||
.. SPDX-License-Identifier: GPL-2.0
|
||||
.. include:: <isonum.txt>
|
||||
|
||||
==========
|
||||
Linux CAIF
|
||||
===========
|
||||
copyright (C) ST-Ericsson AB 2010
|
||||
Author: Sjur Brendeland/ sjur.brandeland@stericsson.com
|
||||
License terms: GNU General Public License (GPL) version 2
|
||||
==========
|
||||
|
||||
Copyright |copy| ST-Ericsson AB 2010
|
||||
|
||||
:Author: Sjur Brendeland/ sjur.brandeland@stericsson.com
|
||||
:License terms: GNU General Public License (GPL) version 2
|
||||
|
||||
|
||||
Introduction
|
||||
------------
|
||||
============
|
||||
|
||||
CAIF is a MUX protocol used by ST-Ericsson cellular modems for
|
||||
communication between Modem and host. The host processes can open virtual AT
|
||||
channels, initiate GPRS Data connections, Video channels and Utility Channels.
|
||||
|
@ -16,13 +23,16 @@ ST-Ericsson modems support a number of transports between modem
|
|||
and host. Currently, UART and Loopback are available for Linux.
|
||||
|
||||
|
||||
Architecture:
|
||||
------------
|
||||
Architecture
|
||||
============
|
||||
|
||||
The implementation of CAIF is divided into:
|
||||
|
||||
* CAIF Socket Layer and GPRS IP Interface.
|
||||
* CAIF Core Protocol Implementation
|
||||
* CAIF Link Layer, implemented as NET devices.
|
||||
|
||||
::
|
||||
|
||||
RTNL
|
||||
!
|
||||
|
@ -46,12 +56,12 @@ The implementation of CAIF is divided into:
|
|||
|
||||
|
||||
|
||||
I M P L E M E N T A T I O N
|
||||
===========================
|
||||
Implementation
|
||||
==============
|
||||
|
||||
|
||||
CAIF Core Protocol Layer
|
||||
=========================================
|
||||
------------------------
|
||||
|
||||
CAIF Core layer implements the CAIF protocol as defined by ST-Ericsson.
|
||||
It implements the CAIF protocol stack in a layered approach, where
|
||||
|
@ -59,8 +69,11 @@ each layer described in the specification is implemented as a separate layer.
|
|||
The architecture is inspired by the design patterns "Protocol Layer" and
|
||||
"Protocol Packet".
|
||||
|
||||
== CAIF structure ==
|
||||
CAIF structure
|
||||
^^^^^^^^^^^^^^
|
||||
|
||||
The Core CAIF implementation contains:
|
||||
|
||||
- Simple implementation of CAIF.
|
||||
- Layered architecture (a la Streams), each layer in the CAIF
|
||||
specification is implemented in a separate c-file.
|
||||
|
@ -73,7 +86,8 @@ The Core CAIF implementation contains:
|
|||
to the called function (except for framing layers' receive function)
|
||||
|
||||
Layered Architecture
|
||||
--------------------
|
||||
====================
|
||||
|
||||
The CAIF protocol can be divided into two parts: Support functions and Protocol
|
||||
Implementation. The support functions include:
|
||||
|
||||
|
@ -112,7 +126,7 @@ The CAIF Protocol implementation contains:
|
|||
- CFSERL CAIF Serial layer. Handles concatenation/split of frames
|
||||
into CAIF Frames with correct length.
|
||||
|
||||
|
||||
::
|
||||
|
||||
+---------+
|
||||
| Config |
|
||||
|
@ -143,18 +157,24 @@ The CAIF Protocol implementation contains:
|
|||
|
||||
|
||||
In this layered approach the following "rules" apply.
|
||||
|
||||
- All layers embed the same structure "struct cflayer"
|
||||
- A layer does not depend on any other layer's private data.
|
||||
- Layers are stacked by setting the pointers
|
||||
- Layers are stacked by setting the pointers::
|
||||
|
||||
layer->up , layer->dn
|
||||
- In order to send data upwards, each layer should do
|
||||
|
||||
- In order to send data upwards, each layer should do::
|
||||
|
||||
layer->up->receive(layer->up, packet);
|
||||
- In order to send data downwards, each layer should do
|
||||
|
||||
- In order to send data downwards, each layer should do::
|
||||
|
||||
layer->dn->transmit(layer->dn, packet);
|
||||
|
||||
|
||||
CAIF Socket and IP interface
|
||||
===========================
|
||||
============================
|
||||
|
||||
The IP interface and CAIF socket API are implemented on top of the
|
||||
CAIF Core protocol. The IP Interface and CAIF socket have an instance of
|
|
@ -0,0 +1,229 @@
|
|||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
================
|
||||
CAIF SPI porting
|
||||
================
|
||||
|
||||
CAIF SPI basics
|
||||
===============
|
||||
|
||||
Running CAIF over SPI needs some extra setup, owing to the nature of SPI.
|
||||
Two extra GPIOs have been added in order to negotiate the transfers
|
||||
between the master and the slave. The minimum requirement for running
|
||||
CAIF over SPI is a SPI slave chip and two GPIOs (more details below).
|
||||
Please note that running as a slave implies that you need to keep up
|
||||
with the master clock. An overrun or underrun event is fatal.
|
||||
|
||||
CAIF SPI framework
|
||||
==================
|
||||
|
||||
To make porting as easy as possible, the CAIF SPI has been divided in
|
||||
two parts. The first part (called the interface part) deals with all
|
||||
generic functionality such as length framing, SPI frame negotiation
|
||||
and SPI frame delivery and transmission. The other part is the CAIF
|
||||
SPI slave device part, which is the module that you have to write if
|
||||
you want to run SPI CAIF on a new hardware. This part takes care of
|
||||
the physical hardware, both with regard to SPI and to GPIOs.
|
||||
|
||||
- Implementing a CAIF SPI device:
|
||||
|
||||
- Functionality provided by the CAIF SPI slave device:
|
||||
|
||||
In order to implement a SPI device you will, as a minimum,
|
||||
need to implement the following
|
||||
functions:
|
||||
|
||||
::
|
||||
|
||||
int (*init_xfer) (struct cfspi_xfer * xfer, struct cfspi_dev *dev):
|
||||
|
||||
This function is called by the CAIF SPI interface to give
|
||||
you a chance to set up your hardware to be ready to receive
|
||||
a stream of data from the master. The xfer structure contains
|
||||
both physical and logical addresses, as well as the total length
|
||||
of the transfer in both directions.The dev parameter can be used
|
||||
to map to different CAIF SPI slave devices.
|
||||
|
||||
::
|
||||
|
||||
void (*sig_xfer) (bool xfer, struct cfspi_dev *dev):
|
||||
|
||||
This function is called by the CAIF SPI interface when the output
|
||||
(SPI_INT) GPIO needs to change state. The boolean value of the xfer
|
||||
variable indicates whether the GPIO should be asserted (HIGH) or
|
||||
deasserted (LOW). The dev parameter can be used to map to different CAIF
|
||||
SPI slave devices.
|
||||
|
||||
- Functionality provided by the CAIF SPI interface:
|
||||
|
||||
::
|
||||
|
||||
void (*ss_cb) (bool assert, struct cfspi_ifc *ifc);
|
||||
|
||||
This function is called by the CAIF SPI slave device in order to
|
||||
signal a change of state of the input GPIO (SS) to the interface.
|
||||
Only active edges are mandatory to be reported.
|
||||
This function can be called from IRQ context (recommended in order
|
||||
not to introduce latency). The ifc parameter should be the pointer
|
||||
returned from the platform probe function in the SPI device structure.
|
||||
|
||||
::
|
||||
|
||||
void (*xfer_done_cb) (struct cfspi_ifc *ifc);
|
||||
|
||||
This function is called by the CAIF SPI slave device in order to
|
||||
report that a transfer is completed. This function should only be
|
||||
called once both the transmission and the reception are completed.
|
||||
This function can be called from IRQ context (recommended in order
|
||||
not to introduce latency). The ifc parameter should be the pointer
|
||||
returned from the platform probe function in the SPI device structure.
|
||||
|
||||
- Connecting the bits and pieces:
|
||||
|
||||
- Filling in the SPI slave device structure:
|
||||
|
||||
Connect the necessary callback functions.
|
||||
|
||||
Indicate clock speed (used to calculate toggle delays).
|
||||
|
||||
Chose a suitable name (helps debugging if you use several CAIF
|
||||
SPI slave devices).
|
||||
|
||||
Assign your private data (can be used to map to your
|
||||
structure).
|
||||
|
||||
- Filling in the SPI slave platform device structure:
|
||||
|
||||
Add name of driver to connect to ("cfspi_sspi").
|
||||
|
||||
Assign the SPI slave device structure as platform data.
|
||||
|
||||
Padding
|
||||
=======
|
||||
|
||||
In order to optimize throughput, a number of SPI padding options are provided.
|
||||
Padding can be enabled independently for uplink and downlink transfers.
|
||||
Padding can be enabled for the head, the tail and for the total frame size.
|
||||
The padding needs to be correctly configured on both sides of the link.
|
||||
The padding can be changed via module parameters in cfspi_sspi.c or via
|
||||
the sysfs directory of the cfspi_sspi driver (before device registration).
|
||||
|
||||
- CAIF SPI device template::
|
||||
|
||||
/*
|
||||
* Copyright (C) ST-Ericsson AB 2010
|
||||
* Author: Daniel Martensson / Daniel.Martensson@stericsson.com
|
||||
* License terms: GNU General Public License (GPL), version 2.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/wait.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <net/caif/caif_spi.h>
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
struct sspi_struct {
|
||||
struct cfspi_dev sdev;
|
||||
struct cfspi_xfer *xfer;
|
||||
};
|
||||
|
||||
static struct sspi_struct slave;
|
||||
static struct platform_device slave_device;
|
||||
|
||||
static irqreturn_t sspi_irq(int irq, void *arg)
|
||||
{
|
||||
/* You only need to trigger on an edge to the active state of the
|
||||
* SS signal. Once a edge is detected, the ss_cb() function should be
|
||||
* called with the parameter assert set to true. It is OK
|
||||
* (and even advised) to call the ss_cb() function in IRQ context in
|
||||
* order not to add any delay. */
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static void sspi_complete(void *context)
|
||||
{
|
||||
/* Normally the DMA or the SPI framework will call you back
|
||||
* in something similar to this. The only thing you need to
|
||||
* do is to call the xfer_done_cb() function, providing the pointer
|
||||
* to the CAIF SPI interface. It is OK to call this function
|
||||
* from IRQ context. */
|
||||
}
|
||||
|
||||
static int sspi_init_xfer(struct cfspi_xfer *xfer, struct cfspi_dev *dev)
|
||||
{
|
||||
/* Store transfer info. For a normal implementation you should
|
||||
* set up your DMA here and make sure that you are ready to
|
||||
* receive the data from the master SPI. */
|
||||
|
||||
struct sspi_struct *sspi = (struct sspi_struct *)dev->priv;
|
||||
|
||||
sspi->xfer = xfer;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void sspi_sig_xfer(bool xfer, struct cfspi_dev *dev)
|
||||
{
|
||||
/* If xfer is true then you should assert the SPI_INT to indicate to
|
||||
* the master that you are ready to receive the data from the master
|
||||
* SPI. If xfer is false then you should de-assert SPI_INT to indicate
|
||||
* that the transfer is done.
|
||||
*/
|
||||
|
||||
struct sspi_struct *sspi = (struct sspi_struct *)dev->priv;
|
||||
}
|
||||
|
||||
static void sspi_release(struct device *dev)
|
||||
{
|
||||
/*
|
||||
* Here you should release your SPI device resources.
|
||||
*/
|
||||
}
|
||||
|
||||
static int __init sspi_init(void)
|
||||
{
|
||||
/* Here you should initialize your SPI device by providing the
|
||||
* necessary functions, clock speed, name and private data. Once
|
||||
* done, you can register your device with the
|
||||
* platform_device_register() function. This function will return
|
||||
* with the CAIF SPI interface initialized. This is probably also
|
||||
* the place where you should set up your GPIOs, interrupts and SPI
|
||||
* resources. */
|
||||
|
||||
int res = 0;
|
||||
|
||||
/* Initialize slave device. */
|
||||
slave.sdev.init_xfer = sspi_init_xfer;
|
||||
slave.sdev.sig_xfer = sspi_sig_xfer;
|
||||
slave.sdev.clk_mhz = 13;
|
||||
slave.sdev.priv = &slave;
|
||||
slave.sdev.name = "spi_sspi";
|
||||
slave_device.dev.release = sspi_release;
|
||||
|
||||
/* Initialize platform device. */
|
||||
slave_device.name = "cfspi_sspi";
|
||||
slave_device.dev.platform_data = &slave.sdev;
|
||||
|
||||
/* Register platform device. */
|
||||
res = platform_device_register(&slave_device);
|
||||
if (res) {
|
||||
printk(KERN_WARNING "sspi_init: failed to register dev.\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
static void __exit sspi_exit(void)
|
||||
{
|
||||
platform_device_del(&slave_device);
|
||||
}
|
||||
|
||||
module_init(sspi_init);
|
||||
module_exit(sspi_exit);
|
|
@ -1,208 +0,0 @@
|
|||
- CAIF SPI porting -
|
||||
|
||||
- CAIF SPI basics:
|
||||
|
||||
Running CAIF over SPI needs some extra setup, owing to the nature of SPI.
|
||||
Two extra GPIOs have been added in order to negotiate the transfers
|
||||
between the master and the slave. The minimum requirement for running
|
||||
CAIF over SPI is a SPI slave chip and two GPIOs (more details below).
|
||||
Please note that running as a slave implies that you need to keep up
|
||||
with the master clock. An overrun or underrun event is fatal.
|
||||
|
||||
- CAIF SPI framework:
|
||||
|
||||
To make porting as easy as possible, the CAIF SPI has been divided in
|
||||
two parts. The first part (called the interface part) deals with all
|
||||
generic functionality such as length framing, SPI frame negotiation
|
||||
and SPI frame delivery and transmission. The other part is the CAIF
|
||||
SPI slave device part, which is the module that you have to write if
|
||||
you want to run SPI CAIF on a new hardware. This part takes care of
|
||||
the physical hardware, both with regard to SPI and to GPIOs.
|
||||
|
||||
- Implementing a CAIF SPI device:
|
||||
|
||||
- Functionality provided by the CAIF SPI slave device:
|
||||
|
||||
In order to implement a SPI device you will, as a minimum,
|
||||
need to implement the following
|
||||
functions:
|
||||
|
||||
int (*init_xfer) (struct cfspi_xfer * xfer, struct cfspi_dev *dev):
|
||||
|
||||
This function is called by the CAIF SPI interface to give
|
||||
you a chance to set up your hardware to be ready to receive
|
||||
a stream of data from the master. The xfer structure contains
|
||||
both physical and logical addresses, as well as the total length
|
||||
of the transfer in both directions.The dev parameter can be used
|
||||
to map to different CAIF SPI slave devices.
|
||||
|
||||
void (*sig_xfer) (bool xfer, struct cfspi_dev *dev):
|
||||
|
||||
This function is called by the CAIF SPI interface when the output
|
||||
(SPI_INT) GPIO needs to change state. The boolean value of the xfer
|
||||
variable indicates whether the GPIO should be asserted (HIGH) or
|
||||
deasserted (LOW). The dev parameter can be used to map to different CAIF
|
||||
SPI slave devices.
|
||||
|
||||
- Functionality provided by the CAIF SPI interface:
|
||||
|
||||
void (*ss_cb) (bool assert, struct cfspi_ifc *ifc);
|
||||
|
||||
This function is called by the CAIF SPI slave device in order to
|
||||
signal a change of state of the input GPIO (SS) to the interface.
|
||||
Only active edges are mandatory to be reported.
|
||||
This function can be called from IRQ context (recommended in order
|
||||
not to introduce latency). The ifc parameter should be the pointer
|
||||
returned from the platform probe function in the SPI device structure.
|
||||
|
||||
void (*xfer_done_cb) (struct cfspi_ifc *ifc);
|
||||
|
||||
This function is called by the CAIF SPI slave device in order to
|
||||
report that a transfer is completed. This function should only be
|
||||
called once both the transmission and the reception are completed.
|
||||
This function can be called from IRQ context (recommended in order
|
||||
not to introduce latency). The ifc parameter should be the pointer
|
||||
returned from the platform probe function in the SPI device structure.
|
||||
|
||||
- Connecting the bits and pieces:
|
||||
|
||||
- Filling in the SPI slave device structure:
|
||||
|
||||
Connect the necessary callback functions.
|
||||
Indicate clock speed (used to calculate toggle delays).
|
||||
Chose a suitable name (helps debugging if you use several CAIF
|
||||
SPI slave devices).
|
||||
Assign your private data (can be used to map to your structure).
|
||||
|
||||
- Filling in the SPI slave platform device structure:
|
||||
Add name of driver to connect to ("cfspi_sspi").
|
||||
Assign the SPI slave device structure as platform data.
|
||||
|
||||
- Padding:
|
||||
|
||||
In order to optimize throughput, a number of SPI padding options are provided.
|
||||
Padding can be enabled independently for uplink and downlink transfers.
|
||||
Padding can be enabled for the head, the tail and for the total frame size.
|
||||
The padding needs to be correctly configured on both sides of the link.
|
||||
The padding can be changed via module parameters in cfspi_sspi.c or via
|
||||
the sysfs directory of the cfspi_sspi driver (before device registration).
|
||||
|
||||
- CAIF SPI device template:
|
||||
|
||||
/*
|
||||
* Copyright (C) ST-Ericsson AB 2010
|
||||
* Author: Daniel Martensson / Daniel.Martensson@stericsson.com
|
||||
* License terms: GNU General Public License (GPL), version 2.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/wait.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <net/caif/caif_spi.h>
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
struct sspi_struct {
|
||||
struct cfspi_dev sdev;
|
||||
struct cfspi_xfer *xfer;
|
||||
};
|
||||
|
||||
static struct sspi_struct slave;
|
||||
static struct platform_device slave_device;
|
||||
|
||||
static irqreturn_t sspi_irq(int irq, void *arg)
|
||||
{
|
||||
/* You only need to trigger on an edge to the active state of the
|
||||
* SS signal. Once a edge is detected, the ss_cb() function should be
|
||||
* called with the parameter assert set to true. It is OK
|
||||
* (and even advised) to call the ss_cb() function in IRQ context in
|
||||
* order not to add any delay. */
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static void sspi_complete(void *context)
|
||||
{
|
||||
/* Normally the DMA or the SPI framework will call you back
|
||||
* in something similar to this. The only thing you need to
|
||||
* do is to call the xfer_done_cb() function, providing the pointer
|
||||
* to the CAIF SPI interface. It is OK to call this function
|
||||
* from IRQ context. */
|
||||
}
|
||||
|
||||
static int sspi_init_xfer(struct cfspi_xfer *xfer, struct cfspi_dev *dev)
|
||||
{
|
||||
/* Store transfer info. For a normal implementation you should
|
||||
* set up your DMA here and make sure that you are ready to
|
||||
* receive the data from the master SPI. */
|
||||
|
||||
struct sspi_struct *sspi = (struct sspi_struct *)dev->priv;
|
||||
|
||||
sspi->xfer = xfer;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void sspi_sig_xfer(bool xfer, struct cfspi_dev *dev)
|
||||
{
|
||||
/* If xfer is true then you should assert the SPI_INT to indicate to
|
||||
* the master that you are ready to receive the data from the master
|
||||
* SPI. If xfer is false then you should de-assert SPI_INT to indicate
|
||||
* that the transfer is done.
|
||||
*/
|
||||
|
||||
struct sspi_struct *sspi = (struct sspi_struct *)dev->priv;
|
||||
}
|
||||
|
||||
static void sspi_release(struct device *dev)
|
||||
{
|
||||
/*
|
||||
* Here you should release your SPI device resources.
|
||||
*/
|
||||
}
|
||||
|
||||
static int __init sspi_init(void)
|
||||
{
|
||||
/* Here you should initialize your SPI device by providing the
|
||||
* necessary functions, clock speed, name and private data. Once
|
||||
* done, you can register your device with the
|
||||
* platform_device_register() function. This function will return
|
||||
* with the CAIF SPI interface initialized. This is probably also
|
||||
* the place where you should set up your GPIOs, interrupts and SPI
|
||||
* resources. */
|
||||
|
||||
int res = 0;
|
||||
|
||||
/* Initialize slave device. */
|
||||
slave.sdev.init_xfer = sspi_init_xfer;
|
||||
slave.sdev.sig_xfer = sspi_sig_xfer;
|
||||
slave.sdev.clk_mhz = 13;
|
||||
slave.sdev.priv = &slave;
|
||||
slave.sdev.name = "spi_sspi";
|
||||
slave_device.dev.release = sspi_release;
|
||||
|
||||
/* Initialize platform device. */
|
||||
slave_device.name = "cfspi_sspi";
|
||||
slave_device.dev.platform_data = &slave.sdev;
|
||||
|
||||
/* Register platform device. */
|
||||
res = platform_device_register(&slave_device);
|
||||
if (res) {
|
||||
printk(KERN_WARNING "sspi_init: failed to register dev.\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
static void __exit sspi_exit(void)
|
||||
{
|
||||
platform_device_del(&slave_device);
|
||||
}
|
||||
|
||||
module_init(sspi_init);
|
||||
module_exit(sspi_exit);
|
|
@ -1,5 +1,8 @@
|
|||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
======================================================
|
||||
cdc_mbim - Driver for CDC MBIM Mobile Broadband modems
|
||||
========================================================
|
||||
======================================================
|
||||
|
||||
The cdc_mbim driver supports USB devices conforming to the "Universal
|
||||
Serial Bus Communications Class Subclass Specification for Mobile
|
||||
|
@ -19,9 +22,9 @@ by a cdc_ncm driver parameter:
|
|||
|
||||
prefer_mbim
|
||||
-----------
|
||||
Type: Boolean
|
||||
Valid Range: N/Y (0-1)
|
||||
Default Value: Y (MBIM is preferred)
|
||||
:Type: Boolean
|
||||
:Valid Range: N/Y (0-1)
|
||||
:Default Value: Y (MBIM is preferred)
|
||||
|
||||
This parameter sets the system policy for NCM/MBIM functions. Such
|
||||
functions will be handled by either the cdc_ncm driver or the cdc_mbim
|
||||
|
@ -44,11 +47,13 @@ userspace MBIM management application always is required to enable a
|
|||
MBIM function.
|
||||
|
||||
Such userspace applications includes, but are not limited to:
|
||||
|
||||
- mbimcli (included with the libmbim [3] library), and
|
||||
- ModemManager [4]
|
||||
|
||||
Establishing a MBIM IP session reequires at least these actions by the
|
||||
management application:
|
||||
|
||||
- open the control channel
|
||||
- configure network connection settings
|
||||
- connect to network
|
||||
|
@ -76,7 +81,7 @@ complies with all the control channel requirements in [1].
|
|||
|
||||
The cdc-wdmX device is created as a child of the MBIM control
|
||||
interface USB device. The character device associated with a specific
|
||||
MBIM function can be looked up using sysfs. For example:
|
||||
MBIM function can be looked up using sysfs. For example::
|
||||
|
||||
bjorn@nemi:~$ ls /sys/bus/usb/drivers/cdc_mbim/2-4:2.12/usbmisc
|
||||
cdc-wdm0
|
||||
|
@ -119,13 +124,15 @@ negotiated control message size.
|
|||
|
||||
|
||||
/dev/cdc-wdmX ioctl()
|
||||
--------------------
|
||||
---------------------
|
||||
IOCTL_WDM_MAX_COMMAND: Get Maximum Command Size
|
||||
This ioctl returns the wMaxControlMessage field of the CDC MBIM
|
||||
functional descriptor for MBIM devices. This is intended as a
|
||||
convenience, eliminating the need to parse the USB descriptors from
|
||||
userspace.
|
||||
|
||||
::
|
||||
|
||||
#include <stdio.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/ioctl.h>
|
||||
|
@ -178,7 +185,7 @@ VLAN links prior to establishing MBIM IP sessions where the SessionId
|
|||
is greater than 0. These links can be added by using the normal VLAN
|
||||
kernel interfaces, either ioctl or netlink.
|
||||
|
||||
For example, adding a link for a MBIM IP session with SessionId 3:
|
||||
For example, adding a link for a MBIM IP session with SessionId 3::
|
||||
|
||||
ip link add link wwan0 name wwan0.3 type vlan id 3
|
||||
|
||||
|
@ -207,6 +214,7 @@ the stream to the end user in an appropriate way for the stream type.
|
|||
The network device ABI requires a dummy ethernet header for every DSS
|
||||
data frame being transported. The contents of this header is
|
||||
arbitrary, with the following exceptions:
|
||||
|
||||
- TX frames using an IP protocol (0x0800 or 0x86dd) will be dropped
|
||||
- RX frames will have the protocol field set to ETH_P_802_3 (but will
|
||||
not be properly formatted 802.3 frames)
|
||||
|
@ -218,7 +226,7 @@ adding the dummy ethernet header on TX and stripping it on RX.
|
|||
|
||||
This is a simple example using tools commonly available, exporting
|
||||
DssSessionId 5 as a pty character device pointed to by a /dev/nmea
|
||||
symlink:
|
||||
symlink::
|
||||
|
||||
ip link add link wwan0 name wwan0.dss5 type vlan id 261
|
||||
ip link set dev wwan0.dss5 up
|
||||
|
@ -236,7 +244,7 @@ map frames to the correct DSS session and adding 18 byte VLAN ethernet
|
|||
headers with the appropriate tag on TX. In this case using a socket
|
||||
filter is recommended, matching only the DSS VLAN subset. This avoid
|
||||
unnecessary copying of unrelated IP session data to userspace. For
|
||||
example:
|
||||
example::
|
||||
|
||||
static struct sock_filter dssfilter[] = {
|
||||
/* use special negative offsets to get VLAN tag */
|
||||
|
@ -266,6 +274,7 @@ network device.
|
|||
|
||||
This mapping implies a few restrictions on multiplexed IPS and DSS
|
||||
sessions, which may not always be practical:
|
||||
|
||||
- no IPS or DSS session can use a frame size greater than the MTU on
|
||||
IP session 0
|
||||
- no IPS or DSS session can be in the up state unless the network
|
||||
|
@ -280,7 +289,7 @@ device.
|
|||
|
||||
Tip: It might be less confusing to the end user to name this VLAN
|
||||
subdevice after the MBIM SessionID instead of the VLAN ID. For
|
||||
example:
|
||||
example::
|
||||
|
||||
ip link add link wwan0 name wwan0.0 type vlan id 4094
|
||||
|
||||
|
@ -290,7 +299,7 @@ VLAN mapping
|
|||
|
||||
Summarizing the cdc_mbim driver mapping described above, we have this
|
||||
relationship between VLAN tags on the wwanY network device and MBIM
|
||||
sessions on the shared USB data channel:
|
||||
sessions on the shared USB data channel::
|
||||
|
||||
VLAN ID MBIM type MBIM SessionID Notes
|
||||
---------------------------------------------------------
|
||||
|
@ -310,30 +319,37 @@ sessions on the shared USB data channel:
|
|||
References
|
||||
==========
|
||||
|
||||
[1] USB Implementers Forum, Inc. - "Universal Serial Bus
|
||||
1) USB Implementers Forum, Inc. - "Universal Serial Bus
|
||||
Communications Class Subclass Specification for Mobile Broadband
|
||||
Interface Model", Revision 1.0 (Errata 1), May 1, 2013
|
||||
|
||||
- http://www.usb.org/developers/docs/devclass_docs/
|
||||
|
||||
[2] USB Implementers Forum, Inc. - "Universal Serial Bus
|
||||
2) USB Implementers Forum, Inc. - "Universal Serial Bus
|
||||
Communications Class Subclass Specifications for Network Control
|
||||
Model Devices", Revision 1.0 (Errata 1), November 24, 2010
|
||||
|
||||
- http://www.usb.org/developers/docs/devclass_docs/
|
||||
|
||||
[3] libmbim - "a glib-based library for talking to WWAN modems and
|
||||
3) libmbim - "a glib-based library for talking to WWAN modems and
|
||||
devices which speak the Mobile Interface Broadband Model (MBIM)
|
||||
protocol"
|
||||
|
||||
- http://www.freedesktop.org/wiki/Software/libmbim/
|
||||
|
||||
[4] ModemManager - "a DBus-activated daemon which controls mobile
|
||||
4) ModemManager - "a DBus-activated daemon which controls mobile
|
||||
broadband (2G/3G/4G) devices and connections"
|
||||
|
||||
- http://www.freedesktop.org/wiki/Software/ModemManager/
|
||||
|
||||
[5] "MBIM (Mobile Broadband Interface Model) Registry"
|
||||
5) "MBIM (Mobile Broadband Interface Model) Registry"
|
||||
|
||||
- http://compliance.usb.org/mbim/
|
||||
|
||||
[6] "/sys/kernel/debug/usb/devices output format"
|
||||
6) "/sys/kernel/debug/usb/devices output format"
|
||||
|
||||
- Documentation/driver-api/usb/usb.rst
|
||||
|
||||
[7] "/sys/bus/usb/devices/.../descriptors"
|
||||
7) "/sys/bus/usb/devices/.../descriptors"
|
||||
|
||||
- Documentation/ABI/stable/sysfs-bus-usb
|
|
@ -0,0 +1,80 @@
|
|||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
========================================
|
||||
The COPS LocalTalk Linux driver (cops.c)
|
||||
========================================
|
||||
|
||||
By Jay Schulist <jschlst@samba.org>
|
||||
|
||||
This driver has two modes and they are: Dayna mode and Tangent mode.
|
||||
Each mode corresponds with the type of card. It has been found
|
||||
that there are 2 main types of cards and all other cards are
|
||||
the same and just have different names or only have minor differences
|
||||
such as more IO ports. As this driver is tested it will
|
||||
become more clear exactly what cards are supported.
|
||||
|
||||
Right now these cards are known to work with the COPS driver. The
|
||||
LT-200 cards work in a somewhat more limited capacity than the
|
||||
DL200 cards, which work very well and are in use by many people.
|
||||
|
||||
TANGENT driver mode:
|
||||
- Tangent ATB-II, Novell NL-1000, Daystar Digital LT-200
|
||||
|
||||
DAYNA driver mode:
|
||||
- Dayna DL2000/DaynaTalk PC (Half Length), COPS LT-95,
|
||||
- Farallon PhoneNET PC III, Farallon PhoneNET PC II
|
||||
|
||||
Other cards possibly supported mode unknown though:
|
||||
- Dayna DL2000 (Full length)
|
||||
|
||||
The COPS driver defaults to using Dayna mode. To change the driver's
|
||||
mode if you built a driver with dual support use board_type=1 or
|
||||
board_type=2 for Dayna or Tangent with insmod.
|
||||
|
||||
Operation/loading of the driver
|
||||
===============================
|
||||
|
||||
Use modprobe like this: /sbin/modprobe cops.o (IO #) (IRQ #)
|
||||
If you do not specify any options the driver will try and use the IO = 0x240,
|
||||
IRQ = 5. As of right now I would only use IRQ 5 for the card, if autoprobing.
|
||||
|
||||
To load multiple COPS driver Localtalk cards you can do one of the following::
|
||||
|
||||
insmod cops io=0x240 irq=5
|
||||
insmod -o cops2 cops io=0x260 irq=3
|
||||
|
||||
Or in lilo.conf put something like this::
|
||||
|
||||
append="ether=5,0x240,lt0 ether=3,0x260,lt1"
|
||||
|
||||
Then bring up the interface with ifconfig. It will look something like this::
|
||||
|
||||
lt0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-F7-00-00-00-00-00-00-00-00
|
||||
inet addr:192.168.1.2 Bcast:192.168.1.255 Mask:255.255.255.0
|
||||
UP BROADCAST RUNNING NOARP MULTICAST MTU:600 Metric:1
|
||||
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
|
||||
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 coll:0
|
||||
|
||||
Netatalk Configuration
|
||||
======================
|
||||
|
||||
You will need to configure atalkd with something like the following to make
|
||||
it work with the cops.c driver.
|
||||
|
||||
* For single LTalk card use::
|
||||
|
||||
dummy -seed -phase 2 -net 2000 -addr 2000.10 -zone "1033"
|
||||
lt0 -seed -phase 1 -net 1000 -addr 1000.50 -zone "1033"
|
||||
|
||||
* For multiple cards, Ethernet and LocalTalk::
|
||||
|
||||
eth0 -seed -phase 2 -net 3000 -addr 3000.20 -zone "1033"
|
||||
lt0 -seed -phase 1 -net 1000 -addr 1000.50 -zone "1033"
|
||||
|
||||
* For multiple LocalTalk cards, and an Ethernet card.
|
||||
|
||||
* Order seems to matter here, Ethernet last::
|
||||
|
||||
lt0 -seed -phase 1 -net 1000 -addr 1000.10 -zone "LocalTalk1"
|
||||
lt1 -seed -phase 1 -net 2000 -addr 2000.20 -zone "LocalTalk2"
|
||||
eth0 -seed -phase 2 -net 3000 -addr 3000.30 -zone "EtherTalk"
|
|
@ -1,63 +0,0 @@
|
|||
Text File for the COPS LocalTalk Linux driver (cops.c).
|
||||
By Jay Schulist <jschlst@samba.org>
|
||||
|
||||
This driver has two modes and they are: Dayna mode and Tangent mode.
|
||||
Each mode corresponds with the type of card. It has been found
|
||||
that there are 2 main types of cards and all other cards are
|
||||
the same and just have different names or only have minor differences
|
||||
such as more IO ports. As this driver is tested it will
|
||||
become more clear exactly what cards are supported.
|
||||
|
||||
Right now these cards are known to work with the COPS driver. The
|
||||
LT-200 cards work in a somewhat more limited capacity than the
|
||||
DL200 cards, which work very well and are in use by many people.
|
||||
|
||||
TANGENT driver mode:
|
||||
Tangent ATB-II, Novell NL-1000, Daystar Digital LT-200
|
||||
DAYNA driver mode:
|
||||
Dayna DL2000/DaynaTalk PC (Half Length), COPS LT-95,
|
||||
Farallon PhoneNET PC III, Farallon PhoneNET PC II
|
||||
Other cards possibly supported mode unknown though:
|
||||
Dayna DL2000 (Full length)
|
||||
|
||||
The COPS driver defaults to using Dayna mode. To change the driver's
|
||||
mode if you built a driver with dual support use board_type=1 or
|
||||
board_type=2 for Dayna or Tangent with insmod.
|
||||
|
||||
** Operation/loading of the driver.
|
||||
Use modprobe like this: /sbin/modprobe cops.o (IO #) (IRQ #)
|
||||
If you do not specify any options the driver will try and use the IO = 0x240,
|
||||
IRQ = 5. As of right now I would only use IRQ 5 for the card, if autoprobing.
|
||||
|
||||
To load multiple COPS driver Localtalk cards you can do one of the following.
|
||||
|
||||
insmod cops io=0x240 irq=5
|
||||
insmod -o cops2 cops io=0x260 irq=3
|
||||
|
||||
Or in lilo.conf put something like this:
|
||||
append="ether=5,0x240,lt0 ether=3,0x260,lt1"
|
||||
|
||||
Then bring up the interface with ifconfig. It will look something like this:
|
||||
lt0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-F7-00-00-00-00-00-00-00-00
|
||||
inet addr:192.168.1.2 Bcast:192.168.1.255 Mask:255.255.255.0
|
||||
UP BROADCAST RUNNING NOARP MULTICAST MTU:600 Metric:1
|
||||
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
|
||||
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 coll:0
|
||||
|
||||
** Netatalk Configuration
|
||||
You will need to configure atalkd with something like the following to make
|
||||
it work with the cops.c driver.
|
||||
|
||||
* For single LTalk card use.
|
||||
dummy -seed -phase 2 -net 2000 -addr 2000.10 -zone "1033"
|
||||
lt0 -seed -phase 1 -net 1000 -addr 1000.50 -zone "1033"
|
||||
|
||||
* For multiple cards, Ethernet and LocalTalk.
|
||||
eth0 -seed -phase 2 -net 3000 -addr 3000.20 -zone "1033"
|
||||
lt0 -seed -phase 1 -net 1000 -addr 1000.50 -zone "1033"
|
||||
|
||||
* For multiple LocalTalk cards, and an Ethernet card.
|
||||
* Order seems to matter here, Ethernet last.
|
||||
lt0 -seed -phase 1 -net 1000 -addr 1000.10 -zone "LocalTalk1"
|
||||
lt1 -seed -phase 1 -net 2000 -addr 2000.20 -zone "LocalTalk2"
|
||||
eth0 -seed -phase 2 -net 3000 -addr 3000.30 -zone "EtherTalk"
|
|
@ -1,3 +1,9 @@
|
|||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
========================
|
||||
ATM cxacru device driver
|
||||
========================
|
||||
|
||||
Firmware is required for this device: http://accessrunner.sourceforge.net/
|
||||
|
||||
While it is capable of managing/maintaining the ADSL connection without the
|
||||
|
@ -19,14 +25,18 @@ several sysfs attribute files for retrieving device statistics:
|
|||
|
||||
* adsl_headend
|
||||
* adsl_headend_environment
|
||||
Information about the remote headend.
|
||||
|
||||
- Information about the remote headend.
|
||||
|
||||
* adsl_config
|
||||
Configuration writing interface.
|
||||
Write parameters in hexadecimal format <index>=<value>,
|
||||
|
||||
- Configuration writing interface.
|
||||
- Write parameters in hexadecimal format <index>=<value>,
|
||||
separated by whitespace, e.g.:
|
||||
|
||||
"1=0 a=5"
|
||||
Up to 7 parameters at a time will be sent and the modem will restart
|
||||
|
||||
- Up to 7 parameters at a time will be sent and the modem will restart
|
||||
the ADSL connection when any value is set. These are logged for future
|
||||
reference.
|
||||
|
||||
|
@ -34,14 +44,16 @@ several sysfs attribute files for retrieving device statistics:
|
|||
* downstream_bits_per_frame
|
||||
* downstream_rate (kbps)
|
||||
* downstream_snr_margin (dB)
|
||||
Downstream stats.
|
||||
|
||||
- Downstream stats.
|
||||
|
||||
* upstream_attenuation (dB)
|
||||
* upstream_bits_per_frame
|
||||
* upstream_rate (kbps)
|
||||
* upstream_snr_margin (dB)
|
||||
* transmitter_power (dBm/Hz)
|
||||
Upstream stats.
|
||||
|
||||
- Upstream stats.
|
||||
|
||||
* downstream_crc_errors
|
||||
* downstream_fec_errors
|
||||
|
@ -49,48 +61,56 @@ several sysfs attribute files for retrieving device statistics:
|
|||
* upstream_crc_errors
|
||||
* upstream_fec_errors
|
||||
* upstream_hec_errors
|
||||
Error counts.
|
||||
|
||||
- Error counts.
|
||||
|
||||
* line_startable
|
||||
Indicates that ADSL support on the device
|
||||
|
||||
- Indicates that ADSL support on the device
|
||||
is/can be enabled, see adsl_start.
|
||||
|
||||
* line_status
|
||||
"initialising"
|
||||
"down"
|
||||
"attempting to activate"
|
||||
"training"
|
||||
"channel analysis"
|
||||
"exchange"
|
||||
"waiting"
|
||||
"up"
|
||||
|
||||
- "initialising"
|
||||
- "down"
|
||||
- "attempting to activate"
|
||||
- "training"
|
||||
- "channel analysis"
|
||||
- "exchange"
|
||||
- "waiting"
|
||||
- "up"
|
||||
|
||||
Changes between "down" and "attempting to activate"
|
||||
if there is no signal.
|
||||
|
||||
* link_status
|
||||
"not connected"
|
||||
"connected"
|
||||
"lost"
|
||||
|
||||
- "not connected"
|
||||
- "connected"
|
||||
- "lost"
|
||||
|
||||
* mac_address
|
||||
|
||||
* modulation
|
||||
"" (when not connected)
|
||||
"ANSI T1.413"
|
||||
"ITU-T G.992.1 (G.DMT)"
|
||||
"ITU-T G.992.2 (G.LITE)"
|
||||
|
||||
- "" (when not connected)
|
||||
- "ANSI T1.413"
|
||||
- "ITU-T G.992.1 (G.DMT)"
|
||||
- "ITU-T G.992.2 (G.LITE)"
|
||||
|
||||
* startup_attempts
|
||||
Count of total attempts to initialise ADSL.
|
||||
|
||||
- Count of total attempts to initialise ADSL.
|
||||
|
||||
To enable/disable ADSL, the following can be written to the adsl_state file:
|
||||
"start"
|
||||
"stop
|
||||
"restart" (stops, waits 1.5s, then starts)
|
||||
"poll" (used to resume status polling if it was disabled due to failure)
|
||||
|
||||
Changes in adsl/line state are reported via kernel log messages:
|
||||
- "start"
|
||||
- "stop
|
||||
- "restart" (stops, waits 1.5s, then starts)
|
||||
- "poll" (used to resume status polling if it was disabled due to failure)
|
||||
|
||||
Changes in adsl/line state are reported via kernel log messages::
|
||||
|
||||
[4942145.150704] ATM dev 0: ADSL state: running
|
||||
[4942243.663766] ATM dev 0: ADSL line: down
|
||||
[4942249.665075] ATM dev 0: ADSL line: attempting to activate
|
|
@ -1,9 +1,11 @@
|
|||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
=============
|
||||
DCCP protocol
|
||||
=============
|
||||
|
||||
|
||||
Contents
|
||||
========
|
||||
.. Contents
|
||||
- Introduction
|
||||
- Missing features
|
||||
- Socket options
|
||||
|
@ -38,6 +40,7 @@ The Linux DCCP implementation does not currently support all the features that a
|
|||
specified in RFCs 4340...42.
|
||||
|
||||
The known bugs are at:
|
||||
|
||||
http://www.linuxfoundation.org/collaborate/workgroups/networking/todo#DCCP
|
||||
|
||||
For more up-to-date versions of the DCCP implementation, please consider using
|
||||
|
@ -54,7 +57,8 @@ defined: the "simple" policy (DCCPQ_POLICY_SIMPLE), which does nothing special,
|
|||
and a priority-based variant (DCCPQ_POLICY_PRIO). The latter allows to pass an
|
||||
u32 priority value as ancillary data to sendmsg(), where higher numbers indicate
|
||||
a higher packet priority (similar to SO_PRIORITY). This ancillary data needs to
|
||||
be formatted using a cmsg(3) message header filled in as follows:
|
||||
be formatted using a cmsg(3) message header filled in as follows::
|
||||
|
||||
cmsg->cmsg_level = SOL_DCCP;
|
||||
cmsg->cmsg_type = DCCP_SCM_PRIORITY;
|
||||
cmsg->cmsg_len = CMSG_LEN(sizeof(uint32_t)); /* or CMSG_LEN(4) */
|
||||
|
@ -94,7 +98,7 @@ must be registered on the socket before calling connect() or listen().
|
|||
|
||||
DCCP_SOCKOPT_TX_CCID is read/write. It returns the current CCID (if set) or sets
|
||||
the preference list for the TX CCID, using the same format as DCCP_SOCKOPT_CCID.
|
||||
Please note that the getsockopt argument type here is `int', not uint8_t.
|
||||
Please note that the getsockopt argument type here is ``int``, not uint8_t.
|
||||
|
||||
DCCP_SOCKOPT_RX_CCID is analogous to DCCP_SOCKOPT_TX_CCID, but for the RX CCID.
|
||||
|
||||
|
@ -113,6 +117,7 @@ be enabled at the receiver, too with suitable choice of CsCov.
|
|||
DCCP_SOCKOPT_SEND_CSCOV sets the sender checksum coverage. Values in the
|
||||
range 0..15 are acceptable. The default setting is 0 (full coverage),
|
||||
values between 1..15 indicate partial coverage.
|
||||
|
||||
DCCP_SOCKOPT_RECV_CSCOV is for the receiver and has a different meaning: it
|
||||
sets a threshold, where again values 0..15 are acceptable. The default
|
||||
of 0 means that all packets with a partial coverage will be discarded.
|
||||
|
@ -123,11 +128,13 @@ DCCP_SOCKOPT_RECV_CSCOV is for the receiver and has a different meaning: it
|
|||
|
||||
The following two options apply to CCID 3 exclusively and are getsockopt()-only.
|
||||
In either case, a TFRC info struct (defined in <linux/tfrc.h>) is returned.
|
||||
|
||||
DCCP_SOCKOPT_CCID_RX_INFO
|
||||
Returns a `struct tfrc_rx_info' in optval; the buffer for optval and
|
||||
Returns a ``struct tfrc_rx_info`` in optval; the buffer for optval and
|
||||
optlen must be set to at least sizeof(struct tfrc_rx_info).
|
||||
|
||||
DCCP_SOCKOPT_CCID_TX_INFO
|
||||
Returns a `struct tfrc_tx_info' in optval; the buffer for optval and
|
||||
Returns a ``struct tfrc_tx_info`` in optval; the buffer for optval and
|
||||
optlen must be set to at least sizeof(struct tfrc_tx_info).
|
||||
|
||||
On unidirectional connections it is useful to close the unused half-connection
|
||||
|
@ -182,7 +189,7 @@ sync_ratelimit = 125 ms
|
|||
IOCTLS
|
||||
======
|
||||
FIONREAD
|
||||
Works as in udp(7): returns in the `int' argument pointer the size of
|
||||
Works as in udp(7): returns in the ``int`` argument pointer the size of
|
||||
the next pending datagram in bytes, or 0 when no datagram is pending.
|
||||
|
||||
|
||||
|
@ -191,10 +198,12 @@ Other tunables
|
|||
Per-route rto_min support
|
||||
CCID-2 supports the RTAX_RTO_MIN per-route setting for the minimum value
|
||||
of the RTO timer. This setting can be modified via the 'rto_min' option
|
||||
of iproute2; for example:
|
||||
of iproute2; for example::
|
||||
|
||||
> ip route change 10.0.0.0/24 rto_min 250j dev wlan0
|
||||
> ip route add 10.0.0.254/32 rto_min 800j dev wlan0
|
||||
> ip route show dev wlan0
|
||||
|
||||
CCID-3 also supports the rto_min setting: it is used to define the lower
|
||||
bound for the expiry of the nofeedback timer. This can be useful on LANs
|
||||
with very low RTTs (e.g., loopback, Gbit ethernet).
|
|
@ -1,11 +1,14 @@
|
|||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
======================
|
||||
DCTCP (DataCenter TCP)
|
||||
----------------------
|
||||
======================
|
||||
|
||||
DCTCP is an enhancement to the TCP congestion control algorithm for data
|
||||
center networks and leverages Explicit Congestion Notification (ECN) in
|
||||
the data center network to provide multi-bit feedback to the end hosts.
|
||||
|
||||
To enable it on end hosts:
|
||||
To enable it on end hosts::
|
||||
|
||||
sysctl -w net.ipv4.tcp_congestion_control=dctcp
|
||||
sysctl -w net.ipv4.tcp_ecn_fallback=0 (optional)
|
||||
|
@ -25,14 +28,19 @@ SIGCOMM/SIGMETRICS papers:
|
|||
|
||||
i) Mohammad Alizadeh, Albert Greenberg, David A. Maltz, Jitendra Padhye,
|
||||
Parveen Patel, Balaji Prabhakar, Sudipta Sengupta, and Murari Sridharan:
|
||||
"Data Center TCP (DCTCP)", Data Center Networks session
|
||||
|
||||
"Data Center TCP (DCTCP)", Data Center Networks session"
|
||||
|
||||
Proc. ACM SIGCOMM, New Delhi, 2010.
|
||||
|
||||
http://simula.stanford.edu/~alizade/Site/DCTCP_files/dctcp-final.pdf
|
||||
http://www.sigcomm.org/ccr/papers/2010/October/1851275.1851192
|
||||
|
||||
ii) Mohammad Alizadeh, Adel Javanmard, and Balaji Prabhakar:
|
||||
|
||||
"Analysis of DCTCP: Stability, Convergence, and Fairness"
|
||||
Proc. ACM SIGMETRICS, San Jose, 2011.
|
||||
|
||||
http://simula.stanford.edu/~alizade/Site/DCTCP_files/dctcp_analysis-full.pdf
|
||||
|
||||
IETF informational draft:
|
|
@ -1,26 +1,31 @@
|
|||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
=========================================
|
||||
Linux DECnet Networking Layer Information
|
||||
===========================================
|
||||
=========================================
|
||||
|
||||
1) Other documentation....
|
||||
1. Other documentation....
|
||||
==========================
|
||||
|
||||
o Project Home Pages
|
||||
http://www.chygwyn.com/ - Kernel info
|
||||
http://linux-decnet.sourceforge.net/ - Userland tools
|
||||
http://www.sourceforge.net/projects/linux-decnet/ - Status page
|
||||
- Project Home Pages
|
||||
- http://www.chygwyn.com/ - Kernel info
|
||||
- http://linux-decnet.sourceforge.net/ - Userland tools
|
||||
- http://www.sourceforge.net/projects/linux-decnet/ - Status page
|
||||
|
||||
2) Configuring the kernel
|
||||
2. Configuring the kernel
|
||||
=========================
|
||||
|
||||
Be sure to turn on the following options:
|
||||
|
||||
CONFIG_DECNET (obviously)
|
||||
CONFIG_PROC_FS (to see what's going on)
|
||||
CONFIG_SYSCTL (for easy configuration)
|
||||
- CONFIG_DECNET (obviously)
|
||||
- CONFIG_PROC_FS (to see what's going on)
|
||||
- CONFIG_SYSCTL (for easy configuration)
|
||||
|
||||
if you want to try out router support (not properly debugged yet)
|
||||
you'll need the following options as well...
|
||||
|
||||
CONFIG_DECNET_ROUTER (to be able to add/delete routes)
|
||||
CONFIG_NETFILTER (will be required for the DECnet routing daemon)
|
||||
- CONFIG_DECNET_ROUTER (to be able to add/delete routes)
|
||||
- CONFIG_NETFILTER (will be required for the DECnet routing daemon)
|
||||
|
||||
Don't turn on SIOCGIFCONF support for DECnet unless you are really sure
|
||||
that you need it, in general you won't and it can cause ifconfig to
|
||||
|
@ -29,7 +34,7 @@ malfunction.
|
|||
Run time configuration has changed slightly from the 2.4 system. If you
|
||||
want to configure an endnode, then the simplified procedure is as follows:
|
||||
|
||||
o Set the MAC address on your ethernet card before starting _any_ other
|
||||
- Set the MAC address on your ethernet card before starting _any_ other
|
||||
network protocols.
|
||||
|
||||
As soon as your network card is brought into the UP state, DECnet should
|
||||
|
@ -37,7 +42,8 @@ start working. If you need something more complicated or are unsure how
|
|||
to set the MAC address, see the next section. Also all configurations which
|
||||
worked with 2.4 will work under 2.5 with no change.
|
||||
|
||||
3) Command line options
|
||||
3. Command line options
|
||||
=======================
|
||||
|
||||
You can set a DECnet address on the kernel command line for compatibility
|
||||
with the 2.4 configuration procedure, but in general it's not needed any more.
|
||||
|
@ -56,7 +62,7 @@ interface then you won't see any entries in /proc/net/neigh for the local
|
|||
host until such time as you start a connection. This doesn't affect the
|
||||
operation of the local communications in any other way though.
|
||||
|
||||
The kernel command line takes options looking like the following:
|
||||
The kernel command line takes options looking like the following::
|
||||
|
||||
decnet.addr=1,2
|
||||
|
||||
|
@ -82,7 +88,7 @@ address of the node in order for it to be autoconfigured (and then appear in
|
|||
FTP sites called dn2ethaddr which can compute the correct ethernet
|
||||
address to use. The address can be set by ifconfig either before or
|
||||
at the time the device is brought up. If you are using RedHat you can
|
||||
add the line:
|
||||
add the line::
|
||||
|
||||
MACADDR=AA:00:04:00:03:04
|
||||
|
||||
|
@ -95,7 +101,7 @@ verify with iproute2).
|
|||
The default device for routing can be set through the /proc filesystem
|
||||
by setting /proc/sys/net/decnet/default_device to the
|
||||
device you want DECnet to route packets out of when no specific route
|
||||
is available. Usually this will be eth0, for example:
|
||||
is available. Usually this will be eth0, for example::
|
||||
|
||||
echo -n "eth0" >/proc/sys/net/decnet/default_device
|
||||
|
||||
|
@ -106,7 +112,9 @@ confirm that by looking in the default_device file of course.
|
|||
There is a list of what the other files under /proc/sys/net/decnet/ do
|
||||
on the kernel patch web site (shown above).
|
||||
|
||||
4) Run time kernel configuration
|
||||
4. Run time kernel configuration
|
||||
================================
|
||||
|
||||
|
||||
This is either done through the sysctl/proc interface (see the kernel web
|
||||
pages for details on what the various options do) or through the iproute2
|
||||
|
@ -128,7 +136,8 @@ The DECnet raw socket layer has been removed since it was there purely
|
|||
for use by the routing daemon which will now use netfilter (a much cleaner
|
||||
and more generic solution) instead.
|
||||
|
||||
5) How can I tell if its working ?
|
||||
5. How can I tell if its working?
|
||||
=================================
|
||||
|
||||
Here is a quick guide of what to look for in order to know if your DECnet
|
||||
kernel subsystem is working.
|
||||
|
@ -160,7 +169,8 @@ kernel subsystem is working.
|
|||
network, and see if you can obtain the same results.
|
||||
- At this point you are on your own... :-)
|
||||
|
||||
6) How to send a bug report
|
||||
6. How to send a bug report
|
||||
===========================
|
||||
|
||||
If you've found a bug and want to report it, then there are several things
|
||||
you can do to help me work out exactly what it is that is wrong. Useful
|
||||
|
@ -181,7 +191,8 @@ information (_most_ of which _is_ _essential_) includes:
|
|||
You may also need to increase the length grabbed with the -s flag. The
|
||||
-e flag also provides very useful information (ethernet MAC addresses))
|
||||
|
||||
7) MAC FAQ
|
||||
7. MAC FAQ
|
||||
==========
|
||||
|
||||
A quick FAQ on ethernet MAC addresses to explain how Linux and DECnet
|
||||
interact and how to get the best performance from your hardware.
|
||||
|
@ -210,7 +221,8 @@ to gain the best efficiency. Better still is to use a card which supports
|
|||
NAPI as well.
|
||||
|
||||
|
||||
8) Mailing list
|
||||
8. Mailing list
|
||||
===============
|
||||
|
||||
If you are keen to get involved in development, or want to ask questions
|
||||
about configuration, or even just report bugs, then there is a mailing
|
||||
|
@ -218,7 +230,8 @@ list that you can join, details are at:
|
|||
|
||||
http://sourceforge.net/mail/?group_id=4993
|
||||
|
||||
9) Legal Info
|
||||
9. Legal Info
|
||||
=============
|
||||
|
||||
The Linux DECnet project team have placed their code under the GPL. The
|
||||
software is provided "as is" and without warranty express or implied.
|
|
@ -1,4 +1,10 @@
|
|||
Notes on the DEC FDDIcontroller 700 (DEFZA-xx) driver v.1.1.4.
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
=====================================================
|
||||
Notes on the DEC FDDIcontroller 700 (DEFZA-xx) driver
|
||||
=====================================================
|
||||
|
||||
:Version: v.1.1.4
|
||||
|
||||
|
||||
DEC FDDIcontroller 700 is DEC's first-generation TURBOchannel FDDI
|
|
@ -33,7 +33,7 @@ The following features are now available in supported kernels:
|
|||
- SNMP
|
||||
|
||||
Channel Bonding documentation can be found in the Linux kernel source:
|
||||
/Documentation/networking/bonding.txt
|
||||
/Documentation/networking/bonding.rst
|
||||
|
||||
|
||||
Identifying Your Adapter
|
||||
|
|
|
@ -37,7 +37,7 @@ The following features are available in this kernel:
|
|||
- SNMP
|
||||
|
||||
Channel Bonding documentation can be found in the Linux kernel source:
|
||||
/Documentation/networking/bonding.txt
|
||||
/Documentation/networking/bonding.rst
|
||||
|
||||
The driver information previously displayed in the /proc filesystem is not
|
||||
supported in this release. Alternatively, you can use ethtool (version 1.6
|
||||
|
|
|
@ -1,8 +1,10 @@
|
|||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
===================
|
||||
DNS Resolver Module
|
||||
===================
|
||||
|
||||
Contents:
|
||||
.. Contents:
|
||||
|
||||
- Overview.
|
||||
- Compilation.
|
||||
|
@ -12,8 +14,7 @@ Contents:
|
|||
- Debugging.
|
||||
|
||||
|
||||
========
|
||||
OVERVIEW
|
||||
Overview
|
||||
========
|
||||
|
||||
The DNS resolver module provides a way for kernel services to make DNS queries
|
||||
|
@ -33,50 +34,50 @@ It does not yet support the following AFS features:
|
|||
This code is extracted from the CIFS filesystem.
|
||||
|
||||
|
||||
===========
|
||||
COMPILATION
|
||||
Compilation
|
||||
===========
|
||||
|
||||
The module should be enabled by turning on the kernel configuration options:
|
||||
The module should be enabled by turning on the kernel configuration options::
|
||||
|
||||
CONFIG_DNS_RESOLVER - tristate "DNS Resolver support"
|
||||
|
||||
|
||||
==========
|
||||
SETTING UP
|
||||
Setting up
|
||||
==========
|
||||
|
||||
To set up this facility, the /etc/request-key.conf file must be altered so that
|
||||
/sbin/request-key can appropriately direct the upcalls. For example, to handle
|
||||
basic dname to IPv4/IPv6 address resolution, the following line should be
|
||||
added:
|
||||
added::
|
||||
|
||||
|
||||
#OP TYPE DESC CO-INFO PROGRAM ARG1 ARG2 ARG3 ...
|
||||
#====== ============ ======= ======= ==========================
|
||||
create dns_resolver * * /usr/sbin/cifs.upcall %k
|
||||
|
||||
To direct a query for query type 'foo', a line of the following should be added
|
||||
before the more general line given above as the first match is the one taken.
|
||||
before the more general line given above as the first match is the one taken::
|
||||
|
||||
create dns_resolver foo:* * /usr/sbin/dns.foo %k
|
||||
|
||||
|
||||
=====
|
||||
USAGE
|
||||
Usage
|
||||
=====
|
||||
|
||||
To make use of this facility, one of the following functions that are
|
||||
implemented in the module can be called after doing:
|
||||
implemented in the module can be called after doing::
|
||||
|
||||
#include <linux/dns_resolver.h>
|
||||
|
||||
(1) int dns_query(const char *type, const char *name, size_t namelen,
|
||||
::
|
||||
|
||||
int dns_query(const char *type, const char *name, size_t namelen,
|
||||
const char *options, char **_result, time_t *_expiry);
|
||||
|
||||
This is the basic access function. It looks for a cached DNS query and if
|
||||
it doesn't find it, it upcalls to userspace to make a new DNS query, which
|
||||
may then be cached. The key description is constructed as a string of the
|
||||
form:
|
||||
form::
|
||||
|
||||
[<type>:]<name>
|
||||
|
||||
|
@ -107,16 +108,14 @@ This can be cleared by any process that has the CAP_SYS_ADMIN capability by
|
|||
the use of KEYCTL_KEYRING_CLEAR on the keyring ID.
|
||||
|
||||
|
||||
===============================
|
||||
READING DNS KEYS FROM USERSPACE
|
||||
Reading DNS Keys from Userspace
|
||||
===============================
|
||||
|
||||
Keys of dns_resolver type can be read from userspace using keyctl_read() or
|
||||
"keyctl read/print/pipe".
|
||||
|
||||
|
||||
=========
|
||||
MECHANISM
|
||||
Mechanism
|
||||
=========
|
||||
|
||||
The dnsresolver module registers a key type called "dns_resolver". Keys of
|
||||
|
@ -147,11 +146,10 @@ See <file:Documentation/security/keys/request-key.rst> for further
|
|||
information about request-key function.
|
||||
|
||||
|
||||
=========
|
||||
DEBUGGING
|
||||
Debugging
|
||||
=========
|
||||
|
||||
Debugging messages can be turned on dynamically by writing a 1 into the
|
||||
following file:
|
||||
following file::
|
||||
|
||||
/sys/module/dnsresolver/parameters/debug
|
|
@ -1,4 +1,8 @@
|
|||
Document about softnet driver issues
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
=====================
|
||||
Softnet Driver Issues
|
||||
=====================
|
||||
|
||||
Transmit path guidelines:
|
||||
|
||||
|
@ -8,7 +12,7 @@ Transmit path guidelines:
|
|||
transmit function will become busy.
|
||||
|
||||
Instead it must maintain the queue properly. For example,
|
||||
for a driver implementing scatter-gather this means:
|
||||
for a driver implementing scatter-gather this means::
|
||||
|
||||
static netdev_tx_t drv_hard_start_xmit(struct sk_buff *skb,
|
||||
struct net_device *dev)
|
||||
|
@ -38,22 +42,22 @@ Transmit path guidelines:
|
|||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
||||
And then at the end of your TX reclamation event handling:
|
||||
And then at the end of your TX reclamation event handling::
|
||||
|
||||
if (netif_queue_stopped(dp->dev) &&
|
||||
TX_BUFFS_AVAIL(dp) > (MAX_SKB_FRAGS + 1))
|
||||
netif_wake_queue(dp->dev);
|
||||
|
||||
For a non-scatter-gather supporting card, the three tests simply become:
|
||||
For a non-scatter-gather supporting card, the three tests simply become::
|
||||
|
||||
/* This is a hard error log it. */
|
||||
if (TX_BUFFS_AVAIL(dp) <= 0)
|
||||
|
||||
and:
|
||||
and::
|
||||
|
||||
if (TX_BUFFS_AVAIL(dp) == 0)
|
||||
|
||||
and:
|
||||
and::
|
||||
|
||||
if (netif_queue_stopped(dp->dev) &&
|
||||
TX_BUFFS_AVAIL(dp) > 0)
|
|
@ -1,5 +1,11 @@
|
|||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
==========================================
|
||||
EQL Driver: Serial IP Load Balancing HOWTO
|
||||
==========================================
|
||||
|
||||
Simon "Guru Aleph-Null" Janes, simon@ncm.com
|
||||
|
||||
v1.1, February 27, 1995
|
||||
|
||||
This is the manual for the EQL device driver. EQL is a software device
|
||||
|
@ -13,6 +19,7 @@
|
|||
source trees. (Yes, it worked fine.)
|
||||
|
||||
1. Introduction
|
||||
===============
|
||||
|
||||
Which is worse? A huge fee for a 56K leased line or two phone lines?
|
||||
It's probably the former. If you find yourself craving more bandwidth,
|
||||
|
@ -42,46 +49,39 @@
|
|||
|
||||
|
||||
2. Kernel Configuration
|
||||
=======================
|
||||
|
||||
Here I describe the general steps of getting a kernel up and working
|
||||
with the eql driver. From patching, building, to installing.
|
||||
|
||||
|
||||
2.1. Patching The Kernel
|
||||
------------------------
|
||||
|
||||
If you do not have or cannot get a copy of the kernel with the eql
|
||||
driver folded into it, get your copy of the driver from
|
||||
ftp://slaughter.ncm.com/pub/Linux/LOAD_BALANCING/eql-1.1.tar.gz.
|
||||
Unpack this archive someplace obvious like /usr/local/src/. It will
|
||||
create the following files:
|
||||
create the following files::
|
||||
|
||||
|
||||
|
||||
______________________________________________________________________
|
||||
-rw-r--r-- guru/ncm 198 Jan 19 18:53 1995 eql-1.1/NO-WARRANTY
|
||||
-rw-r--r-- guru/ncm 30620 Feb 27 21:40 1995 eql-1.1/eql-1.1.patch
|
||||
-rwxr-xr-x guru/ncm 16111 Jan 12 22:29 1995 eql-1.1/eql_enslave
|
||||
-rw-r--r-- guru/ncm 2195 Jan 10 21:48 1995 eql-1.1/eql_enslave.c
|
||||
______________________________________________________________________
|
||||
|
||||
Unpack a recent kernel (something after 1.1.92) someplace convenient
|
||||
like say /usr/src/linux-1.1.92.eql. Use symbolic links to point
|
||||
/usr/src/linux to this development directory.
|
||||
|
||||
|
||||
Apply the patch by running the commands:
|
||||
Apply the patch by running the commands::
|
||||
|
||||
|
||||
______________________________________________________________________
|
||||
cd /usr/src
|
||||
patch </usr/local/src/eql-1.1/eql-1.1.patch
|
||||
______________________________________________________________________
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
2.2. Building The Kernel
|
||||
------------------------
|
||||
|
||||
After patching the kernel, run make config and configure the kernel
|
||||
for your hardware.
|
||||
|
@ -91,6 +91,7 @@
|
|||
|
||||
|
||||
3. Network Configuration
|
||||
========================
|
||||
|
||||
So far, I have only used the eql device with the DSLIP SLIP connection
|
||||
manager by Matt Dillon (-- "The man who sold his soul to code so much
|
||||
|
@ -101,36 +102,26 @@
|
|||
|
||||
|
||||
3.1. /etc/rc.d/rc.inet1
|
||||
-----------------------
|
||||
|
||||
In rc.inet1, ifconfig the eql device to the IP address you usually use
|
||||
for your machine, and the MTU you prefer for your SLIP lines. One
|
||||
could argue that MTU should be roughly half the usual size for two
|
||||
modems, one-third for three, one-fourth for four, etc... But going
|
||||
too far below 296 is probably overkill. Here is an example ifconfig
|
||||
command that sets up the eql device:
|
||||
command that sets up the eql device::
|
||||
|
||||
|
||||
|
||||
______________________________________________________________________
|
||||
ifconfig eql 198.67.33.239 mtu 1006
|
||||
______________________________________________________________________
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Once the eql device is up and running, add a static default route to
|
||||
it in the routing table using the cool new route syntax that makes
|
||||
life so much easier:
|
||||
life so much easier::
|
||||
|
||||
|
||||
|
||||
______________________________________________________________________
|
||||
route add default eql
|
||||
______________________________________________________________________
|
||||
|
||||
|
||||
3.2. Enslaving Devices By Hand
|
||||
------------------------------
|
||||
|
||||
Enslaving devices by hand requires two utility programs: eql_enslave
|
||||
and eql_emancipate (-- eql_emancipate hasn't been written because when
|
||||
|
@ -140,63 +131,35 @@
|
|||
|
||||
|
||||
The syntax for enslaving a device is "eql_enslave <master-name>
|
||||
<slave-name> <estimated-bps>". Here are some example enslavings:
|
||||
<slave-name> <estimated-bps>". Here are some example enslavings::
|
||||
|
||||
|
||||
|
||||
______________________________________________________________________
|
||||
eql_enslave eql sl0 28800
|
||||
eql_enslave eql ppp0 14400
|
||||
eql_enslave eql sl1 57600
|
||||
______________________________________________________________________
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
When you want to free a device from its life of slavery, you can
|
||||
either down the device with ifconfig (eql will automatically bury the
|
||||
dead slave and remove it from its queue) or use eql_emancipate to free
|
||||
it. (-- Or just ifconfig it down, and the eql driver will take it out
|
||||
for you.--)
|
||||
for you.--)::
|
||||
|
||||
|
||||
|
||||
______________________________________________________________________
|
||||
eql_emancipate eql sl0
|
||||
eql_emancipate eql ppp0
|
||||
eql_emancipate eql sl1
|
||||
______________________________________________________________________
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
3.3. DSLIP Configuration for the eql Device
|
||||
-------------------------------------------
|
||||
|
||||
The general idea is to bring up and keep up as many SLIP connections
|
||||
as you need, automatically.
|
||||
|
||||
|
||||
3.3.1. /etc/slip/runslip.conf
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Here is an example runslip.conf:
|
||||
Here is an example runslip.conf::
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
______________________________________________________________________
|
||||
name sl-line-1
|
||||
enabled
|
||||
baud 38400
|
||||
|
@ -214,13 +177,10 @@
|
|||
command eql_enslave eql $interface 28800
|
||||
address 198.67.33.239
|
||||
line /dev/cua3
|
||||
______________________________________________________________________
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
3.4. Using PPP and the eql Device
|
||||
---------------------------------
|
||||
|
||||
I have not yet done any load-balancing testing for PPP devices, mainly
|
||||
because I don't have a PPP-connection manager like SLIP has with
|
||||
|
@ -236,6 +196,7 @@
|
|||
|
||||
|
||||
4. About the Slave Scheduler Algorithm
|
||||
======================================
|
||||
|
||||
The slave scheduler probably could be replaced with a dozen other
|
||||
things and push traffic much faster. The formula in the current set
|
||||
|
@ -255,6 +216,7 @@
|
|||
|
||||
|
||||
5. Testers' Reports
|
||||
===================
|
||||
|
||||
Some people have experimented with the eql device with newer
|
||||
kernels (than 1.1.75). I have since updated the driver to patch
|
||||
|
@ -262,71 +224,13 @@
|
|||
balancing" driver config option.
|
||||
|
||||
|
||||
o icee from LinuxNET patched 1.1.86 without any rejects and was able
|
||||
- icee from LinuxNET patched 1.1.86 without any rejects and was able
|
||||
to boot the kernel and enslave a couple of ISDN PPP links.
|
||||
|
||||
5.1. Randolph Bentson's Test Report
|
||||
-----------------------------------
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
::
|
||||
|
||||
From bentson@grieg.seaslug.org Wed Feb 8 19:08:09 1995
|
||||
Date: Tue, 7 Feb 95 22:57 PST
|
||||
|
@ -342,7 +246,7 @@
|
|||
Randolph Bentson
|
||||
bentson@grieg.seaslug.org
|
||||
|
||||
---------------------------------------------------------
|
||||
------------------------------------------------------------------
|
||||
|
||||
|
||||
A pseudo-device driver, EQL, written by Simon Janes, can be used
|
||||
|
@ -363,7 +267,7 @@
|
|||
Once a link was established, I timed a binary ftp transfer of
|
||||
289284 bytes of data. If there were no overhead (packet headers,
|
||||
inter-character and inter-packet delays, etc.) the transfers
|
||||
would take the following times:
|
||||
would take the following times::
|
||||
|
||||
bits/sec seconds
|
||||
345600 8.3
|
||||
|
@ -388,8 +292,10 @@
|
|||
that the connection establishment seemed fragile for the higher
|
||||
speeds. Once established, the connection seemed robust enough.)
|
||||
|
||||
====== ======== === ======== ======= ======= ===
|
||||
#lines speed mtu seconds theory actual %of
|
||||
kbit/sec duration speed speed max
|
||||
====== ======== === ======== ======= ======= ===
|
||||
3 115200 900 _ 345600
|
||||
3 115200 400 18.1 345600 159825 46
|
||||
2 115200 900 _ 230400
|
||||
|
@ -447,18 +353,12 @@
|
|||
1 9600 900 305 9600 9484.72 98
|
||||
1 9600 600 314 9600 9212.87 95
|
||||
1 9600 400 332 9600 8713.37 90
|
||||
|
||||
|
||||
|
||||
|
||||
====== ======== === ======== ======= ======= ===
|
||||
|
||||
5.2. Anthony Healy's Report
|
||||
---------------------------
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
::
|
||||
|
||||
Date: Mon, 13 Feb 1995 16:17:29 +1100 (EST)
|
||||
From: Antony Healey <ahealey@st.nepean.uws.edu.au>
|
||||
|
@ -471,58 +371,3 @@
|
|||
able to data at over 48Kb/s [ISDN link -Simon]. I managed a
|
||||
transfer of up to 7.5 Kbyte/s on one go, but averaged around
|
||||
6.4 Kbyte/s, which I think is pretty cool. :)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -1,4 +1,8 @@
|
|||
LC-trie implementation notes.
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
============================
|
||||
LC-trie implementation notes
|
||||
============================
|
||||
|
||||
Node types
|
||||
----------
|
|
@ -1,3 +1,6 @@
|
|||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
=======================================================
|
||||
Linux Socket Filtering aka Berkeley Packet Filter (BPF)
|
||||
=======================================================
|
||||
|
||||
|
@ -42,10 +45,10 @@ displays what is being placed into this structure.
|
|||
|
||||
Although we were only speaking about sockets here, BPF in Linux is used
|
||||
in many more places. There's xt_bpf for netfilter, cls_bpf in the kernel
|
||||
qdisc layer, SECCOMP-BPF (SECure COMPuting [1]), and lots of other places
|
||||
qdisc layer, SECCOMP-BPF (SECure COMPuting [1]_), and lots of other places
|
||||
such as team driver, PTP code, etc where BPF is being used.
|
||||
|
||||
[1] Documentation/userspace-api/seccomp_filter.rst
|
||||
.. [1] Documentation/userspace-api/seccomp_filter.rst
|
||||
|
||||
Original BPF paper:
|
||||
|
||||
|
@ -59,7 +62,7 @@ Structure
|
|||
---------
|
||||
|
||||
User space applications include <linux/filter.h> which contains the
|
||||
following relevant structures:
|
||||
following relevant structures::
|
||||
|
||||
struct sock_filter { /* Filter block */
|
||||
__u16 code; /* Actual filter code */
|
||||
|
@ -70,7 +73,7 @@ struct sock_filter { /* Filter block */
|
|||
|
||||
Such a structure is assembled as an array of 4-tuples, that contains
|
||||
a code, jt, jf and k value. jt and jf are jump offsets and k a generic
|
||||
value to be used for a provided code.
|
||||
value to be used for a provided code::
|
||||
|
||||
struct sock_fprog { /* Required for SO_ATTACH_FILTER. */
|
||||
unsigned short len; /* Number of filter blocks */
|
||||
|
@ -83,6 +86,8 @@ follow-up example) is being passed to the kernel through setsockopt(2).
|
|||
Example
|
||||
-------
|
||||
|
||||
::
|
||||
|
||||
#include <sys/socket.h>
|
||||
#include <sys/types.h>
|
||||
#include <arpa/inet.h>
|
||||
|
@ -178,15 +183,17 @@ closely modelled after Steven McCanne's and Van Jacobson's BPF paper.
|
|||
|
||||
The BPF architecture consists of the following basic elements:
|
||||
|
||||
======= ====================================================
|
||||
Element Description
|
||||
|
||||
======= ====================================================
|
||||
A 32 bit wide accumulator
|
||||
X 32 bit wide X register
|
||||
M[] 16 x 32 bit wide misc registers aka "scratch memory
|
||||
store", addressable from 0 to 15
|
||||
======= ====================================================
|
||||
|
||||
A program, that is translated by bpf_asm into "opcodes" is an array that
|
||||
consists of the following elements (as already mentioned):
|
||||
consists of the following elements (as already mentioned)::
|
||||
|
||||
op:16, jt:8, jf:8, k:32
|
||||
|
||||
|
@ -201,8 +208,9 @@ and return instructions that are also represented in bpf_asm syntax. This
|
|||
table lists all bpf_asm instructions available resp. what their underlying
|
||||
opcodes as defined in linux/filter.h stand for:
|
||||
|
||||
=========== =================== =====================
|
||||
Instruction Addressing mode Description
|
||||
|
||||
=========== =================== =====================
|
||||
ld 1, 2, 3, 4, 12 Load word into A
|
||||
ldi 4 Load word into A
|
||||
ldh 1, 2 Load half-word into A
|
||||
|
@ -241,11 +249,13 @@ opcodes as defined in linux/filter.h stand for:
|
|||
txa Copy X into A
|
||||
|
||||
ret 4, 11 Return
|
||||
=========== =================== =====================
|
||||
|
||||
The next table shows addressing formats from the 2nd column:
|
||||
|
||||
=============== =================== ===============================================
|
||||
Addressing mode Syntax Description
|
||||
|
||||
=============== =================== ===============================================
|
||||
0 x/%x Register X
|
||||
1 [k] BHW at byte offset k in the packet
|
||||
2 [x + k] BHW at the offset X + k in the packet
|
||||
|
@ -259,6 +269,7 @@ The next table shows addressing formats from the 2nd column:
|
|||
10 x/%x,Lt Jump to Lt if predicate is true
|
||||
11 a/%a Accumulator A
|
||||
12 extension BPF extension
|
||||
=============== =================== ===============================================
|
||||
|
||||
The Linux kernel also has a couple of BPF extensions that are used along
|
||||
with the class of load instructions by "overloading" the k argument with
|
||||
|
@ -267,8 +278,9 @@ extensions are loaded into A.
|
|||
|
||||
Possible BPF extensions are shown in the following table:
|
||||
|
||||
=================================== =================================================
|
||||
Extension Description
|
||||
|
||||
=================================== =================================================
|
||||
len skb->len
|
||||
proto skb->protocol
|
||||
type skb->pkt_type
|
||||
|
@ -285,18 +297,19 @@ Possible BPF extensions are shown in the following table:
|
|||
vlan_avail skb_vlan_tag_present(skb)
|
||||
vlan_tpid skb->vlan_proto
|
||||
rand prandom_u32()
|
||||
=================================== =================================================
|
||||
|
||||
These extensions can also be prefixed with '#'.
|
||||
Examples for low-level BPF:
|
||||
|
||||
** ARP packets:
|
||||
**ARP packets**::
|
||||
|
||||
ldh [12]
|
||||
jne #0x806, drop
|
||||
ret #-1
|
||||
drop: ret #0
|
||||
|
||||
** IPv4 TCP packets:
|
||||
**IPv4 TCP packets**::
|
||||
|
||||
ldh [12]
|
||||
jne #0x800, drop
|
||||
|
@ -305,14 +318,15 @@ Examples for low-level BPF:
|
|||
ret #-1
|
||||
drop: ret #0
|
||||
|
||||
** (Accelerated) VLAN w/ id 10:
|
||||
**(Accelerated) VLAN w/ id 10**::
|
||||
|
||||
ld vlan_tci
|
||||
jneq #10, drop
|
||||
ret #-1
|
||||
drop: ret #0
|
||||
|
||||
** icmp random packet sampling, 1 in 4
|
||||
**icmp random packet sampling, 1 in 4**:
|
||||
|
||||
ldh [12]
|
||||
jne #0x800, drop
|
||||
ldb [23]
|
||||
|
@ -324,7 +338,7 @@ Examples for low-level BPF:
|
|||
ret #-1
|
||||
drop: ret #0
|
||||
|
||||
** SECCOMP filter example:
|
||||
**SECCOMP filter example**::
|
||||
|
||||
ld [4] /* offsetof(struct seccomp_data, arch) */
|
||||
jne #0xc000003e, bad /* AUDIT_ARCH_X86_64 */
|
||||
|
@ -345,12 +359,12 @@ Examples for low-level BPF:
|
|||
The above example code can be placed into a file (here called "foo"), and
|
||||
then be passed to the bpf_asm tool for generating opcodes, output that xt_bpf
|
||||
and cls_bpf understands and can directly be loaded with. Example with above
|
||||
ARP code:
|
||||
ARP code::
|
||||
|
||||
$ ./bpf_asm foo
|
||||
4,40 0 0 12,21 0 1 2054,6 0 0 4294967295,6 0 0 0,
|
||||
|
||||
In copy and paste C-like output:
|
||||
In copy and paste C-like output::
|
||||
|
||||
$ ./bpf_asm -c foo
|
||||
{ 0x28, 0, 0, 0x0000000c },
|
||||
|
@ -365,7 +379,7 @@ bpf_dbg under tools/bpf/ in the kernel source directory. This debugger allows
|
|||
for testing BPF filters against given pcap files, single stepping through the
|
||||
BPF code on the pcap's packets and to do BPF machine register dumps.
|
||||
|
||||
Starting bpf_dbg is trivial and just requires issuing:
|
||||
Starting bpf_dbg is trivial and just requires issuing::
|
||||
|
||||
# ./bpf_dbg
|
||||
|
||||
|
@ -381,31 +395,36 @@ Interaction in bpf_dbg happens through a shell that also has auto-completion
|
|||
support (follow-up example commands starting with '>' denote bpf_dbg shell).
|
||||
The usual workflow would be to ...
|
||||
|
||||
> load bpf 6,40 0 0 12,21 0 3 2048,48 0 0 23,21 0 1 1,6 0 0 65535,6 0 0 0
|
||||
* load bpf 6,40 0 0 12,21 0 3 2048,48 0 0 23,21 0 1 1,6 0 0 65535,6 0 0 0
|
||||
Loads a BPF filter from standard output of bpf_asm, or transformed via
|
||||
e.g. `tcpdump -iem1 -ddd port 22 | tr '\n' ','`. Note that for JIT
|
||||
e.g. ``tcpdump -iem1 -ddd port 22 | tr '\n' ','``. Note that for JIT
|
||||
debugging (next section), this command creates a temporary socket and
|
||||
loads the BPF code into the kernel. Thus, this will also be useful for
|
||||
JIT developers.
|
||||
|
||||
> load pcap foo.pcap
|
||||
* load pcap foo.pcap
|
||||
|
||||
Loads standard tcpdump pcap file.
|
||||
|
||||
> run [<n>]
|
||||
* run [<n>]
|
||||
|
||||
bpf passes:1 fails:9
|
||||
Runs through all packets from a pcap to account how many passes and fails
|
||||
the filter will generate. A limit of packets to traverse can be given.
|
||||
|
||||
> disassemble
|
||||
* disassemble::
|
||||
|
||||
l0: ldh [12]
|
||||
l1: jeq #0x800, l2, l5
|
||||
l2: ldb [23]
|
||||
l3: jeq #0x1, l4, l5
|
||||
l4: ret #0xffff
|
||||
l5: ret #0
|
||||
|
||||
Prints out BPF code disassembly.
|
||||
|
||||
> dump
|
||||
* dump::
|
||||
|
||||
/* { op, jt, jf, k }, */
|
||||
{ 0x28, 0, 0, 0x0000000c },
|
||||
{ 0x15, 0, 3, 0x00000800 },
|
||||
|
@ -413,19 +432,26 @@ l5: ret #0
|
|||
{ 0x15, 0, 1, 0x00000001 },
|
||||
{ 0x06, 0, 0, 0x0000ffff },
|
||||
{ 0x06, 0, 0, 0000000000 },
|
||||
|
||||
Prints out C-style BPF code dump.
|
||||
|
||||
> breakpoint 0
|
||||
* breakpoint 0::
|
||||
|
||||
breakpoint at: l0: ldh [12]
|
||||
> breakpoint 1
|
||||
|
||||
* breakpoint 1::
|
||||
|
||||
breakpoint at: l1: jeq #0x800, l2, l5
|
||||
|
||||
...
|
||||
|
||||
Sets breakpoints at particular BPF instructions. Issuing a `run` command
|
||||
will walk through the pcap file continuing from the current packet and
|
||||
break when a breakpoint is being hit (another `run` will continue from
|
||||
the currently active breakpoint executing next instructions):
|
||||
|
||||
> run
|
||||
* run::
|
||||
|
||||
-- register dump --
|
||||
pc: [0] <-- program counter
|
||||
code: [40] jt[0] jf[0] k[12] <-- plain BPF code of current instruction
|
||||
|
@ -441,24 +467,28 @@ breakpoint at: l1: jeq #0x800, l2, l5
|
|||
(breakpoint)
|
||||
>
|
||||
|
||||
> breakpoint
|
||||
* breakpoint::
|
||||
|
||||
breakpoints: 0 1
|
||||
|
||||
Prints currently set breakpoints.
|
||||
|
||||
> step [-<n>, +<n>]
|
||||
* step [-<n>, +<n>]
|
||||
|
||||
Performs single stepping through the BPF program from the current pc
|
||||
offset. Thus, on each step invocation, above register dump is issued.
|
||||
This can go forwards and backwards in time, a plain `step` will break
|
||||
on the next BPF instruction, thus +1. (No `run` needs to be issued here.)
|
||||
|
||||
> select <n>
|
||||
* select <n>
|
||||
|
||||
Selects a given packet from the pcap file to continue from. Thus, on
|
||||
the next `run` or `step`, the BPF program is being evaluated against
|
||||
the user pre-selected packet. Numbering starts just as in Wireshark
|
||||
with index 1.
|
||||
|
||||
> quit
|
||||
#
|
||||
* quit
|
||||
|
||||
Exits bpf_dbg.
|
||||
|
||||
JIT compiler
|
||||
|
@ -468,16 +498,16 @@ The Linux kernel has a built-in BPF JIT compiler for x86_64, SPARC,
|
|||
PowerPC, ARM, ARM64, MIPS, RISC-V and s390 and can be enabled through
|
||||
CONFIG_BPF_JIT. The JIT compiler is transparently invoked for each
|
||||
attached filter from user space or for internal kernel users if it has
|
||||
been previously enabled by root:
|
||||
been previously enabled by root::
|
||||
|
||||
echo 1 > /proc/sys/net/core/bpf_jit_enable
|
||||
|
||||
For JIT developers, doing audits etc, each compile run can output the generated
|
||||
opcode image into the kernel log via:
|
||||
opcode image into the kernel log via::
|
||||
|
||||
echo 2 > /proc/sys/net/core/bpf_jit_enable
|
||||
|
||||
Example output from dmesg:
|
||||
Example output from dmesg::
|
||||
|
||||
[ 3389.935842] flen=6 proglen=70 pass=3 image=ffffffffa0069c8f
|
||||
[ 3389.935847] JIT code: 00000000: 55 48 89 e5 48 83 ec 60 48 89 5d f8 44 8b 4f 68
|
||||
|
@ -493,7 +523,7 @@ is discouraged and introspection through bpftool (under tools/bpf/bpftool/) is t
|
|||
generally recommended approach instead.
|
||||
|
||||
In the kernel source tree under tools/bpf/, there's bpf_jit_disasm for
|
||||
generating disassembly out of the kernel log's hexdump:
|
||||
generating disassembly out of the kernel log's hexdump::
|
||||
|
||||
# ./bpf_jit_disasm
|
||||
70 bytes emitted from JIT compiler (pass:3, flen:6)
|
||||
|
@ -663,9 +693,9 @@ Some core changes of the new internal format:
|
|||
|
||||
- Conditional jt/jf targets replaced with jt/fall-through:
|
||||
|
||||
While the original design has constructs such as "if (cond) jump_true;
|
||||
else jump_false;", they are being replaced into alternative constructs like
|
||||
"if (cond) jump_true; /* else fall-through */".
|
||||
While the original design has constructs such as ``if (cond) jump_true;
|
||||
else jump_false;``, they are being replaced into alternative constructs like
|
||||
``if (cond) jump_true; /* else fall-through */``.
|
||||
|
||||
- Introduces bpf_call insn and register passing convention for zero overhead
|
||||
calls from/to other kernel functions:
|
||||
|
@ -684,13 +714,13 @@ Some core changes of the new internal format:
|
|||
a return value of the function. Since R6 - R9 are callee saved, their state
|
||||
is preserved across the call.
|
||||
|
||||
For example, consider three C functions:
|
||||
For example, consider three C functions::
|
||||
|
||||
u64 f1() { return (*_f2)(1); }
|
||||
u64 f2(u64 a) { return f3(a + 1, a); }
|
||||
u64 f3(u64 a, u64 b) { return a - b; }
|
||||
|
||||
GCC can compile f1, f3 into x86_64:
|
||||
GCC can compile f1, f3 into x86_64::
|
||||
|
||||
f1:
|
||||
movl $1, %edi
|
||||
|
@ -701,7 +731,7 @@ Some core changes of the new internal format:
|
|||
subq %rsi, %rax
|
||||
ret
|
||||
|
||||
Function f2 in eBPF may look like:
|
||||
Function f2 in eBPF may look like::
|
||||
|
||||
f2:
|
||||
bpf_mov R2, R1
|
||||
|
@ -709,7 +739,7 @@ Some core changes of the new internal format:
|
|||
bpf_call f3
|
||||
bpf_exit
|
||||
|
||||
If f2 is JITed and the pointer stored to '_f2'. The calls f1 -> f2 -> f3 and
|
||||
If f2 is JITed and the pointer stored to ``_f2``. The calls f1 -> f2 -> f3 and
|
||||
returns will be seamless. Without JIT, __bpf_prog_run() interpreter needs to
|
||||
be used to call into f2.
|
||||
|
||||
|
@ -722,6 +752,8 @@ Some core changes of the new internal format:
|
|||
On 64-bit architectures all register map to HW registers one to one. For
|
||||
example, x86_64 JIT compiler can map them as ...
|
||||
|
||||
::
|
||||
|
||||
R0 - rax
|
||||
R1 - rdi
|
||||
R2 - rsi
|
||||
|
@ -737,7 +769,7 @@ Some core changes of the new internal format:
|
|||
... since x86_64 ABI mandates rdi, rsi, rdx, rcx, r8, r9 for argument passing
|
||||
and rbx, r12 - r15 are callee saved.
|
||||
|
||||
Then the following internal BPF pseudo-program:
|
||||
Then the following internal BPF pseudo-program::
|
||||
|
||||
bpf_mov R6, R1 /* save ctx */
|
||||
bpf_mov R2, 2
|
||||
|
@ -755,7 +787,7 @@ Some core changes of the new internal format:
|
|||
bpf_add R0, R7
|
||||
bpf_exit
|
||||
|
||||
After JIT to x86_64 may look like:
|
||||
After JIT to x86_64 may look like::
|
||||
|
||||
push %rbp
|
||||
mov %rsp,%rbp
|
||||
|
@ -781,7 +813,7 @@ Some core changes of the new internal format:
|
|||
leaveq
|
||||
retq
|
||||
|
||||
Which is in this example equivalent in C to:
|
||||
Which is in this example equivalent in C to::
|
||||
|
||||
u64 bpf_filter(u64 ctx)
|
||||
{
|
||||
|
@ -790,12 +822,12 @@ Some core changes of the new internal format:
|
|||
|
||||
In-kernel functions foo() and bar() with prototype: u64 (*)(u64 arg1, u64
|
||||
arg2, u64 arg3, u64 arg4, u64 arg5); will receive arguments in proper
|
||||
registers and place their return value into '%rax' which is R0 in eBPF.
|
||||
registers and place their return value into ``%rax`` which is R0 in eBPF.
|
||||
Prologue and epilogue are emitted by JIT and are implicit in the
|
||||
interpreter. R0-R5 are scratch registers, so eBPF program needs to preserve
|
||||
them across the calls as defined by calling convention.
|
||||
|
||||
For example the following program is invalid:
|
||||
For example the following program is invalid::
|
||||
|
||||
bpf_mov R1, 1
|
||||
bpf_call foo
|
||||
|
@ -814,7 +846,7 @@ The input context pointer for invoking the interpreter function is generic,
|
|||
its content is defined by a specific use case. For seccomp register R1 points
|
||||
to seccomp_data, for converted BPF filters R1 points to a skb.
|
||||
|
||||
A program, that is translated internally consists of the following elements:
|
||||
A program, that is translated internally consists of the following elements::
|
||||
|
||||
op:16, jt:8, jf:8, k:32 ==> op:8, dst_reg:4, src_reg:4, off:16, imm:32
|
||||
|
||||
|
@ -824,7 +856,7 @@ instructions must be multiple of 8 bytes to preserve backward compatibility.
|
|||
|
||||
Internal BPF is a general purpose RISC instruction set. Not every register and
|
||||
every instruction are used during translation from original BPF to new format.
|
||||
For example, socket filters are not using 'exclusive add' instruction, but
|
||||
For example, socket filters are not using ``exclusive add`` instruction, but
|
||||
tracing filters may do to maintain counters of events, for example. Register R9
|
||||
is not used by socket filters either, but more complex filters may be running
|
||||
out of registers and would have to resort to spill/fill to stack.
|
||||
|
@ -849,7 +881,7 @@ eBPF opcode encoding
|
|||
|
||||
eBPF is reusing most of the opcode encoding from classic to simplify conversion
|
||||
of classic BPF to eBPF. For arithmetic and jump instructions the 8-bit 'code'
|
||||
field is divided into three parts:
|
||||
field is divided into three parts::
|
||||
|
||||
+----------------+--------+--------------------+
|
||||
| 4 bits | 1 bit | 3 bits |
|
||||
|
@ -859,8 +891,9 @@ field is divided into three parts:
|
|||
|
||||
Three LSB bits store instruction class which is one of:
|
||||
|
||||
Classic BPF classes: eBPF classes:
|
||||
|
||||
=================== ===============
|
||||
Classic BPF classes eBPF classes
|
||||
=================== ===============
|
||||
BPF_LD 0x00 BPF_LD 0x00
|
||||
BPF_LDX 0x01 BPF_LDX 0x01
|
||||
BPF_ST 0x02 BPF_ST 0x02
|
||||
|
@ -869,25 +902,28 @@ Three LSB bits store instruction class which is one of:
|
|||
BPF_JMP 0x05 BPF_JMP 0x05
|
||||
BPF_RET 0x06 BPF_JMP32 0x06
|
||||
BPF_MISC 0x07 BPF_ALU64 0x07
|
||||
=================== ===============
|
||||
|
||||
When BPF_CLASS(code) == BPF_ALU or BPF_JMP, 4th bit encodes source operand ...
|
||||
|
||||
::
|
||||
|
||||
BPF_K 0x00
|
||||
BPF_X 0x08
|
||||
|
||||
* in classic BPF, this means:
|
||||
* in classic BPF, this means::
|
||||
|
||||
BPF_SRC(code) == BPF_X - use register X as source operand
|
||||
BPF_SRC(code) == BPF_K - use 32-bit immediate as source operand
|
||||
|
||||
* in eBPF, this means:
|
||||
* in eBPF, this means::
|
||||
|
||||
BPF_SRC(code) == BPF_X - use 'src_reg' register as source operand
|
||||
BPF_SRC(code) == BPF_K - use 32-bit immediate as source operand
|
||||
|
||||
... and four MSB bits store operation code.
|
||||
|
||||
If BPF_CLASS(code) == BPF_ALU or BPF_ALU64 [ in eBPF ], BPF_OP(code) is one of:
|
||||
If BPF_CLASS(code) == BPF_ALU or BPF_ALU64 [ in eBPF ], BPF_OP(code) is one of::
|
||||
|
||||
BPF_ADD 0x00
|
||||
BPF_SUB 0x10
|
||||
|
@ -904,7 +940,7 @@ If BPF_CLASS(code) == BPF_ALU or BPF_ALU64 [ in eBPF ], BPF_OP(code) is one of:
|
|||
BPF_ARSH 0xc0 /* eBPF only: sign extending shift right */
|
||||
BPF_END 0xd0 /* eBPF only: endianness conversion */
|
||||
|
||||
If BPF_CLASS(code) == BPF_JMP or BPF_JMP32 [ in eBPF ], BPF_OP(code) is one of:
|
||||
If BPF_CLASS(code) == BPF_JMP or BPF_JMP32 [ in eBPF ], BPF_OP(code) is one of::
|
||||
|
||||
BPF_JA 0x00 /* BPF_JMP only */
|
||||
BPF_JEQ 0x10
|
||||
|
@ -934,7 +970,7 @@ exactly the same operations as BPF_ALU, but with 64-bit wide operands
|
|||
instead. So BPF_ADD | BPF_X | BPF_ALU64 means 64-bit addition, i.e.:
|
||||
dst_reg = dst_reg + src_reg
|
||||
|
||||
Classic BPF wastes the whole BPF_RET class to represent a single 'ret'
|
||||
Classic BPF wastes the whole BPF_RET class to represent a single ``ret``
|
||||
operation. Classic BPF_RET | BPF_K means copy imm32 into return register
|
||||
and perform function exit. eBPF is modeled to match CPU, so BPF_JMP | BPF_EXIT
|
||||
in eBPF means function exit only. The eBPF program needs to store return
|
||||
|
@ -942,7 +978,7 @@ value into register R0 before doing a BPF_EXIT. Class 6 in eBPF is used as
|
|||
BPF_JMP32 to mean exactly the same operations as BPF_JMP, but with 32-bit wide
|
||||
operands for the comparisons instead.
|
||||
|
||||
For load and store instructions the 8-bit 'code' field is divided as:
|
||||
For load and store instructions the 8-bit 'code' field is divided as::
|
||||
|
||||
+--------+--------+-------------------+
|
||||
| 3 bits | 2 bits | 3 bits |
|
||||
|
@ -952,19 +988,21 @@ For load and store instructions the 8-bit 'code' field is divided as:
|
|||
|
||||
Size modifier is one of ...
|
||||
|
||||
::
|
||||
|
||||
BPF_W 0x00 /* word */
|
||||
BPF_H 0x08 /* half word */
|
||||
BPF_B 0x10 /* byte */
|
||||
BPF_DW 0x18 /* eBPF only, double word */
|
||||
|
||||
... which encodes size of load/store operation:
|
||||
... which encodes size of load/store operation::
|
||||
|
||||
B - 1 byte
|
||||
H - 2 byte
|
||||
W - 4 byte
|
||||
DW - 8 byte (eBPF only)
|
||||
|
||||
Mode modifier is one of:
|
||||
Mode modifier is one of::
|
||||
|
||||
BPF_IMM 0x00 /* used for 32-bit mov in classic BPF and 64-bit in eBPF */
|
||||
BPF_ABS 0x20
|
||||
|
@ -979,7 +1017,7 @@ eBPF has two non-generic instructions: (BPF_ABS | <size> | BPF_LD) and
|
|||
|
||||
They had to be carried over from classic to have strong performance of
|
||||
socket filters running in eBPF interpreter. These instructions can only
|
||||
be used when interpreter context is a pointer to 'struct sk_buff' and
|
||||
be used when interpreter context is a pointer to ``struct sk_buff`` and
|
||||
have seven implicit operands. Register R6 is an implicit input that must
|
||||
contain pointer to sk_buff. Register R0 is an implicit output which contains
|
||||
the data fetched from the packet. Registers R1-R5 are scratch registers
|
||||
|
@ -992,14 +1030,14 @@ the interpreter will abort the execution of the program. JIT compilers
|
|||
therefore must preserve this property. src_reg and imm32 fields are
|
||||
explicit inputs to these instructions.
|
||||
|
||||
For example:
|
||||
For example::
|
||||
|
||||
BPF_IND | BPF_W | BPF_LD means:
|
||||
|
||||
R0 = ntohl(*(u32 *) (((struct sk_buff *) R6)->data + src_reg + imm32))
|
||||
and R1 - R5 were scratched.
|
||||
|
||||
Unlike classic BPF instruction set, eBPF has generic load/store operations:
|
||||
Unlike classic BPF instruction set, eBPF has generic load/store operations::
|
||||
|
||||
BPF_MEM | <size> | BPF_STX: *(size *) (dst_reg + off) = src_reg
|
||||
BPF_MEM | <size> | BPF_ST: *(size *) (dst_reg + off) = imm32
|
||||
|
@ -1011,7 +1049,7 @@ Where size is one of: BPF_B or BPF_H or BPF_W or BPF_DW. Note that 1 and
|
|||
2 byte atomic increments are not supported.
|
||||
|
||||
eBPF has one 16-byte instruction: BPF_LD | BPF_DW | BPF_IMM which consists
|
||||
of two consecutive 'struct bpf_insn' 8-byte blocks and interpreted as single
|
||||
of two consecutive ``struct bpf_insn`` 8-byte blocks and interpreted as single
|
||||
instruction that loads 64-bit immediate value into a dst_reg.
|
||||
Classic BPF has similar instruction: BPF_LD | BPF_W | BPF_IMM which loads
|
||||
32-bit immediate value into a register.
|
||||
|
@ -1037,38 +1075,48 @@ since addition of two valid pointers makes invalid pointer.
|
|||
(In 'secure' mode verifier will reject any type of pointer arithmetic to make
|
||||
sure that kernel addresses don't leak to unprivileged users)
|
||||
|
||||
If register was never written to, it's not readable:
|
||||
If register was never written to, it's not readable::
|
||||
|
||||
bpf_mov R0 = R2
|
||||
bpf_exit
|
||||
|
||||
will be rejected, since R2 is unreadable at the start of the program.
|
||||
|
||||
After kernel function call, R1-R5 are reset to unreadable and
|
||||
R0 has a return type of the function.
|
||||
|
||||
Since R6-R9 are callee saved, their state is preserved across the call.
|
||||
|
||||
::
|
||||
|
||||
bpf_mov R6 = 1
|
||||
bpf_call foo
|
||||
bpf_mov R0 = R6
|
||||
bpf_exit
|
||||
|
||||
is a correct program. If there was R1 instead of R6, it would have
|
||||
been rejected.
|
||||
|
||||
load/store instructions are allowed only with registers of valid types, which
|
||||
are PTR_TO_CTX, PTR_TO_MAP, PTR_TO_STACK. They are bounds and alignment checked.
|
||||
For example:
|
||||
For example::
|
||||
|
||||
bpf_mov R1 = 1
|
||||
bpf_mov R2 = 2
|
||||
bpf_xadd *(u32 *)(R1 + 3) += R2
|
||||
bpf_exit
|
||||
|
||||
will be rejected, since R1 doesn't have a valid pointer type at the time of
|
||||
execution of instruction bpf_xadd.
|
||||
|
||||
At the start R1 type is PTR_TO_CTX (a pointer to generic 'struct bpf_context')
|
||||
At the start R1 type is PTR_TO_CTX (a pointer to generic ``struct bpf_context``)
|
||||
A callback is used to customize verifier to restrict eBPF program access to only
|
||||
certain fields within ctx structure with specified size and alignment.
|
||||
|
||||
For example, the following insn:
|
||||
For example, the following insn::
|
||||
|
||||
bpf_ld R0 = *(u32 *)(R6 + 8)
|
||||
|
||||
intends to load a word from address R6 + 8 and store it into R0
|
||||
If R6=PTR_TO_CTX, via is_valid_access() callback the verifier will know
|
||||
that offset 8 of size 4 bytes can be accessed for reading, otherwise
|
||||
|
@ -1079,10 +1127,13 @@ so it will fail verification, since it's out of bounds.
|
|||
|
||||
The verifier will allow eBPF program to read data from stack only after
|
||||
it wrote into it.
|
||||
|
||||
Classic BPF verifier does similar check with M[0-15] memory slots.
|
||||
For example:
|
||||
For example::
|
||||
|
||||
bpf_ld R0 = *(u32 *)(R10 - 4)
|
||||
bpf_exit
|
||||
|
||||
is invalid program.
|
||||
Though R10 is correct read-only register and has type PTR_TO_STACK
|
||||
and R10 - 4 is within stack bounds, there were no stores into that location.
|
||||
|
@ -1113,24 +1164,33 @@ Register value tracking
|
|||
-----------------------
|
||||
In order to determine the safety of an eBPF program, the verifier must track
|
||||
the range of possible values in each register and also in each stack slot.
|
||||
This is done with 'struct bpf_reg_state', defined in include/linux/
|
||||
This is done with ``struct bpf_reg_state``, defined in include/linux/
|
||||
bpf_verifier.h, which unifies tracking of scalar and pointer values. Each
|
||||
register state has a type, which is either NOT_INIT (the register has not been
|
||||
written to), SCALAR_VALUE (some value which is not usable as a pointer), or a
|
||||
pointer type. The types of pointers describe their base, as follows:
|
||||
PTR_TO_CTX Pointer to bpf_context.
|
||||
CONST_PTR_TO_MAP Pointer to struct bpf_map. "Const" because arithmetic
|
||||
|
||||
|
||||
PTR_TO_CTX
|
||||
Pointer to bpf_context.
|
||||
CONST_PTR_TO_MAP
|
||||
Pointer to struct bpf_map. "Const" because arithmetic
|
||||
on these pointers is forbidden.
|
||||
PTR_TO_MAP_VALUE Pointer to the value stored in a map element.
|
||||
PTR_TO_MAP_VALUE
|
||||
Pointer to the value stored in a map element.
|
||||
PTR_TO_MAP_VALUE_OR_NULL
|
||||
Either a pointer to a map value, or NULL; map accesses
|
||||
(see section 'eBPF maps', below) return this type,
|
||||
which becomes a PTR_TO_MAP_VALUE when checked != NULL.
|
||||
Arithmetic on these pointers is forbidden.
|
||||
PTR_TO_STACK Frame pointer.
|
||||
PTR_TO_PACKET skb->data.
|
||||
PTR_TO_PACKET_END skb->data + headlen; arithmetic forbidden.
|
||||
PTR_TO_SOCKET Pointer to struct bpf_sock_ops, implicitly refcounted.
|
||||
PTR_TO_STACK
|
||||
Frame pointer.
|
||||
PTR_TO_PACKET
|
||||
skb->data.
|
||||
PTR_TO_PACKET_END
|
||||
skb->data + headlen; arithmetic forbidden.
|
||||
PTR_TO_SOCKET
|
||||
Pointer to struct bpf_sock_ops, implicitly refcounted.
|
||||
PTR_TO_SOCKET_OR_NULL
|
||||
Either a pointer to a socket, or NULL; socket lookup
|
||||
returns this type, which becomes a PTR_TO_SOCKET when
|
||||
|
@ -1138,15 +1198,19 @@ pointer type. The types of pointers describe their base, as follows:
|
|||
so programs must release the reference through the
|
||||
socket release function before the end of the program.
|
||||
Arithmetic on these pointers is forbidden.
|
||||
|
||||
However, a pointer may be offset from this base (as a result of pointer
|
||||
arithmetic), and this is tracked in two parts: the 'fixed offset' and 'variable
|
||||
offset'. The former is used when an exactly-known value (e.g. an immediate
|
||||
operand) is added to a pointer, while the latter is used for values which are
|
||||
not exactly known. The variable offset is also used in SCALAR_VALUEs, to track
|
||||
the range of possible values in the register.
|
||||
|
||||
The verifier's knowledge about the variable offset consists of:
|
||||
|
||||
* minimum and maximum values as unsigned
|
||||
* minimum and maximum values as signed
|
||||
|
||||
* knowledge of the values of individual bits, in the form of a 'tnum': a u64
|
||||
'mask' and a u64 'value'. 1s in the mask represent bits whose value is unknown;
|
||||
1s in the value represent bits known to be 1. Bits known to be 0 have 0 in both
|
||||
|
@ -1188,7 +1252,7 @@ The 'id' field is also used on PTR_TO_SOCKET and PTR_TO_SOCKET_OR_NULL, common
|
|||
to all copies of the pointer returned from a socket lookup. This has similar
|
||||
behaviour to the handling for PTR_TO_MAP_VALUE_OR_NULL->PTR_TO_MAP_VALUE, but
|
||||
it also handles reference tracking for the pointer. PTR_TO_SOCKET implicitly
|
||||
represents a reference to the corresponding 'struct sock'. To ensure that the
|
||||
represents a reference to the corresponding ``struct sock``. To ensure that the
|
||||
reference is not leaked, it is imperative to NULL-check the reference and in
|
||||
the non-NULL case, and pass the valid reference to the socket release function.
|
||||
|
||||
|
@ -1196,7 +1260,8 @@ Direct packet access
|
|||
--------------------
|
||||
In cls_bpf and act_bpf programs the verifier allows direct access to the packet
|
||||
data via skb->data and skb->data_end pointers.
|
||||
Ex:
|
||||
Ex::
|
||||
|
||||
1: r4 = *(u32 *)(r1 +80) /* load skb->data_end */
|
||||
2: r3 = *(u32 *)(r1 +76) /* load skb->data */
|
||||
3: r5 = r3
|
||||
|
@ -1206,7 +1271,7 @@ R1=ctx R3=pkt(id=0,off=0,r=14) R4=pkt_end R5=pkt(id=0,off=14,r=14) R10=fp
|
|||
6: r0 = *(u16 *)(r3 +12) /* access 12 and 13 bytes of the packet */
|
||||
|
||||
this 2byte load from the packet is safe to do, since the program author
|
||||
did check 'if (skb->data + 14 > skb->data_end) goto err' at insn #5 which
|
||||
did check ``if (skb->data + 14 > skb->data_end) goto err`` at insn #5 which
|
||||
means that in the fall-through case the register R3 (which points to skb->data)
|
||||
has at least 14 directly accessible bytes. The verifier marks it
|
||||
as R3=pkt(id=0,off=0,r=14).
|
||||
|
@ -1215,10 +1280,12 @@ off=0 means that no additional constants were added.
|
|||
r=14 is the range of safe access which means that bytes [R3, R3 + 14) are ok.
|
||||
Note that R5 is marked as R5=pkt(id=0,off=14,r=14). It also points
|
||||
to the packet data, but constant 14 was added to the register, so
|
||||
it now points to 'skb->data + 14' and accessible range is [R5, R5 + 14 - 14)
|
||||
it now points to ``skb->data + 14`` and accessible range is [R5, R5 + 14 - 14)
|
||||
which is zero bytes.
|
||||
|
||||
More complex packet access may look like:
|
||||
More complex packet access may look like::
|
||||
|
||||
|
||||
R0=inv1 R1=ctx R3=pkt(id=0,off=0,r=14) R4=pkt_end R5=pkt(id=0,off=14,r=14) R10=fp
|
||||
6: r0 = *(u8 *)(r3 +7) /* load 7th byte from the packet */
|
||||
7: r4 = *(u8 *)(r3 +12)
|
||||
|
@ -1235,32 +1302,36 @@ More complex packet access may look like:
|
|||
18: if r2 > r1 goto pc+2
|
||||
R0=inv(id=0,umax_value=255,var_off=(0x0; 0xff)) R1=pkt_end R2=pkt(id=2,off=8,r=8) R3=pkt(id=2,off=0,r=8) R4=inv(id=0,umax_value=3570,var_off=(0x0; 0xfffe)) R5=pkt(id=0,off=14,r=14) R10=fp
|
||||
19: r1 = *(u8 *)(r3 +4)
|
||||
|
||||
The state of the register R3 is R3=pkt(id=2,off=0,r=8)
|
||||
id=2 means that two 'r3 += rX' instructions were seen, so r3 points to some
|
||||
id=2 means that two ``r3 += rX`` instructions were seen, so r3 points to some
|
||||
offset within a packet and since the program author did
|
||||
'if (r3 + 8 > r1) goto err' at insn #18, the safe range is [R3, R3 + 8).
|
||||
``if (r3 + 8 > r1) goto err`` at insn #18, the safe range is [R3, R3 + 8).
|
||||
The verifier only allows 'add'/'sub' operations on packet registers. Any other
|
||||
operation will set the register state to 'SCALAR_VALUE' and it won't be
|
||||
available for direct packet access.
|
||||
Operation 'r3 += rX' may overflow and become less than original skb->data,
|
||||
therefore the verifier has to prevent that. So when it sees 'r3 += rX'
|
||||
|
||||
Operation ``r3 += rX`` may overflow and become less than original skb->data,
|
||||
therefore the verifier has to prevent that. So when it sees ``r3 += rX``
|
||||
instruction and rX is more than 16-bit value, any subsequent bounds-check of r3
|
||||
against skb->data_end will not give us 'range' information, so attempts to read
|
||||
through the pointer will give "invalid access to packet" error.
|
||||
Ex. after insn 'r4 = *(u8 *)(r3 +12)' (insn #7 above) the state of r4 is
|
||||
|
||||
Ex. after insn ``r4 = *(u8 *)(r3 +12)`` (insn #7 above) the state of r4 is
|
||||
R4=inv(id=0,umax_value=255,var_off=(0x0; 0xff)) which means that upper 56 bits
|
||||
of the register are guaranteed to be zero, and nothing is known about the lower
|
||||
8 bits. After insn 'r4 *= 14' the state becomes
|
||||
8 bits. After insn ``r4 *= 14`` the state becomes
|
||||
R4=inv(id=0,umax_value=3570,var_off=(0x0; 0xfffe)), since multiplying an 8-bit
|
||||
value by constant 14 will keep upper 52 bits as zero, also the least significant
|
||||
bit will be zero as 14 is even. Similarly 'r2 >>= 48' will make
|
||||
bit will be zero as 14 is even. Similarly ``r2 >>= 48`` will make
|
||||
R2=inv(id=0,umax_value=65535,var_off=(0x0; 0xffff)), since the shift is not sign
|
||||
extending. This logic is implemented in adjust_reg_min_max_vals() function,
|
||||
which calls adjust_ptr_min_max_vals() for adding pointer to scalar (or vice
|
||||
versa) and adjust_scalar_min_max_vals() for operations on two scalars.
|
||||
|
||||
The end result is that bpf program author can access packet directly
|
||||
using normal C code as:
|
||||
using normal C code as::
|
||||
|
||||
void *data = (void *)(long)skb->data;
|
||||
void *data_end = (void *)(long)skb->data_end;
|
||||
struct eth_hdr *eth = data;
|
||||
|
@ -1275,6 +1346,7 @@ using normal C code as:
|
|||
return 0;
|
||||
if (udp->dest == 53 || udp->source == 9)
|
||||
...;
|
||||
|
||||
which makes such programs easier to write comparing to LD_ABS insn
|
||||
and significantly faster.
|
||||
|
||||
|
@ -1284,23 +1356,24 @@ eBPF maps
|
|||
and userspace.
|
||||
|
||||
The maps are accessed from user space via BPF syscall, which has commands:
|
||||
|
||||
- create a map with given type and attributes
|
||||
map_fd = bpf(BPF_MAP_CREATE, union bpf_attr *attr, u32 size)
|
||||
``map_fd = bpf(BPF_MAP_CREATE, union bpf_attr *attr, u32 size)``
|
||||
using attr->map_type, attr->key_size, attr->value_size, attr->max_entries
|
||||
returns process-local file descriptor or negative error
|
||||
|
||||
- lookup key in a given map
|
||||
err = bpf(BPF_MAP_LOOKUP_ELEM, union bpf_attr *attr, u32 size)
|
||||
``err = bpf(BPF_MAP_LOOKUP_ELEM, union bpf_attr *attr, u32 size)``
|
||||
using attr->map_fd, attr->key, attr->value
|
||||
returns zero and stores found elem into value or negative error
|
||||
|
||||
- create or update key/value pair in a given map
|
||||
err = bpf(BPF_MAP_UPDATE_ELEM, union bpf_attr *attr, u32 size)
|
||||
``err = bpf(BPF_MAP_UPDATE_ELEM, union bpf_attr *attr, u32 size)``
|
||||
using attr->map_fd, attr->key, attr->value
|
||||
returns zero or negative error
|
||||
|
||||
- find and delete element by key in a given map
|
||||
err = bpf(BPF_MAP_DELETE_ELEM, union bpf_attr *attr, u32 size)
|
||||
``err = bpf(BPF_MAP_DELETE_ELEM, union bpf_attr *attr, u32 size)``
|
||||
using attr->map_fd, attr->key
|
||||
|
||||
- to delete map: close(fd)
|
||||
|
@ -1312,10 +1385,11 @@ are concurrently updating.
|
|||
maps can have different types: hash, array, bloom filter, radix-tree, etc.
|
||||
|
||||
The map is defined by:
|
||||
. type
|
||||
. max number of elements
|
||||
. key size in bytes
|
||||
. value size in bytes
|
||||
|
||||
- type
|
||||
- max number of elements
|
||||
- key size in bytes
|
||||
- value size in bytes
|
||||
|
||||
Pruning
|
||||
-------
|
||||
|
@ -1339,57 +1413,75 @@ Understanding eBPF verifier messages
|
|||
The following are few examples of invalid eBPF programs and verifier error
|
||||
messages as seen in the log:
|
||||
|
||||
Program with unreachable instructions:
|
||||
Program with unreachable instructions::
|
||||
|
||||
static struct bpf_insn prog[] = {
|
||||
BPF_EXIT_INSN(),
|
||||
BPF_EXIT_INSN(),
|
||||
};
|
||||
|
||||
Error:
|
||||
|
||||
unreachable insn 1
|
||||
|
||||
Program that reads uninitialized register:
|
||||
Program that reads uninitialized register::
|
||||
|
||||
BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
|
||||
BPF_EXIT_INSN(),
|
||||
Error:
|
||||
|
||||
Error::
|
||||
|
||||
0: (bf) r0 = r2
|
||||
R2 !read_ok
|
||||
|
||||
Program that doesn't initialize R0 before exiting:
|
||||
Program that doesn't initialize R0 before exiting::
|
||||
|
||||
BPF_MOV64_REG(BPF_REG_2, BPF_REG_1),
|
||||
BPF_EXIT_INSN(),
|
||||
Error:
|
||||
|
||||
Error::
|
||||
|
||||
0: (bf) r2 = r1
|
||||
1: (95) exit
|
||||
R0 !read_ok
|
||||
|
||||
Program that accesses stack out of bounds:
|
||||
Program that accesses stack out of bounds::
|
||||
|
||||
BPF_ST_MEM(BPF_DW, BPF_REG_10, 8, 0),
|
||||
BPF_EXIT_INSN(),
|
||||
Error:
|
||||
|
||||
Error::
|
||||
|
||||
0: (7a) *(u64 *)(r10 +8) = 0
|
||||
invalid stack off=8 size=8
|
||||
|
||||
Program that doesn't initialize stack before passing its address into function:
|
||||
Program that doesn't initialize stack before passing its address into function::
|
||||
|
||||
BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
|
||||
BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
|
||||
BPF_LD_MAP_FD(BPF_REG_1, 0),
|
||||
BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
|
||||
BPF_EXIT_INSN(),
|
||||
Error:
|
||||
|
||||
Error::
|
||||
|
||||
0: (bf) r2 = r10
|
||||
1: (07) r2 += -8
|
||||
2: (b7) r1 = 0x0
|
||||
3: (85) call 1
|
||||
invalid indirect read from stack off -8+0 size 8
|
||||
|
||||
Program that uses invalid map_fd=0 while calling to map_lookup_elem() function:
|
||||
Program that uses invalid map_fd=0 while calling to map_lookup_elem() function::
|
||||
|
||||
BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
|
||||
BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
|
||||
BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
|
||||
BPF_LD_MAP_FD(BPF_REG_1, 0),
|
||||
BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
|
||||
BPF_EXIT_INSN(),
|
||||
Error:
|
||||
|
||||
Error::
|
||||
|
||||
0: (7a) *(u64 *)(r10 -8) = 0
|
||||
1: (bf) r2 = r10
|
||||
2: (07) r2 += -8
|
||||
|
@ -1398,7 +1490,8 @@ Error:
|
|||
fd 0 is not pointing to valid bpf_map
|
||||
|
||||
Program that doesn't check return value of map_lookup_elem() before accessing
|
||||
map element:
|
||||
map element::
|
||||
|
||||
BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
|
||||
BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
|
||||
BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
|
||||
|
@ -1406,7 +1499,9 @@ map element:
|
|||
BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
|
||||
BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
|
||||
BPF_EXIT_INSN(),
|
||||
Error:
|
||||
|
||||
Error::
|
||||
|
||||
0: (7a) *(u64 *)(r10 -8) = 0
|
||||
1: (bf) r2 = r10
|
||||
2: (07) r2 += -8
|
||||
|
@ -1416,7 +1511,8 @@ Error:
|
|||
R0 invalid mem access 'map_value_or_null'
|
||||
|
||||
Program that correctly checks map_lookup_elem() returned value for NULL, but
|
||||
accesses the memory with incorrect alignment:
|
||||
accesses the memory with incorrect alignment::
|
||||
|
||||
BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
|
||||
BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
|
||||
BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
|
||||
|
@ -1425,7 +1521,9 @@ accesses the memory with incorrect alignment:
|
|||
BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
|
||||
BPF_ST_MEM(BPF_DW, BPF_REG_0, 4, 0),
|
||||
BPF_EXIT_INSN(),
|
||||
Error:
|
||||
|
||||
Error::
|
||||
|
||||
0: (7a) *(u64 *)(r10 -8) = 0
|
||||
1: (bf) r2 = r10
|
||||
2: (07) r2 += -8
|
||||
|
@ -1438,7 +1536,8 @@ Error:
|
|||
|
||||
Program that correctly checks map_lookup_elem() returned value for NULL and
|
||||
accesses memory with correct alignment in one side of 'if' branch, but fails
|
||||
to do so in the other side of 'if' branch:
|
||||
to do so in the other side of 'if' branch::
|
||||
|
||||
BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
|
||||
BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
|
||||
BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
|
||||
|
@ -1449,7 +1548,9 @@ to do so in the other side of 'if' branch:
|
|||
BPF_EXIT_INSN(),
|
||||
BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 1),
|
||||
BPF_EXIT_INSN(),
|
||||
Error:
|
||||
|
||||
Error::
|
||||
|
||||
0: (7a) *(u64 *)(r10 -8) = 0
|
||||
1: (bf) r2 = r10
|
||||
2: (07) r2 += -8
|
||||
|
@ -1465,8 +1566,8 @@ Error:
|
|||
R0 invalid mem access 'imm'
|
||||
|
||||
Program that performs a socket lookup then sets the pointer to NULL without
|
||||
checking it:
|
||||
value:
|
||||
checking it::
|
||||
|
||||
BPF_MOV64_IMM(BPF_REG_2, 0),
|
||||
BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_2, -8),
|
||||
BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
|
||||
|
@ -1477,7 +1578,9 @@ value:
|
|||
BPF_EMIT_CALL(BPF_FUNC_sk_lookup_tcp),
|
||||
BPF_MOV64_IMM(BPF_REG_0, 0),
|
||||
BPF_EXIT_INSN(),
|
||||
Error:
|
||||
|
||||
Error::
|
||||
|
||||
0: (b7) r2 = 0
|
||||
1: (63) *(u32 *)(r10 -8) = r2
|
||||
2: (bf) r2 = r10
|
||||
|
@ -1491,7 +1594,8 @@ Error:
|
|||
Unreleased reference id=1, alloc_insn=7
|
||||
|
||||
Program that performs a socket lookup but does not NULL-check the returned
|
||||
value:
|
||||
value::
|
||||
|
||||
BPF_MOV64_IMM(BPF_REG_2, 0),
|
||||
BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_2, -8),
|
||||
BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
|
||||
|
@ -1501,7 +1605,9 @@ value:
|
|||
BPF_MOV64_IMM(BPF_REG_5, 0),
|
||||
BPF_EMIT_CALL(BPF_FUNC_sk_lookup_tcp),
|
||||
BPF_EXIT_INSN(),
|
||||
Error:
|
||||
|
||||
Error::
|
||||
|
||||
0: (b7) r2 = 0
|
||||
1: (63) *(u32 *)(r10 -8) = r2
|
||||
2: (bf) r2 = r10
|
||||
|
@ -1519,7 +1625,7 @@ Testing
|
|||
Next to the BPF toolchain, the kernel also ships a test module that contains
|
||||
various test cases for classic and internal BPF that can be executed against
|
||||
the BPF interpreter and JIT compiler. It can be found in lib/test_bpf.c and
|
||||
enabled via Kconfig:
|
||||
enabled via Kconfig::
|
||||
|
||||
CONFIG_TEST_BPF=m
|
||||
|
||||
|
@ -1540,6 +1646,6 @@ The document was written in the hope that it is found useful and in order
|
|||
to give potential BPF hackers or security auditors a better overview of
|
||||
the underlying architecture.
|
||||
|
||||
Jay Schulist <jschlst@samba.org>
|
||||
Daniel Borkmann <daniel@iogearbox.net>
|
||||
Alexei Starovoitov <ast@kernel.org>
|
||||
- Jay Schulist <jschlst@samba.org>
|
||||
- Daniel Borkmann <daniel@iogearbox.net>
|
||||
- Alexei Starovoitov <ast@kernel.org>
|
|
@ -1,6 +1,8 @@
|
|||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
=============================================
|
||||
FORE Systems PCA-200E/SBA-200E ATM NIC driver
|
||||
---------------------------------------------
|
||||
=============================================
|
||||
|
||||
This driver adds support for the FORE Systems 200E-series ATM adapters
|
||||
to the Linux operating system. It is based on the earlier PCA-200E driver
|
|
@ -1,3 +1,9 @@
|
|||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
================
|
||||
Frame Relay (FR)
|
||||
================
|
||||
|
||||
Frame Relay (FR) support for linux is built into a two tiered system of device
|
||||
drivers. The upper layer implements RFC1490 FR specification, and uses the
|
||||
Data Link Connection Identifier (DLCI) as its hardware address. Usually these
|
||||
|
@ -36,4 +42,3 @@ the net-tools distribution. They can be found at ftp.invlogic.com, in
|
|||
/pub/linux. Note that with OS/2 FTPD, you end up in /pub by default, so just
|
||||
use 'cd linux'. v0.10 is for use on pre-2.0.3 and earlier, v0.15 is for
|
||||
pre-2.0.4 and later.
|
||||
|
|
@ -1,27 +1,34 @@
|
|||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
===============================================
|
||||
Generic networking statistics for netlink users
|
||||
======================================================================
|
||||
===============================================
|
||||
|
||||
Statistic counters are grouped into structs:
|
||||
|
||||
==================== ===================== =====================
|
||||
Struct TLV type Description
|
||||
----------------------------------------------------------------------
|
||||
==================== ===================== =====================
|
||||
gnet_stats_basic TCA_STATS_BASIC Basic statistics
|
||||
gnet_stats_rate_est TCA_STATS_RATE_EST Rate estimator
|
||||
gnet_stats_queue TCA_STATS_QUEUE Queue statistics
|
||||
none TCA_STATS_APP Application specific
|
||||
==================== ===================== =====================
|
||||
|
||||
|
||||
Collecting:
|
||||
-----------
|
||||
|
||||
Declare the statistic structs you need:
|
||||
Declare the statistic structs you need::
|
||||
|
||||
struct mystruct {
|
||||
struct gnet_stats_basic bstats;
|
||||
struct gnet_stats_queue qstats;
|
||||
...
|
||||
};
|
||||
|
||||
Update statistics, in dequeue() methods only, (while owning qdisc->running)
|
||||
Update statistics, in dequeue() methods only, (while owning qdisc->running)::
|
||||
|
||||
mystruct->tstats.packet++;
|
||||
mystruct->qstats.backlog += skb->pkt_len;
|
||||
|
||||
|
@ -29,6 +36,8 @@ mystruct->qstats.backlog += skb->pkt_len;
|
|||
Export to userspace (Dump):
|
||||
---------------------------
|
||||
|
||||
::
|
||||
|
||||
my_dumping_routine(struct sk_buff *skb, ...)
|
||||
{
|
||||
struct gnet_dump dump;
|
||||
|
@ -52,7 +61,7 @@ TCA_STATS/TCA_XSTATS backward compatibility:
|
|||
|
||||
Prior users of struct tc_stats and xstats can maintain backward
|
||||
compatibility by calling the compat wrappers to keep providing the
|
||||
existing TLV types.
|
||||
existing TLV types::
|
||||
|
||||
my_dumping_routine(struct sk_buff *skb, ...)
|
||||
{
|
||||
|
@ -77,7 +86,7 @@ are responsible for making sure that the lock is initialized.
|
|||
|
||||
|
||||
Rate Estimator:
|
||||
--------------
|
||||
---------------
|
||||
|
||||
0) Prepare an estimator attribute. Most likely this would be in user
|
||||
space. The value of this TLV should contain a tc_estimator structure.
|
||||
|
@ -92,10 +101,11 @@ Rate Estimator:
|
|||
TCA_RATE to your code in the kernel.
|
||||
|
||||
In the kernel when setting up:
|
||||
|
||||
1) make sure you have basic stats and rate stats setup first.
|
||||
2) make sure you have initialized stats lock that is used to setup such
|
||||
stats.
|
||||
3) Now initialize a new estimator:
|
||||
3) Now initialize a new estimator::
|
||||
|
||||
int ret = gen_new_estimator(my_basicstats,my_rate_est_stats,
|
||||
mystats_lock, attr_with_tcestimator_struct);
|
||||
|
@ -115,5 +125,5 @@ are still valid (i.e still exist) at the time of making this call.
|
|||
|
||||
Authors:
|
||||
--------
|
||||
Thomas Graf <tgraf@suug.ch>
|
||||
Jamal Hadi Salim <hadi@cyberus.ca>
|
||||
- Thomas Graf <tgraf@suug.ch>
|
||||
- Jamal Hadi Salim <hadi@cyberus.ca>
|
|
@ -1,14 +1,22 @@
|
|||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
==================
|
||||
Generic HDLC layer
|
||||
==================
|
||||
|
||||
Krzysztof Halasa <khc@pm.waw.pl>
|
||||
|
||||
|
||||
Generic HDLC layer currently supports:
|
||||
|
||||
1. Frame Relay (ANSI, CCITT, Cisco and no LMI)
|
||||
|
||||
- Normal (routed) and Ethernet-bridged (Ethernet device emulation)
|
||||
interfaces can share a single PVC.
|
||||
- ARP support (no InARP support in the kernel - there is an
|
||||
experimental InARP user-space daemon available on:
|
||||
http://www.kernel.org/pub/linux/utils/net/hdlc/).
|
||||
|
||||
2. raw HDLC - either IP (IPv4) interface or Ethernet device emulation
|
||||
3. Cisco HDLC
|
||||
4. PPP
|
||||
|
@ -24,19 +32,24 @@ with IEEE 802.1Q (VLANs) and 802.1D (Ethernet bridging).
|
|||
Make sure the hdlc.o and the hardware driver are loaded. It should
|
||||
create a number of "hdlc" (hdlc0 etc) network devices, one for each
|
||||
WAN port. You'll need the "sethdlc" utility, get it from:
|
||||
|
||||
http://www.kernel.org/pub/linux/utils/net/hdlc/
|
||||
|
||||
Compile sethdlc.c utility:
|
||||
Compile sethdlc.c utility::
|
||||
|
||||
gcc -O2 -Wall -o sethdlc sethdlc.c
|
||||
|
||||
Make sure you're using a correct version of sethdlc for your kernel.
|
||||
|
||||
Use sethdlc to set physical interface, clock rate, HDLC mode used,
|
||||
and add any required PVCs if using Frame Relay.
|
||||
Usually you want something like:
|
||||
Usually you want something like::
|
||||
|
||||
sethdlc hdlc0 clock int rate 128000
|
||||
sethdlc hdlc0 cisco interval 10 timeout 25
|
||||
or
|
||||
|
||||
or::
|
||||
|
||||
sethdlc hdlc0 rs232 clock ext
|
||||
sethdlc hdlc0 fr lmi ansi
|
||||
sethdlc hdlc0 create 99
|
||||
|
@ -49,28 +62,40 @@ any IP address to it) before using pvc devices.
|
|||
|
||||
Setting interface:
|
||||
|
||||
* v35 | rs232 | x21 | t1 | e1 - sets physical interface for a given port
|
||||
* v35 | rs232 | x21 | t1 | e1
|
||||
- sets physical interface for a given port
|
||||
if the card has software-selectable interfaces
|
||||
loopback - activate hardware loopback (for testing only)
|
||||
* clock ext - both RX clock and TX clock external
|
||||
* clock int - both RX clock and TX clock internal
|
||||
* clock txint - RX clock external, TX clock internal
|
||||
* clock txfromrx - RX clock external, TX clock derived from RX clock
|
||||
* rate - sets clock rate in bps (for "int" or "txint" clock only)
|
||||
loopback
|
||||
- activate hardware loopback (for testing only)
|
||||
* clock ext
|
||||
- both RX clock and TX clock external
|
||||
* clock int
|
||||
- both RX clock and TX clock internal
|
||||
* clock txint
|
||||
- RX clock external, TX clock internal
|
||||
* clock txfromrx
|
||||
- RX clock external, TX clock derived from RX clock
|
||||
* rate
|
||||
- sets clock rate in bps (for "int" or "txint" clock only)
|
||||
|
||||
|
||||
Setting protocol:
|
||||
|
||||
* hdlc - sets raw HDLC (IP-only) mode
|
||||
|
||||
nrz / nrzi / fm-mark / fm-space / manchester - sets transmission code
|
||||
|
||||
no-parity / crc16 / crc16-pr0 (CRC16 with preset zeros) / crc32-itu
|
||||
|
||||
crc16-itu (CRC16 with ITU-T polynomial) / crc16-itu-pr0 - sets parity
|
||||
|
||||
* hdlc-eth - Ethernet device emulation using HDLC. Parity and encoding
|
||||
as above.
|
||||
|
||||
* cisco - sets Cisco HDLC mode (IP, IPv6 and IPX supported)
|
||||
|
||||
interval - time in seconds between keepalive packets
|
||||
|
||||
timeout - time in seconds after last received keepalive packet before
|
||||
we assume the link is down
|
||||
|
||||
|
@ -79,16 +104,21 @@ Setting protocol:
|
|||
* x25 - sets X.25 mode
|
||||
|
||||
* fr - Frame Relay mode
|
||||
|
||||
lmi ansi / ccitt / cisco / none - LMI (link management) type
|
||||
|
||||
dce - Frame Relay DCE (network) side LMI instead of default DTE (user).
|
||||
|
||||
It has nothing to do with clocks!
|
||||
t391 - link integrity verification polling timer (in seconds) - user
|
||||
t392 - polling verification timer (in seconds) - network
|
||||
n391 - full status polling counter - user
|
||||
n392 - error threshold - both user and network
|
||||
n393 - monitored events count - both user and network
|
||||
|
||||
- t391 - link integrity verification polling timer (in seconds) - user
|
||||
- t392 - polling verification timer (in seconds) - network
|
||||
- n391 - full status polling counter - user
|
||||
- n392 - error threshold - both user and network
|
||||
- n393 - monitored events count - both user and network
|
||||
|
||||
Frame-Relay only:
|
||||
|
||||
* create n | delete n - adds / deletes PVC interface with DLCI #n.
|
||||
Newly created interface will be named pvc0, pvc1 etc.
|
||||
|
||||
|
@ -101,26 +131,34 @@ Frame-Relay only:
|
|||
Board-specific issues
|
||||
---------------------
|
||||
|
||||
n2.o and c101.o need parameters to work:
|
||||
n2.o and c101.o need parameters to work::
|
||||
|
||||
insmod n2 hw=io,irq,ram,ports[:io,irq,...]
|
||||
example:
|
||||
|
||||
example::
|
||||
|
||||
insmod n2 hw=0x300,10,0xD0000,01
|
||||
|
||||
or
|
||||
or::
|
||||
|
||||
insmod c101 hw=irq,ram[:irq,...]
|
||||
example:
|
||||
|
||||
example::
|
||||
|
||||
insmod c101 hw=9,0xdc000
|
||||
|
||||
If built into the kernel, these drivers need kernel (command line) parameters:
|
||||
If built into the kernel, these drivers need kernel (command line) parameters::
|
||||
|
||||
n2.hw=io,irq,ram,ports:...
|
||||
or
|
||||
|
||||
or::
|
||||
|
||||
c101.hw=irq,ram:...
|
||||
|
||||
|
||||
|
||||
If you have a problem with N2, C101 or PLX200SYN card, you can issue the
|
||||
"private" command to see port's packet descriptor rings (in kernel logs):
|
||||
"private" command to see port's packet descriptor rings (in kernel logs)::
|
||||
|
||||
sethdlc hdlc0 private
|
||||
|
|
@ -1,3 +1,9 @@
|
|||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
===============
|
||||
Generic Netlink
|
||||
===============
|
||||
|
||||
A wiki document on how to use Generic Netlink can be found here:
|
||||
|
||||
* http://www.linuxfoundation.org/collaborate/workgroups/networking/generic_netlink_howto
|
|
@ -1,12 +1,18 @@
|
|||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
=====================================
|
||||
The Linux kernel GTP tunneling module
|
||||
======================================================================
|
||||
Documentation by Harald Welte <laforge@gnumonks.org> and
|
||||
=====================================
|
||||
|
||||
Documentation by
|
||||
Harald Welte <laforge@gnumonks.org> and
|
||||
Andreas Schultz <aschultz@tpip.net>
|
||||
|
||||
In 'drivers/net/gtp.c' you are finding a kernel-level implementation
|
||||
of a GTP tunnel endpoint.
|
||||
|
||||
== What is GTP ==
|
||||
What is GTP
|
||||
===========
|
||||
|
||||
GTP is the Generic Tunnel Protocol, which is a 3GPP protocol used for
|
||||
tunneling User-IP payload between a mobile station (phone, modem)
|
||||
|
@ -41,7 +47,8 @@ publicly via the 3GPP website at http://www.3gpp.org/DynaReport/29060.htm
|
|||
A direct PDF link to v13.6.0 is provided for convenience below:
|
||||
http://www.etsi.org/deliver/etsi_ts/129000_129099/129060/13.06.00_60/ts_129060v130600p.pdf
|
||||
|
||||
== The Linux GTP tunnelling module ==
|
||||
The Linux GTP tunnelling module
|
||||
===============================
|
||||
|
||||
The module implements the function of a tunnel endpoint, i.e. it is
|
||||
able to decapsulate tunneled IP packets in the uplink originated by
|
||||
|
@ -70,7 +77,8 @@ Userspace :)
|
|||
The official homepage of the module is at
|
||||
https://osmocom.org/projects/linux-kernel-gtp-u/wiki
|
||||
|
||||
== Userspace Programs with Linux Kernel GTP-U support ==
|
||||
Userspace Programs with Linux Kernel GTP-U support
|
||||
==================================================
|
||||
|
||||
At the time of this writing, there are at least two Free Software
|
||||
implementations that implement GTP-C and can use the netlink interface
|
||||
|
@ -82,7 +90,8 @@ to make use of the Linux kernel GTP-U support:
|
|||
* ergw (GGSN + P-GW in Erlang):
|
||||
https://github.com/travelping/ergw
|
||||
|
||||
== Userspace Library / Command Line Utilities ==
|
||||
Userspace Library / Command Line Utilities
|
||||
==========================================
|
||||
|
||||
There is a userspace library called 'libgtpnl' which is based on
|
||||
libmnl and which implements a C-language API towards the netlink
|
||||
|
@ -90,7 +99,8 @@ interface provided by the Kernel GTP module:
|
|||
|
||||
http://git.osmocom.org/libgtpnl/
|
||||
|
||||
== Protocol Versions ==
|
||||
Protocol Versions
|
||||
=================
|
||||
|
||||
There are two different versions of GTP-U: v0 [GSM TS 09.60] and v1
|
||||
[3GPP TS 29.281]. Both are implemented in the Kernel GTP module.
|
||||
|
@ -105,7 +115,8 @@ doesn't implement GTP-C, we don't have to worry about this. It's the
|
|||
responsibility of the control plane implementation in userspace to
|
||||
implement that.
|
||||
|
||||
== IPv6 ==
|
||||
IPv6
|
||||
====
|
||||
|
||||
The 3GPP specifications indicate either IPv4 or IPv6 can be used both
|
||||
on the inner (user) IP layer, or on the outer (transport) layer.
|
||||
|
@ -114,22 +125,25 @@ Unfortunately, the Kernel module currently supports IPv6 neither for
|
|||
the User IP payload, nor for the outer IP layer. Patches or other
|
||||
Contributions to fix this are most welcome!
|
||||
|
||||
== Mailing List ==
|
||||
Mailing List
|
||||
============
|
||||
|
||||
If yo have questions regarding how to use the Kernel GTP module from
|
||||
If you have questions regarding how to use the Kernel GTP module from
|
||||
your own software, or want to contribute to the code, please use the
|
||||
osmocom-net-grps mailing list for related discussion. The list can be
|
||||
reached at osmocom-net-gprs@lists.osmocom.org and the mailman
|
||||
interface for managing your subscription is at
|
||||
https://lists.osmocom.org/mailman/listinfo/osmocom-net-gprs
|
||||
|
||||
== Issue Tracker ==
|
||||
Issue Tracker
|
||||
=============
|
||||
|
||||
The Osmocom project maintains an issue tracker for the Kernel GTP-U
|
||||
module at
|
||||
https://osmocom.org/projects/linux-kernel-gtp-u/issues
|
||||
|
||||
== History / Acknowledgements ==
|
||||
History / Acknowledgements
|
||||
==========================
|
||||
|
||||
The Module was originally created in 2012 by Harald Welte, but never
|
||||
completed. Pablo came in to finish the mess Harald left behind. But
|
||||
|
@ -139,9 +153,11 @@ In 2015, Andreas Schultz came to the rescue and fixed lots more bugs,
|
|||
extended it with new features and finally pushed all of us to get it
|
||||
mainline, where it was merged in 4.7.0.
|
||||
|
||||
== Architectural Details ==
|
||||
Architectural Details
|
||||
=====================
|
||||
|
||||
=== Local GTP-U entity and tunnel identification ===
|
||||
Local GTP-U entity and tunnel identification
|
||||
--------------------------------------------
|
||||
|
||||
GTP-U uses UDP for transporting PDU's. The receiving UDP port is 2152
|
||||
for GTPv1-U and 3386 for GTPv0-U.
|
||||
|
@ -164,15 +180,15 @@ Therefore:
|
|||
destination IP and the tunnel endpoint id. The source IP and port
|
||||
have no meaning and can change at any time.
|
||||
|
||||
[3GPP TS 29.281] Section 4.3.0 defines this so:
|
||||
[3GPP TS 29.281] Section 4.3.0 defines this so::
|
||||
|
||||
> The TEID in the GTP-U header is used to de-multiplex traffic
|
||||
> incoming from remote tunnel endpoints so that it is delivered to the
|
||||
> User plane entities in a way that allows multiplexing of different
|
||||
> users, different packet protocols and different QoS levels.
|
||||
> Therefore no two remote GTP-U endpoints shall send traffic to a
|
||||
> GTP-U protocol entity using the same TEID value except
|
||||
> for data forwarding as part of mobility procedures.
|
||||
The TEID in the GTP-U header is used to de-multiplex traffic
|
||||
incoming from remote tunnel endpoints so that it is delivered to the
|
||||
User plane entities in a way that allows multiplexing of different
|
||||
users, different packet protocols and different QoS levels.
|
||||
Therefore no two remote GTP-U endpoints shall send traffic to a
|
||||
GTP-U protocol entity using the same TEID value except
|
||||
for data forwarding as part of mobility procedures.
|
||||
|
||||
The definition above only defines that two remote GTP-U endpoints
|
||||
*should not* send to the same TEID, it *does not* forbid or exclude
|
||||
|
@ -183,7 +199,8 @@ multiple or unknown peers.
|
|||
Therefore, the receiving side identifies tunnels exclusively based on
|
||||
TEIDs, not based on the source IP!
|
||||
|
||||
== APN vs. Network Device ==
|
||||
APN vs. Network Device
|
||||
======================
|
||||
|
||||
The GTP-U driver creates a Linux network device for each Gi/SGi
|
||||
interface.
|
||||
|
@ -201,29 +218,33 @@ number of Gi/SGi interfaces implemented by a GGSN/P-GW.
|
|||
|
||||
[3GPP TS 29.061] Section 11.3 makes it clear that the selection of a
|
||||
specific Gi/SGi interfaces is made through the Access Point Name
|
||||
(APN):
|
||||
(APN)::
|
||||
|
||||
> 2. each private network manages its own addressing. In general this
|
||||
> will result in different private networks having overlapping
|
||||
> address ranges. A logically separate connection (e.g. an IP in IP
|
||||
> tunnel or layer 2 virtual circuit) is used between the GGSN/P-GW
|
||||
> and each private network.
|
||||
>
|
||||
> In this case the IP address alone is not necessarily unique. The
|
||||
> pair of values, Access Point Name (APN) and IPv4 address and/or
|
||||
> IPv6 prefixes, is unique.
|
||||
2. each private network manages its own addressing. In general this
|
||||
will result in different private networks having overlapping
|
||||
address ranges. A logically separate connection (e.g. an IP in IP
|
||||
tunnel or layer 2 virtual circuit) is used between the GGSN/P-GW
|
||||
and each private network.
|
||||
|
||||
In this case the IP address alone is not necessarily unique. The
|
||||
pair of values, Access Point Name (APN) and IPv4 address and/or
|
||||
IPv6 prefixes, is unique.
|
||||
|
||||
In order to support the overlapping address range use case, each APN
|
||||
is mapped to a separate Gi/SGi interface (network device).
|
||||
|
||||
NOTE: The Access Point Name is purely a control plane (GTP-C) concept.
|
||||
.. note::
|
||||
|
||||
The Access Point Name is purely a control plane (GTP-C) concept.
|
||||
At the GTP-U level, only Tunnel Endpoint Identifiers are present in
|
||||
GTP-U packets and network devices are known
|
||||
|
||||
Therefore for a given UE the mapping in IP to PDN network is:
|
||||
|
||||
* network device + MS IP -> Peer IP + Peer TEID,
|
||||
|
||||
and from PDN to IP network:
|
||||
|
||||
* local GTP-U IP + TEID -> network device
|
||||
|
||||
Furthermore, before a received T-PDU is injected into the network
|
|
@ -1,3 +1,6 @@
|
|||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
============================================================
|
||||
Linux Kernel Driver for Huawei Intelligent NIC(HiNIC) family
|
||||
============================================================
|
||||
|
||||
|
@ -110,7 +113,7 @@ hinic_dev - de/constructs the Logical Tx and Rx Queues.
|
|||
(hinic_main.c, hinic_dev.h)
|
||||
|
||||
|
||||
Miscellaneous:
|
||||
Miscellaneous
|
||||
=============
|
||||
|
||||
Common functions that are used by HW and Logical Device.
|
|
@ -1,4 +1,8 @@
|
|||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
===================================
|
||||
Identifier Locator Addressing (ILA)
|
||||
===================================
|
||||
|
||||
|
||||
Introduction
|
||||
|
@ -26,11 +30,13 @@ The ILA protocol is described in Internet-Draft draft-herbert-intarea-ila.
|
|||
ILA terminology
|
||||
===============
|
||||
|
||||
- Identifier A number that identifies an addressable node in the network
|
||||
- Identifier
|
||||
A number that identifies an addressable node in the network
|
||||
independent of its location. ILA identifiers are sixty-four
|
||||
bit values.
|
||||
|
||||
- Locator A network prefix that routes to a physical host. Locators
|
||||
- Locator
|
||||
A network prefix that routes to a physical host. Locators
|
||||
provide the topological location of an addressed node. ILA
|
||||
locators are sixty-four bit prefixes.
|
||||
|
||||
|
@ -51,17 +57,20 @@ ILA terminology
|
|||
bits) and an identifier (low order sixty-four bits). ILA
|
||||
addresses are never visible to an application.
|
||||
|
||||
- ILA host An end host that is capable of performing ILA translations
|
||||
- ILA host
|
||||
An end host that is capable of performing ILA translations
|
||||
on transmit or receive.
|
||||
|
||||
- ILA router A network node that performs ILA translation and forwarding
|
||||
- ILA router
|
||||
A network node that performs ILA translation and forwarding
|
||||
of translated packets.
|
||||
|
||||
- ILA forwarding cache
|
||||
A type of ILA router that only maintains a working set
|
||||
cache of mappings.
|
||||
|
||||
- ILA node A network node capable of performing ILA translations. This
|
||||
- ILA node
|
||||
A network node capable of performing ILA translations. This
|
||||
can be an ILA router, ILA forwarding cache, or ILA host.
|
||||
|
||||
|
||||
|
@ -82,7 +91,7 @@ Configuration and datapath for these two points of deployment is somewhat
|
|||
different.
|
||||
|
||||
The diagram below illustrates the flow of packets through ILA as well
|
||||
as showing ILA hosts and routers.
|
||||
as showing ILA hosts and routers::
|
||||
|
||||
+--------+ +--------+
|
||||
| Host A +-+ +--->| Host B |
|
||||
|
@ -173,7 +182,7 @@ ILA address, never a SIR address.
|
|||
|
||||
In the simplest format the identifier types, C-bit, and checksum
|
||||
adjustment value are not present so an identifier is considered an
|
||||
unstructured sixty-four bit value.
|
||||
unstructured sixty-four bit value::
|
||||
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Identifier |
|
||||
|
@ -184,7 +193,7 @@ unstructured sixty-four bit value.
|
|||
The checksum neutral adjustment may be configured to always be
|
||||
present using neutral-map-auto. In this case there is no C-bit, but the
|
||||
checksum adjustment is in the low order 16 bits. The identifier is
|
||||
still sixty-four bits.
|
||||
still sixty-four bits::
|
||||
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Identifier |
|
||||
|
@ -193,7 +202,7 @@ still sixty-four bits.
|
|||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
|
||||
The C-bit may used to explicitly indicate that checksum neutral
|
||||
mapping has been applied to an ILA address. The format is:
|
||||
mapping has been applied to an ILA address. The format is::
|
||||
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| |C| Identifier |
|
||||
|
@ -204,7 +213,7 @@ mapping has been applied to an ILA address. The format is:
|
|||
The identifier type field may be present to indicate the identifier
|
||||
type. If it is not present then the type is inferred based on mapping
|
||||
configuration. The checksum neutral adjustment may automatically
|
||||
used with the identifier type as illustrated below.
|
||||
used with the identifier type as illustrated below::
|
||||
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Type| Identifier |
|
||||
|
@ -213,7 +222,7 @@ used with the identifier type as illustrated below.
|
|||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
|
||||
If the identifier type and the C-bit can be present simultaneously so
|
||||
the identifier format would be:
|
||||
the identifier format would be::
|
||||
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Type|C| Identifier |
|
||||
|
@ -258,6 +267,8 @@ same meanings as described above.
|
|||
Some examples
|
||||
=============
|
||||
|
||||
::
|
||||
|
||||
# Configure an ILA route that uses checksum neutral mapping as well
|
||||
# as type field. Note that the type field is set in the SIR address
|
||||
# (the 2000 implies type is 1 which is LUID).
|
|
@ -15,6 +15,7 @@ Contents:
|
|||
device_drivers/index
|
||||
dsa/index
|
||||
devlink/index
|
||||
caif/index
|
||||
ethtool-netlink
|
||||
ieee802154
|
||||
j1939
|
||||
|
@ -36,6 +37,43 @@ Contents:
|
|||
tls-offload
|
||||
nfc
|
||||
6lowpan
|
||||
6pack
|
||||
altera_tse
|
||||
arcnet-hardware
|
||||
arcnet
|
||||
atm
|
||||
ax25
|
||||
baycom
|
||||
bonding
|
||||
cdc_mbim
|
||||
cops
|
||||
cxacru
|
||||
dccp
|
||||
dctcp
|
||||
decnet
|
||||
defza
|
||||
dns_resolver
|
||||
driver
|
||||
eql
|
||||
fib_trie
|
||||
filter
|
||||
fore200e
|
||||
framerelay
|
||||
generic-hdlc
|
||||
generic_netlink
|
||||
gen_stats
|
||||
gtp
|
||||
hinic
|
||||
ila
|
||||
ipddp
|
||||
ip_dynaddr
|
||||
iphase
|
||||
ipsec
|
||||
ip-sysctl
|
||||
ipv6
|
||||
ipvlan
|
||||
ipvs-sysctl
|
||||
kcm
|
||||
|
||||
.. only:: subproject and html
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,10 +1,15 @@
|
|||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
==================================
|
||||
IP dynamic address hack-port v0.03
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
==================================
|
||||
|
||||
This stuff allows diald ONESHOT connections to get established by
|
||||
dynamically changing packet source address (and socket's if local procs).
|
||||
It is implemented for TCP diald-box connections(1) and IP_MASQuerading(2).
|
||||
|
||||
If enabled[*] and forwarding interface has changed:
|
||||
If enabled\ [#]_ and forwarding interface has changed:
|
||||
|
||||
1) Socket (and packet) source address is rewritten ON RETRANSMISSIONS
|
||||
while in SYN_SENT state (diald-box processes).
|
||||
2) Out-bounded MASQueraded source address changes ON OUTPUT (when
|
||||
|
@ -12,18 +17,24 @@ If enabled[*] and forwarding interface has changed:
|
|||
received by the tunnel.
|
||||
|
||||
This is specially helpful for auto dialup links (diald), where the
|
||||
``actual'' outgoing address is unknown at the moment the link is
|
||||
``actual`` outgoing address is unknown at the moment the link is
|
||||
going up. So, the *same* (local AND masqueraded) connections requests that
|
||||
bring the link up will be able to get established.
|
||||
|
||||
[*] At boot, by default no address rewriting is attempted.
|
||||
To enable:
|
||||
.. [#] At boot, by default no address rewriting is attempted.
|
||||
|
||||
To enable::
|
||||
|
||||
# echo 1 > /proc/sys/net/ipv4/ip_dynaddr
|
||||
To enable verbose mode:
|
||||
|
||||
To enable verbose mode::
|
||||
|
||||
# echo 2 > /proc/sys/net/ipv4/ip_dynaddr
|
||||
To disable (default)
|
||||
|
||||
To disable (default)::
|
||||
|
||||
# echo 0 > /proc/sys/net/ipv4/ip_dynaddr
|
||||
|
||||
Enjoy!
|
||||
|
||||
-- Juanjo <jjciarla@raiz.uncu.edu.ar>
|
||||
Juanjo <jjciarla@raiz.uncu.edu.ar>
|
|
@ -1,7 +1,12 @@
|
|||
Text file for ipddp.c:
|
||||
AppleTalk-IP Decapsulation and AppleTalk-IP Encapsulation
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
This text file is written by Jay Schulist <jschlst@samba.org>
|
||||
=========================================================
|
||||
AppleTalk-IP Decapsulation and AppleTalk-IP Encapsulation
|
||||
=========================================================
|
||||
|
||||
Documentation ipddp.c
|
||||
|
||||
This file is written by Jay Schulist <jschlst@samba.org>
|
||||
|
||||
Introduction
|
||||
------------
|
||||
|
@ -21,7 +26,7 @@ kernel AppleTalk layer and drivers are available.
|
|||
Each mode requires its own user space software.
|
||||
|
||||
Compiling AppleTalk-IP Decapsulation/Encapsulation
|
||||
=================================================
|
||||
==================================================
|
||||
|
||||
AppleTalk-IP decapsulation needs to be compiled into your kernel. You
|
||||
will need to turn on AppleTalk-IP driver support. Then you will need to
|
|
@ -1,17 +1,25 @@
|
|||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
==================================
|
||||
ATM (i)Chip IA Linux Driver Source
|
||||
==================================
|
||||
|
||||
READ ME FISRT
|
||||
ATM (i)Chip IA Linux Driver Source
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
Read This Before You Begin!
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
Description
|
||||
-----------
|
||||
===========
|
||||
|
||||
This is the README file for the Interphase PCI ATM (i)Chip IA Linux driver
|
||||
source release.
|
||||
|
||||
The features and limitations of this driver are as follows:
|
||||
|
||||
- A single VPI (VPI value of 0) is supported.
|
||||
- Supports 4K VCs for the server board (with 512K control memory) and 1K
|
||||
VCs for the client board (with 128K control memory).
|
||||
|
@ -29,14 +37,16 @@ The features and limitations of this driver are as follows:
|
|||
|
||||
|
||||
Before You Start
|
||||
----------------
|
||||
================
|
||||
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
1. Installing the adapters in the system
|
||||
|
||||
To install the ATM adapters in the system, follow the steps below.
|
||||
|
||||
a. Login as root.
|
||||
b. Shut down the system and power off the system.
|
||||
c. Install one or more ATM adapters in the system.
|
||||
|
@ -48,25 +58,28 @@ Installation
|
|||
2. [ Removed ]
|
||||
|
||||
3. Rebuild kernel with ABR support
|
||||
|
||||
[ a. and b. removed ]
|
||||
|
||||
c. Reconfigure the kernel, choose the Interphase ia driver through "make
|
||||
menuconfig" or "make xconfig".
|
||||
d. Rebuild the kernel, loadable modules and the atm tools.
|
||||
e. Install the new built kernel and modules and reboot.
|
||||
|
||||
4. Load the adapter hardware driver (ia driver) if it is built as a module
|
||||
|
||||
a. Login as root.
|
||||
b. Change directory to /lib/modules/<kernel-version>/atm.
|
||||
c. Run "insmod suni.o;insmod iphase.o"
|
||||
The yellow 'status' LED on the front panel of the adapter will blink
|
||||
while the driver is loaded in the system.
|
||||
d. To verify that the 'ia' driver is loaded successfully, run the
|
||||
following command:
|
||||
following command::
|
||||
|
||||
cat /proc/atm/devices
|
||||
|
||||
If the driver is loaded successfully, the output of the command will
|
||||
be similar to the following lines:
|
||||
be similar to the following lines::
|
||||
|
||||
Itf Type ESI/"MAC"addr AAL(TX,err,RX,err,drop) ...
|
||||
0 ia xxxxxxxxx 0 ( 0 0 0 0 0 ) 5 ( 0 0 0 0 0 )
|
||||
|
@ -81,23 +94,27 @@ Installation
|
|||
1M. The RAM size decides the number of buffers and buffer size. The default
|
||||
size and number of buffers are set as following:
|
||||
|
||||
========= ======= ====== ====== ====== ====== ======
|
||||
Total Rx RAM Tx RAM Rx Buf Tx Buf Rx buf Tx buf
|
||||
RAM size size size size size cnt cnt
|
||||
-------- ------ ------ ------ ------ ------ ------
|
||||
========= ======= ====== ====== ====== ====== ======
|
||||
128K 64K 64K 10K 10K 6 6
|
||||
512K 256K 256K 10K 10K 25 25
|
||||
1M 512K 512K 10K 10K 51 51
|
||||
========= ======= ====== ====== ====== ====== ======
|
||||
|
||||
These setting should work well in most environments, but can be
|
||||
changed by typing the following command:
|
||||
changed by typing the following command::
|
||||
|
||||
insmod <IA_DIR>/ia.o IA_RX_BUF=<RX_CNT> IA_RX_BUF_SZ=<RX_SIZE> \
|
||||
IA_TX_BUF=<TX_CNT> IA_TX_BUF_SZ=<TX_SIZE>
|
||||
|
||||
Where:
|
||||
RX_CNT = number of receive buffers in the range (1-128)
|
||||
RX_SIZE = size of receive buffers in the range (48-64K)
|
||||
TX_CNT = number of transmit buffers in the range (1-128)
|
||||
TX_SIZE = size of transmit buffers in the range (48-64K)
|
||||
|
||||
- RX_CNT = number of receive buffers in the range (1-128)
|
||||
- RX_SIZE = size of receive buffers in the range (48-64K)
|
||||
- TX_CNT = number of transmit buffers in the range (1-128)
|
||||
- TX_SIZE = size of transmit buffers in the range (48-64K)
|
||||
|
||||
1. Transmit and receive buffer size must be a multiple of 4.
|
||||
2. Care should be taken so that the memory required for the
|
||||
|
@ -121,33 +138,51 @@ Installation
|
|||
configured for the PVC(s).
|
||||
|
||||
a. For UBR test:
|
||||
At the test machine intended to receive data, type:
|
||||
|
||||
At the test machine intended to receive data, type::
|
||||
|
||||
ttcp_atm -r -a -s 0.100
|
||||
At the other test machine, type:
|
||||
|
||||
At the other test machine, type::
|
||||
|
||||
ttcp_atm -t -a -s 0.100 -n 10000
|
||||
|
||||
Run "ttcp_atm -h" to display more options of the ttcp_atm tool.
|
||||
b. For ABR test:
|
||||
It is the same as the UBR testing, but with an extra command option:
|
||||
|
||||
It is the same as the UBR testing, but with an extra command option::
|
||||
|
||||
-Pabr:max_pcr=<xxx>
|
||||
|
||||
where:
|
||||
|
||||
xxx = the maximum peak cell rate, from 170 - 353207.
|
||||
|
||||
This option must be set on both the machines.
|
||||
|
||||
c. For CBR test:
|
||||
It is the same as the UBR testing, but with an extra command option:
|
||||
|
||||
It is the same as the UBR testing, but with an extra command option::
|
||||
|
||||
-Pcbr:max_pcr=<xxx>
|
||||
|
||||
where:
|
||||
|
||||
xxx = the maximum peak cell rate, from 170 - 353207.
|
||||
|
||||
This option may only be set on the transmit machine.
|
||||
|
||||
|
||||
OUTSTANDING ISSUES
|
||||
------------------
|
||||
Outstanding Issues
|
||||
==================
|
||||
|
||||
|
||||
|
||||
Contact Information
|
||||
-------------------
|
||||
|
||||
::
|
||||
|
||||
Customer Support:
|
||||
United States: Telephone: (214) 654-5555
|
||||
Fax: (214) 654-5500
|
|
@ -1,11 +1,19 @@
|
|||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
=====
|
||||
IPsec
|
||||
=====
|
||||
|
||||
|
||||
Here documents known IPsec corner cases which need to be keep in mind when
|
||||
deploy various IPsec configuration in real world production environment.
|
||||
|
||||
1. IPcomp: Small IP packet won't get compressed at sender, and failed on
|
||||
1. IPcomp:
|
||||
Small IP packet won't get compressed at sender, and failed on
|
||||
policy check on receiver.
|
||||
|
||||
Quote from RFC3173:
|
||||
Quote from RFC3173::
|
||||
|
||||
2.2. Non-Expansion Policy
|
||||
|
||||
If the total size of a compressed payload and the IPComp header, as
|
|
@ -1,9 +1,15 @@
|
|||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
====
|
||||
IPv6
|
||||
====
|
||||
|
||||
|
||||
Options for the ipv6 module are supplied as parameters at load time.
|
||||
|
||||
Module options may be given as command line arguments to the insmod
|
||||
or modprobe command, but are usually specified in either
|
||||
/etc/modules.d/*.conf configuration files, or in a distro-specific
|
||||
``/etc/modules.d/*.conf`` configuration files, or in a distro-specific
|
||||
configuration file.
|
||||
|
||||
The available ipv6 module parameters are listed below. If a parameter
|
|
@ -1,10 +1,14 @@
|
|||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
===================
|
||||
IPVLAN Driver HOWTO
|
||||
===================
|
||||
|
||||
Initial Release:
|
||||
Mahesh Bandewar <maheshb AT google.com>
|
||||
|
||||
1. Introduction:
|
||||
================
|
||||
This is conceptually very similar to the macvlan driver with one major
|
||||
exception of using L3 for mux-ing /demux-ing among slaves. This property makes
|
||||
the master device share the L2 with it's slave devices. I have developed this
|
||||
|
@ -13,14 +17,19 @@ outside of it.
|
|||
|
||||
|
||||
2. Building and Installation:
|
||||
=============================
|
||||
|
||||
In order to build the driver, please select the config item CONFIG_IPVLAN.
|
||||
The driver can be built into the kernel (CONFIG_IPVLAN=y) or as a module
|
||||
(CONFIG_IPVLAN=m).
|
||||
|
||||
|
||||
3. Configuration:
|
||||
=================
|
||||
|
||||
There are no module parameters for this driver and it can be configured
|
||||
using IProute2/ip utility.
|
||||
::
|
||||
|
||||
ip link add link <master> name <slave> type ipvlan [ mode MODE ] [ FLAGS ]
|
||||
where
|
||||
|
@ -28,18 +37,27 @@ using IProute2/ip utility.
|
|||
FLAGS: bridge (default) | private | vepa
|
||||
|
||||
e.g.
|
||||
|
||||
(a) Following will create IPvlan link with eth0 as master in
|
||||
L3 bridge mode
|
||||
L3 bridge mode::
|
||||
|
||||
bash# ip link add link eth0 name ipvl0 type ipvlan
|
||||
(b) This command will create IPvlan link in L2 bridge mode.
|
||||
(b) This command will create IPvlan link in L2 bridge mode::
|
||||
|
||||
bash# ip link add link eth0 name ipvl0 type ipvlan mode l2 bridge
|
||||
(c) This command will create an IPvlan device in L2 private mode.
|
||||
|
||||
(c) This command will create an IPvlan device in L2 private mode::
|
||||
|
||||
bash# ip link add link eth0 name ipvlan type ipvlan mode l2 private
|
||||
(d) This command will create an IPvlan device in L2 vepa mode.
|
||||
|
||||
(d) This command will create an IPvlan device in L2 vepa mode::
|
||||
|
||||
bash# ip link add link eth0 name ipvlan type ipvlan mode l2 vepa
|
||||
|
||||
|
||||
4. Operating modes:
|
||||
===================
|
||||
|
||||
IPvlan has two modes of operation - L2 and L3. For a given master device,
|
||||
you can select one of these two modes and all slaves on that master will
|
||||
operate in the same (selected) mode. The RX mode is almost identical except
|
||||
|
@ -48,12 +66,16 @@ L3 mode is more restrictive since routing is controlled from the other (mostly)
|
|||
default namespace.
|
||||
|
||||
4.1 L2 mode:
|
||||
------------
|
||||
|
||||
In this mode TX processing happens on the stack instance attached to the
|
||||
slave device and packets are switched and queued to the master device to send
|
||||
out. In this mode the slaves will RX/TX multicast and broadcast (if applicable)
|
||||
as well.
|
||||
|
||||
4.2 L3 mode:
|
||||
------------
|
||||
|
||||
In this mode TX processing up to L3 happens on the stack instance attached
|
||||
to the slave device and packets are switched to the stack instance of the
|
||||
master device for the L2 processing and routing from that instance will be
|
||||
|
@ -61,25 +83,32 @@ used before packets are queued on the outbound device. In this mode the slaves
|
|||
will not receive nor can send multicast / broadcast traffic.
|
||||
|
||||
4.3 L3S mode:
|
||||
-------------
|
||||
|
||||
This is very similar to the L3 mode except that iptables (conn-tracking)
|
||||
works in this mode and hence it is L3-symmetric (L3s). This will have slightly less
|
||||
performance but that shouldn't matter since you are choosing this mode over plain-L3
|
||||
mode to make conn-tracking work.
|
||||
|
||||
5. Mode flags:
|
||||
==============
|
||||
|
||||
At this time following mode flags are available
|
||||
|
||||
5.1 bridge:
|
||||
-----------
|
||||
This is the default option. To configure the IPvlan port in this mode,
|
||||
user can choose to either add this option on the command-line or don't specify
|
||||
anything. This is the traditional mode where slaves can cross-talk among
|
||||
themselves apart from talking through the master device.
|
||||
|
||||
5.2 private:
|
||||
------------
|
||||
If this option is added to the command-line, the port is set in private
|
||||
mode. i.e. port won't allow cross communication between slaves.
|
||||
|
||||
5.3 vepa:
|
||||
---------
|
||||
If this is added to the command-line, the port is set in VEPA mode.
|
||||
i.e. port will offload switching functionality to the external entity as
|
||||
described in 802.1Qbg
|
||||
|
@ -89,9 +118,13 @@ neighbor will have source and destination mac same. This will make the switch /
|
|||
router send the redirect message.
|
||||
|
||||
6. What to choose (macvlan vs. ipvlan)?
|
||||
=======================================
|
||||
|
||||
These two devices are very similar in many regards and the specific use
|
||||
case could very well define which device to choose. if one of the following
|
||||
situations defines your use case then you can choose to use ipvlan -
|
||||
situations defines your use case then you can choose to use ipvlan:
|
||||
|
||||
|
||||
(a) The Linux host that is connected to the external switch / router has
|
||||
policy configured that allows only one mac per port.
|
||||
(b) No of virtual devices created on a master exceed the mac capacity and
|
||||
|
@ -101,6 +134,9 @@ namespace where L2 on the slave could be changed / misused.
|
|||
|
||||
|
||||
6. Example configuration:
|
||||
=========================
|
||||
|
||||
::
|
||||
|
||||
+=============================================================+
|
||||
| Host: host1 |
|
||||
|
@ -117,27 +153,34 @@ namespace where L2 on the slave could be changed / misused.
|
|||
+==============================#==============================+
|
||||
|
||||
|
||||
(a) Create two network namespaces - ns0, ns1
|
||||
(a) Create two network namespaces - ns0, ns1::
|
||||
|
||||
ip netns add ns0
|
||||
ip netns add ns1
|
||||
|
||||
(b) Create two ipvlan slaves on eth0 (master device)
|
||||
(b) Create two ipvlan slaves on eth0 (master device)::
|
||||
|
||||
ip link add link eth0 ipvl0 type ipvlan mode l2
|
||||
ip link add link eth0 ipvl1 type ipvlan mode l2
|
||||
|
||||
(c) Assign slaves to the respective network namespaces
|
||||
(c) Assign slaves to the respective network namespaces::
|
||||
|
||||
ip link set dev ipvl0 netns ns0
|
||||
ip link set dev ipvl1 netns ns1
|
||||
|
||||
(d) Now switch to the namespace (ns0 or ns1) to configure the slave devices
|
||||
- For ns0
|
||||
|
||||
- For ns0::
|
||||
|
||||
(1) ip netns exec ns0 bash
|
||||
(2) ip link set dev ipvl0 up
|
||||
(3) ip link set dev lo up
|
||||
(4) ip -4 addr add 127.0.0.1 dev lo
|
||||
(5) ip -4 addr add $IPADDR dev ipvl0
|
||||
(6) ip -4 route add default via $ROUTER dev ipvl0
|
||||
- For ns1
|
||||
|
||||
- For ns1::
|
||||
|
||||
(1) ip netns exec ns1 bash
|
||||
(2) ip link set dev ipvl1 up
|
||||
(3) ip link set dev lo up
|
|
@ -1,4 +1,11 @@
|
|||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
===========
|
||||
IPvs-sysctl
|
||||
===========
|
||||
|
||||
/proc/sys/net/ipv4/vs/* Variables:
|
||||
==================================
|
||||
|
||||
am_droprate - INTEGER
|
||||
default 10
|
||||
|
@ -16,8 +23,8 @@ amemthresh - INTEGER
|
|||
the strategy is disabled and the variable is set to 1.
|
||||
|
||||
backup_only - BOOLEAN
|
||||
0 - disabled (default)
|
||||
not 0 - enabled
|
||||
- 0 - disabled (default)
|
||||
- not 0 - enabled
|
||||
|
||||
If set, disable the director function while the server is
|
||||
in backup mode to avoid packet loops for DR/TUN methods.
|
||||
|
@ -44,8 +51,8 @@ conn_reuse_mode - INTEGER
|
|||
real servers to a very busy cluster.
|
||||
|
||||
conntrack - BOOLEAN
|
||||
0 - disabled (default)
|
||||
not 0 - enabled
|
||||
- 0 - disabled (default)
|
||||
- not 0 - enabled
|
||||
|
||||
If set, maintain connection tracking entries for
|
||||
connections handled by IPVS.
|
||||
|
@ -61,8 +68,8 @@ conntrack - BOOLEAN
|
|||
Only available when IPVS is compiled with CONFIG_IP_VS_NFCT enabled.
|
||||
|
||||
cache_bypass - BOOLEAN
|
||||
0 - disabled (default)
|
||||
not 0 - enabled
|
||||
- 0 - disabled (default)
|
||||
- not 0 - enabled
|
||||
|
||||
If it is enabled, forward packets to the original destination
|
||||
directly when no cache server is available and destination
|
||||
|
@ -70,19 +77,19 @@ cache_bypass - BOOLEAN
|
|||
used in transparent web cache cluster.
|
||||
|
||||
debug_level - INTEGER
|
||||
0 - transmission error messages (default)
|
||||
1 - non-fatal error messages
|
||||
2 - configuration
|
||||
3 - destination trash
|
||||
4 - drop entry
|
||||
5 - service lookup
|
||||
6 - scheduling
|
||||
7 - connection new/expire, lookup and synchronization
|
||||
8 - state transition
|
||||
9 - binding destination, template checks and applications
|
||||
10 - IPVS packet transmission
|
||||
11 - IPVS packet handling (ip_vs_in/ip_vs_out)
|
||||
12 or more - packet traversal
|
||||
- 0 - transmission error messages (default)
|
||||
- 1 - non-fatal error messages
|
||||
- 2 - configuration
|
||||
- 3 - destination trash
|
||||
- 4 - drop entry
|
||||
- 5 - service lookup
|
||||
- 6 - scheduling
|
||||
- 7 - connection new/expire, lookup and synchronization
|
||||
- 8 - state transition
|
||||
- 9 - binding destination, template checks and applications
|
||||
- 10 - IPVS packet transmission
|
||||
- 11 - IPVS packet handling (ip_vs_in/ip_vs_out)
|
||||
- 12 or more - packet traversal
|
||||
|
||||
Only available when IPVS is compiled with CONFIG_IP_VS_DEBUG enabled.
|
||||
|
||||
|
@ -92,7 +99,7 @@ debug_level - INTEGER
|
|||
the level.
|
||||
|
||||
drop_entry - INTEGER
|
||||
0 - disabled (default)
|
||||
- 0 - disabled (default)
|
||||
|
||||
The drop_entry defense is to randomly drop entries in the
|
||||
connection hash table, just in order to collect back some
|
||||
|
@ -110,7 +117,7 @@ drop_entry - INTEGER
|
|||
1), and 3 means that that the strategy is always enabled.
|
||||
|
||||
drop_packet - INTEGER
|
||||
0 - disabled (default)
|
||||
- 0 - disabled (default)
|
||||
|
||||
The drop_packet defense is designed to drop 1/rate packets
|
||||
before forwarding them to real servers. If the rate is 1, then
|
||||
|
@ -124,8 +131,8 @@ drop_packet - INTEGER
|
|||
is controlled by the /proc/sys/net/ipv4/vs/am_droprate.
|
||||
|
||||
expire_nodest_conn - BOOLEAN
|
||||
0 - disabled (default)
|
||||
not 0 - enabled
|
||||
- 0 - disabled (default)
|
||||
- not 0 - enabled
|
||||
|
||||
The default value is 0, the load balancer will silently drop
|
||||
packets when its destination server is not available. It may
|
||||
|
@ -142,8 +149,8 @@ expire_nodest_conn - BOOLEAN
|
|||
connections when its destination is not available.
|
||||
|
||||
expire_quiescent_template - BOOLEAN
|
||||
0 - disabled (default)
|
||||
not 0 - enabled
|
||||
- 0 - disabled (default)
|
||||
- not 0 - enabled
|
||||
|
||||
When set to a non-zero value, the load balancer will expire
|
||||
persistent templates when the destination server is quiescent.
|
||||
|
@ -158,8 +165,8 @@ expire_quiescent_template - BOOLEAN
|
|||
connection and the destination server is quiescent.
|
||||
|
||||
ignore_tunneled - BOOLEAN
|
||||
0 - disabled (default)
|
||||
not 0 - enabled
|
||||
- 0 - disabled (default)
|
||||
- not 0 - enabled
|
||||
|
||||
If set, ipvs will set the ipvs_property on all packets which are of
|
||||
unrecognized protocols. This prevents us from routing tunneled
|
||||
|
@ -168,23 +175,23 @@ ignore_tunneled - BOOLEAN
|
|||
ipvs routing loops when ipvs is also acting as a real server).
|
||||
|
||||
nat_icmp_send - BOOLEAN
|
||||
0 - disabled (default)
|
||||
not 0 - enabled
|
||||
- 0 - disabled (default)
|
||||
- not 0 - enabled
|
||||
|
||||
It controls sending icmp error messages (ICMP_DEST_UNREACH)
|
||||
for VS/NAT when the load balancer receives packets from real
|
||||
servers but the connection entries don't exist.
|
||||
|
||||
pmtu_disc - BOOLEAN
|
||||
0 - disabled
|
||||
not 0 - enabled (default)
|
||||
- 0 - disabled
|
||||
- not 0 - enabled (default)
|
||||
|
||||
By default, reject with FRAG_NEEDED all DF packets that exceed
|
||||
the PMTU, irrespective of the forwarding method. For TUN method
|
||||
the flag can be disabled to fragment such packets.
|
||||
|
||||
secure_tcp - INTEGER
|
||||
0 - disabled (default)
|
||||
- 0 - disabled (default)
|
||||
|
||||
The secure_tcp defense is to use a more complicated TCP state
|
||||
transition table. For VS/NAT, it also delays entering the
|
||||
|
@ -248,8 +255,8 @@ sync_ports - INTEGER
|
|||
8848+sync_ports-1.
|
||||
|
||||
snat_reroute - BOOLEAN
|
||||
0 - disabled
|
||||
not 0 - enabled (default)
|
||||
- 0 - disabled
|
||||
- not 0 - enabled (default)
|
||||
|
||||
If enabled, recalculate the route of SNATed packets from
|
||||
realservers so that they are routed as if they originate from the
|
||||
|
@ -270,6 +277,7 @@ sync_persist_mode - INTEGER
|
|||
Controls the synchronisation of connections when using persistence
|
||||
|
||||
0: All types of connections are synchronised
|
||||
|
||||
1: Attempt to reduce the synchronisation traffic depending on
|
||||
the connection type. For persistent services avoid synchronisation
|
||||
for normal connections, do it only for persistence templates.
|
|
@ -1,12 +1,15 @@
|
|||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
=============================
|
||||
Kernel Connection Multiplexor
|
||||
-----------------------------
|
||||
=============================
|
||||
|
||||
Kernel Connection Multiplexor (KCM) is a mechanism that provides a message based
|
||||
interface over TCP for generic application protocols. With KCM an application
|
||||
can efficiently send and receive application protocol messages over TCP using
|
||||
datagram sockets.
|
||||
|
||||
KCM implements an NxM multiplexor in the kernel as diagrammed below:
|
||||
KCM implements an NxM multiplexor in the kernel as diagrammed below::
|
||||
|
||||
+------------+ +------------+ +------------+ +------------+
|
||||
| KCM socket | | KCM socket | | KCM socket | | KCM socket |
|
||||
|
@ -29,7 +32,7 @@ KCM implements an NxM multiplexor in the kernel as diagrammed below:
|
|||
+----------+ +----------+ +----------+ +----------+ +----------+
|
||||
|
||||
KCM sockets
|
||||
-----------
|
||||
===========
|
||||
|
||||
The KCM sockets provide the user interface to the multiplexor. All the KCM sockets
|
||||
bound to a multiplexor are considered to have equivalent function, and I/O
|
||||
|
@ -37,7 +40,7 @@ operations in different sockets may be done in parallel without the need for
|
|||
synchronization between threads in userspace.
|
||||
|
||||
Multiplexor
|
||||
-----------
|
||||
===========
|
||||
|
||||
The multiplexor provides the message steering. In the transmit path, messages
|
||||
written on a KCM socket are sent atomically on an appropriate TCP socket.
|
||||
|
@ -45,14 +48,14 @@ Similarly, in the receive path, messages are constructed on each TCP socket
|
|||
(Psock) and complete messages are steered to a KCM socket.
|
||||
|
||||
TCP sockets & Psocks
|
||||
--------------------
|
||||
====================
|
||||
|
||||
TCP sockets may be bound to a KCM multiplexor. A Psock structure is allocated
|
||||
for each bound TCP socket, this structure holds the state for constructing
|
||||
messages on receive as well as other connection specific information for KCM.
|
||||
|
||||
Connected mode semantics
|
||||
------------------------
|
||||
========================
|
||||
|
||||
Each multiplexor assumes that all attached TCP connections are to the same
|
||||
destination and can use the different connections for load balancing when
|
||||
|
@ -60,7 +63,7 @@ transmitting. The normal send and recv calls (include sendmmsg and recvmmsg)
|
|||
can be used to send and receive messages from the KCM socket.
|
||||
|
||||
Socket types
|
||||
------------
|
||||
============
|
||||
|
||||
KCM supports SOCK_DGRAM and SOCK_SEQPACKET socket types.
|
||||
|
||||
|
@ -110,7 +113,7 @@ User interface
|
|||
Creating a multiplexor
|
||||
----------------------
|
||||
|
||||
A new multiplexor and initial KCM socket is created by a socket call:
|
||||
A new multiplexor and initial KCM socket is created by a socket call::
|
||||
|
||||
socket(AF_KCM, type, protocol)
|
||||
|
||||
|
@ -122,7 +125,7 @@ Cloning KCM sockets
|
|||
|
||||
After the first KCM socket is created using the socket call as described
|
||||
above, additional sockets for the multiplexor can be created by cloning
|
||||
a KCM socket. This is accomplished by an ioctl on a KCM socket:
|
||||
a KCM socket. This is accomplished by an ioctl on a KCM socket::
|
||||
|
||||
/* From linux/kcm.h */
|
||||
struct kcm_clone {
|
||||
|
@ -142,7 +145,7 @@ Attach transport sockets
|
|||
------------------------
|
||||
|
||||
Attaching of transport sockets to a multiplexor is performed by calling an
|
||||
ioctl on a KCM socket for the multiplexor. e.g.:
|
||||
ioctl on a KCM socket for the multiplexor. e.g.::
|
||||
|
||||
/* From linux/kcm.h */
|
||||
struct kcm_attach {
|
||||
|
@ -160,14 +163,15 @@ ioctl on a KCM socket for the multiplexor. e.g.:
|
|||
ioctl(kcmfd, SIOCKCMATTACH, &info);
|
||||
|
||||
The kcm_attach structure contains:
|
||||
fd: file descriptor for TCP socket being attached
|
||||
bpf_prog_fd: file descriptor for compiled BPF program downloaded
|
||||
|
||||
- fd: file descriptor for TCP socket being attached
|
||||
- bpf_prog_fd: file descriptor for compiled BPF program downloaded
|
||||
|
||||
Unattach transport sockets
|
||||
--------------------------
|
||||
|
||||
Unattaching a transport socket from a multiplexor is straightforward. An
|
||||
"unattach" ioctl is done with the kcm_unattach structure as the argument:
|
||||
"unattach" ioctl is done with the kcm_unattach structure as the argument::
|
||||
|
||||
/* From linux/kcm.h */
|
||||
struct kcm_unattach {
|
||||
|
@ -190,7 +194,7 @@ When receive is disabled, any pending messages in the socket's
|
|||
receive buffer are moved to other sockets. This feature is useful
|
||||
if an application thread knows that it will be doing a lot of
|
||||
work on a request and won't be able to service new messages for a
|
||||
while. Example use:
|
||||
while. Example use::
|
||||
|
||||
int val = 1;
|
||||
|
||||
|
@ -200,7 +204,7 @@ BFP programs for message delineation
|
|||
------------------------------------
|
||||
|
||||
BPF programs can be compiled using the BPF LLVM backend. For example,
|
||||
the BPF program for parsing Thrift is:
|
||||
the BPF program for parsing Thrift is::
|
||||
|
||||
#include "bpf.h" /* for __sk_buff */
|
||||
#include "bpf_helpers.h" /* for load_word intrinsic */
|
||||
|
@ -250,6 +254,7 @@ based on groups, or batches of messages, can be beneficial for performance.
|
|||
|
||||
On transmit, there are three ways an application can batch (pipeline)
|
||||
messages on a KCM socket.
|
||||
|
||||
1) Send multiple messages in a single sendmmsg.
|
||||
2) Send a group of messages each with a sendmsg call, where all messages
|
||||
except the last have MSG_BATCH in the flags of sendmsg call.
|
|
@ -99,7 +99,7 @@ treat the LocalTalk device like an ordinary Ethernet device, even if
|
|||
that's what it looks like to Netatalk.
|
||||
|
||||
Instead, you follow the same procedure as for doing IP in EtherTalk.
|
||||
See Documentation/networking/ipddp.txt for more information about the
|
||||
See Documentation/networking/ipddp.rst for more information about the
|
||||
kernel driver and userspace tools needed.
|
||||
|
||||
--------------------------------------
|
||||
|
|
|
@ -1051,7 +1051,7 @@ for more information on hardware timestamps.
|
|||
-------------------------------------------------------------------------------
|
||||
|
||||
- Packet sockets work well together with Linux socket filters, thus you also
|
||||
might want to have a look at Documentation/networking/filter.txt
|
||||
might want to have a look at Documentation/networking/filter.rst
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
+ THANKS
|
||||
|
|
|
@ -792,7 +792,7 @@ counters to indicate the ACK is skipped in which scenario. The ACK
|
|||
would only be skipped if the received packet is either a SYN packet or
|
||||
it has no data.
|
||||
|
||||
.. _sysctl document: https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt
|
||||
.. _sysctl document: https://www.kernel.org/doc/Documentation/networking/ip-sysctl.rst
|
||||
|
||||
* TcpExtTCPACKSkippedSynRecv
|
||||
|
||||
|
|
|
@ -3192,7 +3192,7 @@ Q: https://patchwork.ozlabs.org/project/netdev/list/?delegate=77147
|
|||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf.git
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git
|
||||
F: Documentation/bpf/
|
||||
F: Documentation/networking/filter.txt
|
||||
F: Documentation/networking/filter.rst
|
||||
F: arch/*/net/*
|
||||
F: include/linux/bpf*
|
||||
F: include/linux/filter.h
|
||||
|
@ -4728,7 +4728,7 @@ DECnet NETWORK LAYER
|
|||
L: linux-decnet-user@lists.sourceforge.net
|
||||
S: Orphan
|
||||
W: http://linux-decnet.sourceforge.net
|
||||
F: Documentation/networking/decnet.txt
|
||||
F: Documentation/networking/decnet.rst
|
||||
F: net/decnet/
|
||||
|
||||
DECSTATION PLATFORM SUPPORT
|
||||
|
@ -7815,7 +7815,7 @@ HUAWEI ETHERNET DRIVER
|
|||
M: Aviad Krawczyk <aviad.krawczyk@huawei.com>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Supported
|
||||
F: Documentation/networking/hinic.txt
|
||||
F: Documentation/networking/hinic.rst
|
||||
F: drivers/net/ethernet/huawei/hinic/
|
||||
|
||||
HUGETLB FILESYSTEM
|
||||
|
@ -8934,7 +8934,7 @@ L: lvs-devel@vger.kernel.org
|
|||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/horms/ipvs-next.git
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/horms/ipvs.git
|
||||
F: Documentation/networking/ipvs-sysctl.txt
|
||||
F: Documentation/networking/ipvs-sysctl.rst
|
||||
F: include/net/ip_vs.h
|
||||
F: include/uapi/linux/ip_vs.h
|
||||
F: net/netfilter/ipvs/
|
||||
|
|
|
@ -306,7 +306,7 @@ config ATM_IA
|
|||
for more info about the cards. Say Y (or M to compile as a module
|
||||
named iphase) here if you have one of these cards.
|
||||
|
||||
See the file <file:Documentation/networking/iphase.txt> for further
|
||||
See the file <file:Documentation/networking/iphase.rst> for further
|
||||
details.
|
||||
|
||||
config ATM_IA_DEBUG
|
||||
|
@ -336,7 +336,7 @@ config ATM_FORE200E
|
|||
on PCI and SBUS hosts. Say Y (or M to compile as a module
|
||||
named fore_200e) here if you have one of these ATM adapters.
|
||||
|
||||
See the file <file:Documentation/networking/fore200e.txt> for
|
||||
See the file <file:Documentation/networking/fore200e.rst> for
|
||||
further details.
|
||||
|
||||
config ATM_FORE200E_USE_TASKLET
|
||||
|
|
|
@ -50,7 +50,7 @@ config BONDING
|
|||
The driver supports multiple bonding modes to allow for both high
|
||||
performance and high availability operation.
|
||||
|
||||
Refer to <file:Documentation/networking/bonding.txt> for more
|
||||
Refer to <file:Documentation/networking/bonding.rst> for more
|
||||
information.
|
||||
|
||||
To compile this driver as a module, choose M here: the module
|
||||
|
@ -126,7 +126,7 @@ config EQUALIZER
|
|||
Linux driver or with a Livingston Portmaster 2e.
|
||||
|
||||
Say Y if you want this and read
|
||||
<file:Documentation/networking/eql.txt>. You may also want to read
|
||||
<file:Documentation/networking/eql.rst>. You may also want to read
|
||||
section 6.2 of the NET-3-HOWTO, available from
|
||||
<http://www.tldp.org/docs.html#howto>.
|
||||
|
||||
|
|
|
@ -59,7 +59,7 @@ config COPS
|
|||
package. This driver is experimental, which means that it may not
|
||||
work. This driver will only work if you choose "AppleTalk DDP"
|
||||
networking support, above.
|
||||
Please read the file <file:Documentation/networking/cops.txt>.
|
||||
Please read the file <file:Documentation/networking/cops.rst>.
|
||||
|
||||
config COPS_DAYNA
|
||||
bool "Dayna firmware support"
|
||||
|
@ -86,7 +86,7 @@ config IPDDP
|
|||
box is stuck on an AppleTalk only network) or decapsulate (e.g. if
|
||||
you want your Linux box to act as an Internet gateway for a zoo of
|
||||
AppleTalk connected Macs). Please see the file
|
||||
<file:Documentation/networking/ipddp.txt> for more information.
|
||||
<file:Documentation/networking/ipddp.rst> for more information.
|
||||
|
||||
If you say Y here, the AppleTalk-IP support will be compiled into
|
||||
the kernel. In this case, you can either use encapsulation or
|
||||
|
@ -107,4 +107,4 @@ config IPDDP_ENCAP
|
|||
IP packets inside AppleTalk frames; this is useful if your Linux box
|
||||
is stuck on an AppleTalk network (which hopefully contains a
|
||||
decapsulator somewhere). Please see
|
||||
<file:Documentation/networking/ipddp.txt> for more information.
|
||||
<file:Documentation/networking/ipddp.rst> for more information.
|
||||
|
|
|
@ -9,7 +9,7 @@ menuconfig ARCNET
|
|||
---help---
|
||||
If you have a network card of this type, say Y and check out the
|
||||
(arguably) beautiful poetry in
|
||||
<file:Documentation/networking/arcnet.txt>.
|
||||
<file:Documentation/networking/arcnet.rst>.
|
||||
|
||||
You need both this driver, and the driver for the particular ARCnet
|
||||
chipset of your card. If you don't know, then it's probably a
|
||||
|
@ -28,7 +28,7 @@ config ARCNET_1201
|
|||
arc0 device. You need to say Y here to communicate with
|
||||
industry-standard RFC1201 implementations, like the arcether.com
|
||||
packet driver or most DOS/Windows ODI drivers. Please read the
|
||||
ARCnet documentation in <file:Documentation/networking/arcnet.txt>
|
||||
ARCnet documentation in <file:Documentation/networking/arcnet.rst>
|
||||
for more information about using arc0.
|
||||
|
||||
config ARCNET_1051
|
||||
|
@ -42,7 +42,7 @@ config ARCNET_1051
|
|||
industry-standard RFC1201 implementations, like the arcether.com
|
||||
packet driver or most DOS/Windows ODI drivers. RFC1201 is included
|
||||
automatically as the arc0 device. Please read the ARCnet
|
||||
documentation in <file:Documentation/networking/arcnet.txt> for more
|
||||
documentation in <file:Documentation/networking/arcnet.rst> for more
|
||||
information about using arc0e and arc0s.
|
||||
|
||||
config ARCNET_RAW
|
||||
|
|
|
@ -28,7 +28,7 @@ config CAIF_SPI_SLAVE
|
|||
The CAIF Link layer SPI Protocol driver for Slave SPI interface.
|
||||
This driver implements a platform driver to accommodate for a
|
||||
platform specific SPI device. A sample CAIF SPI Platform device is
|
||||
provided in <file:Documentation/networking/caif/spi_porting.txt>.
|
||||
provided in <file:Documentation/networking/caif/spi_porting.rst>.
|
||||
|
||||
config CAIF_SPI_SYNC
|
||||
bool "Next command and length in start of frame"
|
||||
|
|
|
@ -30,7 +30,7 @@ config 6PACK
|
|||
|
||||
Note that this driver is still experimental and might cause
|
||||
problems. For details about the features and the usage of the
|
||||
driver, read <file:Documentation/networking/6pack.txt>.
|
||||
driver, read <file:Documentation/networking/6pack.rst>.
|
||||
|
||||
To compile this driver as a module, choose M here: the module
|
||||
will be called 6pack.
|
||||
|
@ -127,7 +127,7 @@ config BAYCOM_SER_FDX
|
|||
your serial interface chip. To configure the driver, use the sethdlc
|
||||
utility available in the standard ax25 utilities package. For
|
||||
information on the modems, see <http://www.baycom.de/> and
|
||||
<file:Documentation/networking/baycom.txt>.
|
||||
<file:Documentation/networking/baycom.rst>.
|
||||
|
||||
To compile this driver as a module, choose M here: the module
|
||||
will be called baycom_ser_fdx. This is recommended.
|
||||
|
@ -145,7 +145,7 @@ config BAYCOM_SER_HDX
|
|||
the driver, use the sethdlc utility available in the standard ax25
|
||||
utilities package. For information on the modems, see
|
||||
<http://www.baycom.de/> and
|
||||
<file:Documentation/networking/baycom.txt>.
|
||||
<file:Documentation/networking/baycom.rst>.
|
||||
|
||||
To compile this driver as a module, choose M here: the module
|
||||
will be called baycom_ser_hdx. This is recommended.
|
||||
|
@ -160,7 +160,7 @@ config BAYCOM_PAR
|
|||
par96 designs. To configure the driver, use the sethdlc utility
|
||||
available in the standard ax25 utilities package. For information on
|
||||
the modems, see <http://www.baycom.de/> and the file
|
||||
<file:Documentation/networking/baycom.txt>.
|
||||
<file:Documentation/networking/baycom.rst>.
|
||||
|
||||
To compile this driver as a module, choose M here: the module
|
||||
will be called baycom_par. This is recommended.
|
||||
|
@ -175,7 +175,7 @@ config BAYCOM_EPP
|
|||
designs. To configure the driver, use the sethdlc utility available
|
||||
in the standard ax25 utilities package. For information on the
|
||||
modems, see <http://www.baycom.de/> and the file
|
||||
<file:Documentation/networking/baycom.txt>.
|
||||
<file:Documentation/networking/baycom.rst>.
|
||||
|
||||
To compile this driver as a module, choose M here: the module
|
||||
will be called baycom_epp. This is recommended.
|
||||
|
|
|
@ -336,7 +336,7 @@ config DLCI
|
|||
|
||||
To use frame relay, you need supporting hardware (called FRAD) and
|
||||
certain programs from the net-tools package as explained in
|
||||
<file:Documentation/networking/framerelay.txt>.
|
||||
<file:Documentation/networking/framerelay.rst>.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called dlci.
|
||||
|
@ -361,7 +361,7 @@ config SDLA
|
|||
|
||||
These are multi-protocol cards, but only Frame Relay is supported
|
||||
by the driver at this time. Please read
|
||||
<file:Documentation/networking/framerelay.txt>.
|
||||
<file:Documentation/networking/framerelay.rst>.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called sdla.
|
||||
|
|
|
@ -86,7 +86,7 @@ config INET
|
|||
"Sysctl support" below, you can change various aspects of the
|
||||
behavior of the TCP/IP code by writing to the (virtual) files in
|
||||
/proc/sys/net/ipv4/*; the options are explained in the file
|
||||
<file:Documentation/networking/ip-sysctl.txt>.
|
||||
<file:Documentation/networking/ip-sysctl.rst>.
|
||||
|
||||
Short answer: say Y.
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@ config ATM
|
|||
of your ATM card below.
|
||||
|
||||
Note that you need a set of user-space programs to actually make use
|
||||
of ATM. See the file <file:Documentation/networking/atm.txt> for
|
||||
of ATM. See the file <file:Documentation/networking/atm.rst> for
|
||||
further details.
|
||||
|
||||
config ATM_CLIP
|
||||
|
|
|
@ -40,7 +40,7 @@ config AX25
|
|||
radio as well as information about how to configure an AX.25 port is
|
||||
contained in the AX25-HOWTO, available from
|
||||
<http://www.tldp.org/docs.html#howto>. You might also want to
|
||||
check out the file <file:Documentation/networking/ax25.txt> in the
|
||||
check out the file <file:Documentation/networking/ax25.rst> in the
|
||||
kernel source. More information about digital amateur radio in
|
||||
general is on the WWW at
|
||||
<http://www.tapr.org/>.
|
||||
|
@ -88,7 +88,7 @@ config NETROM
|
|||
users as well as information about how to configure an AX.25 port is
|
||||
contained in the Linux Ham Wiki, available from
|
||||
<http://www.linux-ax25.org>. You also might want to check out the
|
||||
file <file:Documentation/networking/ax25.txt>. More information about
|
||||
file <file:Documentation/networking/ax25.rst>. More information about
|
||||
digital amateur radio in general is on the WWW at
|
||||
<http://www.tapr.org/>.
|
||||
|
||||
|
@ -107,7 +107,7 @@ config ROSE
|
|||
users as well as information about how to configure an AX.25 port is
|
||||
contained in the Linux Ham Wiki, available from
|
||||
<http://www.linux-ax25.org>. You also might want to check out the
|
||||
file <file:Documentation/networking/ax25.txt>. More information about
|
||||
file <file:Documentation/networking/ax25.rst>. More information about
|
||||
digital amateur radio in general is on the WWW at
|
||||
<http://www.tapr.org/>.
|
||||
|
||||
|
|
|
@ -39,6 +39,6 @@ config CEPH_LIB_USE_DNS_RESOLVER
|
|||
be resolved using the CONFIG_DNS_RESOLVER facility.
|
||||
|
||||
For information on how to use CONFIG_DNS_RESOLVER consult
|
||||
Documentation/networking/dns_resolver.txt
|
||||
Documentation/networking/dns_resolver.rst
|
||||
|
||||
If unsure, say N.
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
* Jamal Hadi Salim
|
||||
* Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
|
||||
*
|
||||
* See Documentation/networking/gen_stats.txt
|
||||
* See Documentation/networking/gen_stats.rst
|
||||
*/
|
||||
|
||||
#include <linux/types.h>
|
||||
|
|
|
@ -15,7 +15,7 @@ config DECNET
|
|||
<http://linux-decnet.sourceforge.net/>.
|
||||
|
||||
More detailed documentation is available in
|
||||
<file:Documentation/networking/decnet.txt>.
|
||||
<file:Documentation/networking/decnet.rst>.
|
||||
|
||||
Be sure to say Y to "/proc file system support" and "Sysctl support"
|
||||
below when using DECnet, since you will need sysctl support to aid
|
||||
|
@ -40,4 +40,4 @@ config DECNET_ROUTER
|
|||
filtering" option will be required for the forthcoming routing daemon
|
||||
to work.
|
||||
|
||||
See <file:Documentation/networking/decnet.txt> for more information.
|
||||
See <file:Documentation/networking/decnet.rst> for more information.
|
||||
|
|
|
@ -19,7 +19,7 @@ config DNS_RESOLVER
|
|||
SMB2 later. DNS Resolver is supported by the userspace upcall
|
||||
helper "/sbin/dns.resolver" via /etc/request-key.conf.
|
||||
|
||||
See <file:Documentation/networking/dns_resolver.txt> for further
|
||||
See <file:Documentation/networking/dns_resolver.rst> for further
|
||||
information.
|
||||
|
||||
To compile this as a module, choose M here: the module will be called
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/* Key type used to cache DNS lookups made by the kernel
|
||||
*
|
||||
* See Documentation/networking/dns_resolver.txt
|
||||
* See Documentation/networking/dns_resolver.rst
|
||||
*
|
||||
* Copyright (c) 2007 Igor Mammedov
|
||||
* Author(s): Igor Mammedov (niallain@gmail.com)
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/* Upcall routine, designed to work as a key type and working through
|
||||
* /sbin/request-key to contact userspace when handling DNS queries.
|
||||
*
|
||||
* See Documentation/networking/dns_resolver.txt
|
||||
* See Documentation/networking/dns_resolver.rst
|
||||
*
|
||||
* Copyright (c) 2007 Igor Mammedov
|
||||
* Author(s): Igor Mammedov (niallain@gmail.com)
|
||||
|
|
|
@ -49,7 +49,7 @@ config IP_ADVANCED_ROUTER
|
|||
|
||||
Note that some distributions enable it in startup scripts.
|
||||
For details about rp_filter strict and loose mode read
|
||||
<file:Documentation/networking/ip-sysctl.txt>.
|
||||
<file:Documentation/networking/ip-sysctl.rst>.
|
||||
|
||||
If unsure, say N here.
|
||||
|
||||
|
|
|
@ -853,7 +853,7 @@ static bool icmp_unreach(struct sk_buff *skb)
|
|||
case ICMP_FRAG_NEEDED:
|
||||
/* for documentation of the ip_no_pmtu_disc
|
||||
* values please see
|
||||
* Documentation/networking/ip-sysctl.txt
|
||||
* Documentation/networking/ip-sysctl.rst
|
||||
*/
|
||||
switch (net->ipv4.sysctl_ip_no_pmtu_disc) {
|
||||
default:
|
||||
|
|
|
@ -13,7 +13,7 @@ menuconfig IPV6
|
|||
For general information about IPv6, see
|
||||
<https://en.wikipedia.org/wiki/IPv6>.
|
||||
For specific information about IPv6 under Linux, see
|
||||
Documentation/networking/ipv6.txt and read the HOWTO at
|
||||
Documentation/networking/ipv6.rst and read the HOWTO at
|
||||
<http://www.tldp.org/HOWTO/Linux+IPv6-HOWTO/>
|
||||
|
||||
To compile this protocol support as a module, choose M here: the
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
*
|
||||
* How to get into it:
|
||||
*
|
||||
* 1) read Documentation/networking/filter.txt
|
||||
* 1) read Documentation/networking/filter.rst
|
||||
* 2) Run `bpf_asm [-c] <filter-prog file>` to translate into binary
|
||||
* blob that is loadable with xt_bpf, cls_bpf et al. Note: -c will
|
||||
* pretty print a C-like construct.
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
* for making a verdict when multiple simple BPF programs are combined
|
||||
* into one in order to prevent parsing same headers multiple times.
|
||||
*
|
||||
* More on how to debug BPF opcodes see Documentation/networking/filter.txt
|
||||
* More on how to debug BPF opcodes see Documentation/networking/filter.rst
|
||||
* which is the main document on BPF. Mini howto for getting started:
|
||||
*
|
||||
* 1) `./bpf_dbg` to enter the shell (shell cmds denoted with '>'):
|
||||
|
|
Loading…
Reference in New Issue