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


     ng_uni — netgraph UNI node type


     #include <netnatm/msg/unistruct.h>
     #include <netnatm/sig/unidef.h>
     #include <netgraph/atm/ng_uni.h>


     The uni netgraph node type implements ATM Forum signalling 4.0.

     After creation of the node, the UNI instance must be created by sending an “enable” message
     to the node.  If the node is enabled, the UNI parameters can be retrieved and modified, and
     the protocol can be started.

     The node is shut down either by an NGM_SHUTDOWN message, or when all hooks are disconnected.


     Each uni node has three hooks with fixed names:

     lower  This hook is the interface of the UNI protocol to the transport layer of the ATM
            control plane.  The node expects the interface exported by ng_sscfu(4) at this hook.

     upper  This hook is the “user” interface of the UNI protocol.  Because there is no
            standardized interface at this point, this implementation follows more or less the
            interface specified by the SDL diagrams in ITU-T recommendations Q.2931 and Q.2971.
            Normally either a ng_ccatm(4) or a switch CAC should be stacked at this interface.
            The message format at the upper hook is described below.  Because netgraph(4) is
            functional, it makes sometimes sense to switch this hook to queueing mode from the
            peer node upon connection.

     The upper interface of the uni node is loosely modelled after the interface specified in the
     ITU-T signalling standards.  There is however one derivation from this: normally there
     exists four kinds of signals: requests, responses, indications and confirmations.  These
     signals are usually triggered either by external events (receiving a message) or internal
     events (a timer or another signal).  This scheme works fine for user APIs that are entirely
     asynchronous, and in cases where error handling is not taken into account.  With synchronous
     APIs and error handling however, there is a problem.  If, for example, the application
     issues a request to set up a connection, it may do it by sending a SETUP.request signal to
     the UNI.  Normally, the UNI stack will send a SETUP message and receive a message from the
     switch (a RELEASE, CONNECT, CALL PROCEEDING or ALERTING), or a timer in the UNI stack will
     time out.  In any of these cases, the UNI stack is supposed to report an event back to the
     application, and the application will unblock (in the case of a synchronous API) and handle
     the event.  The problem occurs when an error happens.  Suppose there is no memory to send
     the SETUP message and to start the timer.  In this case, the application will block forever
     because no received message and no timer will wake it up.  For this reason this
     implementation uses an additional message: for each signal sent from the application to the
     stack, the stack will respond with an error code.  If this code is zero, the stack has
     accepted the signal and the application may block; if the code is non-zero, the signal is
     effectively ignored and the code describes what was wrong.  This system makes it very easy
     to make a blocking interface out of the message based netgraph interface.

     The upper interface uses the following structure:

     struct uni_arg {
             uint32_t        sig;
             uint32_t        cookie;
             u_char          data[];
     The sig field contains the actual signal that is sent from the user to UNI or from UNI to
     the user.  The cookie can be used by the user to correlate requests with events and
     responses.  If an error response, a confirmation or an indication was triggered by a request
     or response, the cookie from that request or response is carried in the message from the
     stack to the user.  The cookie field is followed by the actual data for the signal.

     The signal is one of the following:

     enum uni_sig {
         UNIAPI_ERROR,                       /* UNI -> API */

         UNIAPI_CALL_CREATED,                /* UNI -> API */
         UNIAPI_CALL_DESTROYED,              /* UNI -> API */
         UNIAPI_PARTY_CREATED,               /* UNI -> API */
         UNIAPI_PARTY_DESTROYED,             /* UNI -> API */

         UNIAPI_LINK_ESTABLISH_request,      /* API -> UNI */
         UNIAPI_LINK_ESTABLISH_confirm,      /* UNI -> API */
         UNIAPI_LINK_RELEASE_request,        /* API -> UNI */
         UNIAPI_LINK_RELEASE_confirm,        /* UNI -> API */

         UNIAPI_RESET_request,               /* API -> UNI */
         UNIAPI_RESET_confirm,               /* UNI -> API */
         UNIAPI_RESET_indication,            /* UNI -> API */
         UNIAPI_RESET_ERROR_indication,      /* UNI -> API */
         UNIAPI_RESET_response,              /* API -> UNI */
         UNIAPI_RESET_ERROR_response,        /* API -> UNI */
         UNIAPI_RESET_STATUS_indication,     /* UNI -> API */

         UNIAPI_SETUP_request,               /* API -> UNI */
         UNIAPI_SETUP_indication,            /* UNI -> API */
         UNIAPI_SETUP_response,              /* API -> UNI */
         UNIAPI_SETUP_confirm,               /* UNI -> API */
         UNIAPI_SETUP_COMPLETE_indication,   /* UNI -> API */
         UNIAPI_ALERTING_request,            /* API -> UNI */
         UNIAPI_ALERTING_indication,         /* UNI -> API */
         UNIAPI_PROCEEDING_request,          /* API -> UNI */
         UNIAPI_PROCEEDING_indication,       /* UNI -> API */
         UNIAPI_RELEASE_request,             /* API -> UNI */
         UNIAPI_RELEASE_indication,          /* UNI -> API */
         UNIAPI_RELEASE_response,            /* API -> UNI */
         UNIAPI_RELEASE_confirm,             /* UNI -> API */
         UNIAPI_NOTIFY_request,              /* API -> UNI */
         UNIAPI_NOTIFY_indication,           /* UNI -> API */
         UNIAPI_STATUS_indication,           /* UNI -> API */
         UNIAPI_STATUS_ENQUIRY_request,      /* API -> UNI */

         UNIAPI_ADD_PARTY_request,           /* API -> UNI */
         UNIAPI_ADD_PARTY_indication,        /* UNI -> API */
         UNIAPI_PARTY_ALERTING_request,      /* API -> UNI */
         UNIAPI_PARTY_ALERTING_indication,   /* UNI -> API */
         UNIAPI_ADD_PARTY_ACK_request,       /* API -> UNI */
         UNIAPI_ADD_PARTY_ACK_indication,    /* UNI -> API */
         UNIAPI_ADD_PARTY_REJ_request,       /* API -> UNI */
         UNIAPI_ADD_PARTY_REJ_indication,    /* UNI -> API */
         UNIAPI_DROP_PARTY_request,          /* API -> UNI */
         UNIAPI_DROP_PARTY_indication,       /* UNI -> API */
         UNIAPI_DROP_PARTY_ACK_request,      /* API -> UNI */
         UNIAPI_DROP_PARTY_ACK_indication,   /* UNI -> API */

         UNIAPI_ABORT_CALL_request,          /* API -> UNI */


     The meaning of most of the signals can be deduced from the ITU-T SDLs.  A number of signals,
     however, is unique to this implementation:

          This is the error response, mentioned earlier.  It carries an error code or zero, if
          the signal was accepted by the stack.

          The UNI stack has created a call instance either from an incoming SETUP or from the
          user requesting an outgoing SETUP.  This may be used to synchronize the creation and
          destroying of call data between the UNI stack and the user.

          A call instance has been destroyed and all resources have been freed.

          A new party has been created for an existing point-to-multipoint call.  This may be
          used to synchronize the creation and destroying of party data between the UNI stack and
          the user.

          A party has been destroyed and all resources have been freed.

          This requests the stack to destroy the call instance and free all its resources,
          without sending any messages to the network.

          This is not a signal, but rather a definition to get the number of defined signals.

     Each of the signals is followed by a fixed size structure defined in <netnatm/sig/unidef.h>.


     The uni node understands the standard control messages, plus the following:

     NGM_UNI_SETDEBUG (setdebug)
          Set debugging facility levels.  The UNI stack defines a number of debugging facilities,
          each one associated with a debugging level.  If the debugging level of a facility is
          non-zero, text output will be generated to the console.  The message uses the following

          struct ngm_uni_debug {
                  uint32_t        level[UNI_MAXFACILITY];

     NGM_UNI_GETDEBUG (getdebug)
          Get debugging facility levels.  This returns an ngm_uni_debug structure.

     NGM_UNI_GET_CONFIG (get_config)
          Retrieve the current configuration of the UNI instance.  This message returns a
          uni_config structure:

          struct uni_config {
                  uint32_t proto;         /* which protocol */
                  uint32_t popt;          /* protocol option */
                  uint32_t option;        /* other options */
                  uint32_t timer301;      /* T301 */
                  uint32_t timer303;      /* T303 */
                  uint32_t init303;       /* T303 retransmission count */
                  uint32_t timer308;      /* T308 */
                  uint32_t init308;       /* T308 retransmission count */
                  uint32_t timer309;      /* T309 */
                  uint32_t timer310;      /* T310 */
                  uint32_t timer313;      /* T313 */
                  uint32_t timer316;      /* T316 */
                  uint32_t init316;       /* T316 retransmission count */
                  uint32_t timer317;      /* T317 */
                  uint32_t timer322;      /* T322 */
                  uint32_t init322;       /* T322 retransmission count */
                  uint32_t timer397;      /* T397 */
                  uint32_t timer398;      /* T398 */
                  uint32_t timer399;      /* T399 */

          The field proto specifies one of the following protocols:

          enum uni_proto {
                  UNIPROTO_UNI40U,        /* UNI4.0 user side */
                  UNIPROTO_UNI40N,        /* UNI4.0 network side */
                  UNIPROTO_PNNI10,        /* PNNI1.0 */

          Some protocols may have options which can be set in popt:

          enum uni_popt {
                  UNIPROTO_GFP,           /* enable GFP */

          The option field controls parsing and checking of messages:

          enum uni_option {
                  UNIOPT_GIT_HARD,        /* harder check of GIT IE */
                  UNIOPT_BEARER_HARD,     /* harder check of BEARER IE */
                  UNIOPT_CAUSE_HARD,      /* harder check of CAUSE IE */

          All timer values are given in milliseconds.  Note, however, that the actual resolution
          of the timers depend on system configuration (see timeout(9)).

     NGM_UNI_SET_CONFIG (set_config)
          Change the UNI configuration.  This takes a

          struct ngm_uni_set_config {
                  struct uni_config               config;
                  struct ngm_uni_config_mask      mask;
          struct ngm_uni_config_mask {
                  uint32_t        mask;
                  uint32_t        popt_mask;
                  uint32_t        option_mask;

          The fields of the ngm_uni_config_mask specify which configuration parameter to change.
          The mask field contains bit definitions for all timers, retransmission counters and the
          proto field, popt_mask selects which of the protocol options to change, and option_mask
          specifies which options should be changed.  The following bits are defined:

          enum uni_config_mask {

          For popt_mask and option_mask, the definitions from enum uni_popt and enum uni_option
          should be used.

     NGM_UNI_ENABLE (enable)
          Create the UNI instance and enable processing.  Before the UNI is enabled parameters
          cannot be retrieved or set.

     NGM_UNI_DISABLE (disable)
          Destroy the UNI instance and free all resources.  Note, that connections are not


     netgraph(4), ng_atm(4), ng_sscfu(4), ng_sscop(4), ngctl(8)


     The uni netgraph node and this manual page were written by Harti Brandt <>


        LIJ (leaf-initiated-join) is not implemented yet.
        GFP (generic functional protocol, Q.2932.1) is not yet implemented.
        More testing needed.
        PNNI not yet implemented.
        Need to implement connection modification and the Q.2931 amendments.