Provided by: freebsd-manpages_12.2-1_all bug


     ng_vjc — Van Jacobson compression netgraph node type


     #include <sys/types.h>
     #include <netinet/in.h>
     #include <netinet/in_systm.h>
     #include <netinet/ip.h>
     #include <net/slcompress.h>
     #include <netgraph/ng_vjc.h>


     The vjc node type performs Van Jacobson compression, which is used over PPP, SLIP, and other
     point-to-point IP connections to compress TCP packet headers.  The ip hook represents the
     uncompressed side of the node, while the vjcomp, vjuncomp, and vjip hooks represent the
     compressed side of the node.  Packets received on the ip will be compressed or passed
     through as appropriate.  Packets received on the other three hooks will be uncompressed as
     appropriate.  This node also supports “always pass through” mode in either direction.

     Van Jacobson compression only applies to TCP packets.  Only “normal” (i.e., common case) TCP
     packets are actually compressed.  These are output on the vjcomp hook.  Other TCP packets
     are run through the state machine but not compressed; these appear on the vjuncomp hook.
     Other non-TCP IP packets are forwarded unchanged to vjip.

     When connecting to a ng_ppp(4) node, the ip, vjuncomp, vjcomp, and vjip hooks should be
     connected to the ng_ppp(4) node's vjc_ip, vjc_vjcomp, vjc_vjuncomp, and vjc_ip hooks,


     This node type supports the following hooks:

     ip        Upstream (uncompressed) IP packets.

     vjcomp    Downstream compressed TCP packets.

     vjuncomp  Downstream uncompressed TCP packets.

     vjip      Downstream uncompressed IP packets.


     This node type supports the generic control messages, plus the following:

     NGM_VJC_SET_CONFIG (setconfig)
          This command resets the compression state and configures it according to the supplied
          struct ngm_vjc_config argument.  This structure contains the following fields:

              struct ngm_vjc_config {
                u_char   enableComp;    /* Enable compression */
                u_char   enableDecomp;  /* Enable decompression */
                u_char   maxChannel;    /* Number of outgoing channels - 1 */
                u_char   compressCID;   /* OK to compress outgoing CID's */

          When enableComp is set to zero, all packets received on the ip hook are forwarded
          unchanged out the vjip hook.  Similarly, when enableDecomp is set to zero, all packets
          received on the vjip hook are forwarded unchanged out the ip hook, and packets are not
          accepted on the vjcomp and vjuncomp hooks.  When a node is first created, both
          compression and decompression are disabled and the node is therefore operating in bi-
          directional “pass through” mode.

          When enabling compression, maxChannel should be set to the number of outgoing
          compression channels minus one, and is a value between 3 and 15, inclusive.  The
          compressCID field indicates whether it is OK to compress the CID header field for
          outgoing compressed TCP packets.  This value should be zero unless either (a) it is not
          possible for an outgoing frame to be lost, or (b) lost frames can be reliably detected
          and immediately reported to the peer's decompression engine (see NGM_VJC_RECV_ERROR

     NGM_VJC_GET_STATE (getstate)
          This command returns the node's current state described by the struct slcompress
          structure, which is defined in <net/slcompress.h>.

     NGM_VJC_CLR_STATS (clrstats)
          Clears the node statistics counters.  Statistics are also cleared whenever the
          enableComp or enableDecomp fields are changed from zero to one by a NGM_VJC_SET_CONFIG
          control message.

     NGM_VJC_RECV_ERROR (recverror)
          When the peer has CID header field compression enabled, this message must be sent to
          the local vjc node immediately after detecting that a received frame has been lost, due
          to a bad checksum or for any other reason.  Failing to do this can result in corrupted
          TCP stream data.


     This node shuts down upon receipt of a NGM_SHUTDOWN control message, or when all hooks have
     been disconnected.


     netgraph(4), ng_iface(4), ng_ppp(4), ngctl(8)

     V. Jacobson, Compressing TCP/IP Headers, RFC 1144.

     G. McGregor, The PPP Internet Control Protocol (IPCP), RFC 1332.


     The ng_vjc node type was implemented in FreeBSD 4.0.


     Archie Cobbs <>


     As the initialization routine in the kernel implementation of Van Jacobson compression
     initializes both compression and decompression at once, this node does not allow compression
     and decompression to be enabled in separate operations.  In order to enable one when the
     other is already enabled, first both must be disabled, then both enabled.  This of course
     resets the node state.  This restriction may be lifted in a later version.

     When built as a loadable kernel module, this module includes the file net/slcompress.c.
     Although loading the module should fail if net/slcompress.c already exists in the kernel,
     currently it does not, and the duplicate copies of the file do not interfere.  However, this
     may change in the future.