Provided by: erlang-manpages_25.2.3+dfsg-1_all bug

NAME

       net_kernel - Erlang networking kernel.

DESCRIPTION

       The  net  kernel  is a system process, registered as net_kernel, which must be operational
       for distributed Erlang to work. The purpose of this process is to implement parts  of  the
       BIFs spawn/4 and spawn_link/4, and to provide monitoring of the network.

       An Erlang node is started using command-line flag -name or -sname:

       $ erl -sname foobar

       It  is also possible to call net_kernel:start(foobar, #{}) directly from the normal Erlang
       shell prompt:

       1> net_kernel:start(foobar, #{name_domain => shortnames}).
       {ok,<0.64.0>}
       (foobar@gringotts)2>

       If the node is started with command-line flag -sname, the node name is foobar@Host,  where
       Host  is the short name of the host (not the fully qualified domain name). If started with
       flag -name, the node name is foobar@Host, where Host is the fully qualified  domain  name.
       For more information, see erl.

       Normally,  connections are established automatically when another node is referenced. This
       functionality can be disabled by setting Kernel configuration parameter  dist_auto_connect
       to  never,  see  kernel(7).  In  this  case, connections must be established explicitly by
       calling connect_node/1.

       Which nodes that are allowed to communicate with each other is handled by the magic cookie
       system, see section Distributed Erlang in the Erlang Reference Manual.

   Warning:
       Starting  a  distributed node without also specifying -proto_dist inet_tls will expose the
       node to attacks that may give the attacker complete access to the node  and  in  extension
       the  cluster.  When  using  un-secure  distributed  nodes,  make  sure that the network is
       configured to keep potential attackers out. See the  Using  SSL  for  Erlang  Distribution
       User's Guide for details on how to setup a secure distributed node.

EXPORTS

       allow(Nodes) -> ok | error

              Types:

                 Nodes = [node()]

              Permits access to the specified set of nodes.

              Before  the  first  call  to  allow/1,  any  node  with  the  correct cookie can be
              connected. When allow/1 is called, a list of  allowed  nodes  is  established.  Any
              access attempts made from (or to) nodes not in that list will be rejected.

              Subsequent  calls  to  allow/1  will add the specified nodes to the list of allowed
              nodes. It is not possible to remove nodes from the list.

              Returns error if any element in Nodes is not an atom.

       connect_node(Node) -> boolean() | ignored

              Types:

                 Node = node()

              Establishes a connection to Node. Returns true if a connection was  established  or
              was  already  established or if Node is the local node itself. Returns false if the
              connection attempt failed, and ignored if the local node is not alive.

       get_net_ticktime() -> Res

              Types:

                 Res = NetTicktime | {ongoing_change_to, NetTicktime} | ignored
                 NetTicktime = integer() >= 1

              Returns currently used net tick time in  seconds.  For  more  information  see  the
              net_ticktime kernel(7) parameter.

              Defined return values (Res):

                NetTicktime:
                  net_ticktime is NetTicktime seconds.

                {ongoing_change_to, NetTicktime}:
                  net_kernel is currently changing net_ticktime to NetTicktime seconds.

                ignored:
                  The local node is not alive.

       getopts(Node, Options) ->
                  {ok, OptionValues} | {error, Reason} | ignored

              Types:

                 Node = node()
                 Options = [inet:socket_getopt()]
                 OptionValues = [inet:socket_setopt()]
                 Reason = inet:posix() | noconnection

              Get one or more options for the distribution socket connected to Node.

              If Node is a connected node the return value is the same as from inet:getopts(Sock,
              Options) where Sock is the distribution socket for Node.

              Returns ignored if the local node is not alive or {error, noconnection} if Node  is
              not connected.

       get_state() ->
                    #{started => no | static | dynamic,
                      name => atom(),
                      name_type => static | dynamic,
                      name_domain => shortnames | longnames}

              Get the current state of the distribution for the local node.

              Returns a map with (at least) the following key-value pairs:

                started => Started:
                  Valid values for Started:

                  no:
                    The  distribution  is not started. In this state none of the other keys below
                    are present in the map.

                  static:
                    The distribution was started with command line arguments -name or -sname.

                  dynamic:
                    The distribution was started with net_kernel:start/1 and can be stopped  with
                    net_kernel:stop/0.

                name => Name:
                  The  name  of the node. Same as returned by erlang:node/0 except when name_type
                  is dynamic in which case Name may be undefined (instead of nonode@nohost).

                name_type => NameType:
                  Valid values for NameType:

                  static:
                    The node has a static node name set by the node itself.

                  dynamic:
                    The distribution was started in  dynamic node name mode,  and  will  get  its
                    node  name assigned from the first node it connects to. If key name has value
                    undefined that has not happened yet.

                name_domain => NameDomain:
                  Valid values for NameDomain:

                  shortnames:
                    The distribution was started to use node names with a short host portion (not
                    fully qualified).

                  longnames:
                    The  distribution  was  started to use node names with a long fully qualified
                    host portion.

       monitor_nodes(Flag) -> ok | Error

       monitor_nodes(Flag, Options) -> ok | Error

              Types:

                 Flag = boolean()
                 Options = OptionsList | OptionsMap
                 OptionsList = [ListOption]
                 ListOption =
                     connection_id | {node_type, NodeType} | nodedown_reason
                 OptionsMap =
                     #{connection_id => boolean(),
                       node_type => NodeType,
                       nodedown_reason => boolean()}
                 NodeType = visible | hidden | all
                 Error = error | {error, term()}

              The calling process subscribes or unsubscribes to node status  change  messages.  A
              nodeup  message  is  delivered  to  all  subscribing  processes  when a new node is
              connected, and a nodedown message is delivered when a node is disconnected.

              If Flag is true, a new subscription is started. If  Flag  is  false,  all  previous
              subscriptions  started  with  the  same  Options  are stopped. Two option lists are
              considered the same if they contain the same set of options.

              Delivery guarantees of nodeup/nodedown messages:

                * nodeup messages are delivered before delivery of any signals  from  the  remote
                  node through the newly established connection.

                * nodedown messages are delivered after all the signals from the remote node over
                  the connection have been delivered.

                * nodeup messages are delivered after the corresponding node appears  in  results
                  from erlang:nodes().

                * nodedown messages are delivered after the corresponding node has disappeared in
                  results from erlang:nodes().

                * As of OTP 23.0, a nodedown message for a connection being taken  down  will  be
                  delivered  before  a  nodeup  message due to a new connection to the same node.
                  Prior to OTP 23.0, this was not guaranteed to be the case.

              The format of the node status change messages depends on Options. If Options is the
              empty list or if net_kernel:monitor_nodes/1 is called, the format is as follows:

              {nodeup, Node} | {nodedown, Node}
                Node = node()

              When  Options  is  the  empty map or empty list, the caller will only subscribe for
              status change messages for visible nodes. That is, only nodes that  appear  in  the
              result of erlang:nodes/0.

              If  Options  equals  anything  other  than the empty list, the format of the status
              change messages is as follows:

              {nodeup, Node, Info} | {nodedown, Node, Info}
                Node = node()
                Info = #{Tag => Val} | [{Tag, Val}]

              Info is either a map or a list of 2-tuples. Its  content  depends  on  Options.  If
              Options  is a map, Info will also be a map. If Options is a list, Info will also be
              a list.

              When Options is a map, currently the following associations are allowed:

                connection_id => boolean():
                  If the value of the association equals true, a  connection_id  =>  ConnectionId
                  association  will  be  included  in  the  Info  map  where  ConnectionId is the
                  connection identifier of the connection coming up or going down. For more  info
                  about this connection identifier see the documentation of erlang:nodes/2.

                node_type => NodeType:
                  Valid values for NodeType:

                  visible:
                    Subscribe  to  node  status  change  messages  for  visible  nodes  only. The
                    association node_type => visible will be included in the Info map.

                  hidden:
                    Subscribe  to  node  status  change  messages  for  hidden  nodes  only.  The
                    association node_type => hidden will be included in the Info map.

                  all:
                    Subscribe  to  node status change messages for both visible and hidden nodes.
                    The association node_type => visible | hidden will be included  in  the  Info
                    map.

                  If  no  node_type  =>  NodeType association is included in the Options map, the
                  caller will subscribe for status change messages for visible nodes only, but no
                  node_type => visible association will be included in the Info map.

                nodedown_reason => boolean():
                  If  the  value  of  the  association  equals  true, a nodedown_reason => Reason
                  association will be included in the Info map for nodedown messages.

                  Reason can, depending on which distribution module or process that is used,  be
                  any  term,  but  for  the  standard  TCP  distribution  module it is one of the
                  following:

                  connection_setup_failed:
                    The connection setup failed (after nodeup messages were sent).

                  no_network:
                    No network is available.

                  net_kernel_terminated:
                    The net_kernel process terminated.

                  shutdown:
                    Unspecified connection shutdown.

                  connection_closed:
                    The connection was closed.

                  disconnect:
                    The connection was disconnected (forced from the current node).

                  net_tick_timeout:
                    Net tick time-out.

                  send_net_tick_failed:
                    Failed to send net tick over the connection.

                  get_status_failed:
                    Status information retrieval from the Port holding the connection failed.

              When Options is a list, currently ListOption can be one of the following:

                connection_id:
                  A  {connection_id,  ConnectionId}  tuple  will  be  included  in   Info   where
                  ConnectionId  is the connection identifier of the connection coming up or going
                  down. For more info about this connection identifier see the  documentation  of
                  erlang:nodes/2.

                {node_type, NodeType}:
                  Valid values for NodeType:

                  visible:
                    Subscribe  to  node  status change messages for visible nodes only. The tuple
                    {node_type, visible} will be included in the Info list.

                  hidden:
                    Subscribe to node status change messages for hidden  nodes  only.  The  tuple
                    {node_type, hidden} will be included in the Info list.

                  all:
                    Subscribe  to  node status change messages for both visible and hidden nodes.
                    The tuple {node_type, visible | hidden} will be included in the Info list.

                  If no {node_type, NodeType} option has been given. The  caller  will  subscribe
                  for status change messages for visible nodes only, but no  {node_type, visible}
                  tuple will be included in the Info list.

                nodedown_reason:
                  The tuple {nodedown_reason, Reason} will be  included  in  the  Info  list  for
                  nodedown messages.

                  See the documentation of the nodedown_reason => boolean() association above for
                  information about possible Reason values.

              Example:

              (a@localhost)1> net_kernel:monitor_nodes(true, #{connection_id=>true, node_type=>all, nodedown_reason=>true}).
              ok
              (a@localhost)2> flush().
              Shell got {nodeup,b@localhost,
                                #{connection_id => 3067552,node_type => visible}}
              Shell got {nodeup,c@localhost,
                                #{connection_id => 13892107,node_type => hidden}}
              Shell got {nodedown,b@localhost,
                                  #{connection_id => 3067552,node_type => visible,
                                    nodedown_reason => connection_closed}}
              Shell got {nodedown,c@localhost,
                                  #{connection_id => 13892107,node_type => hidden,
                                    nodedown_reason => net_tick_timeout}}
              Shell got {nodeup,b@localhost,
                                #{connection_id => 3067553,node_type => visible}}
              ok
              (a@localhost)3>

       set_net_ticktime(NetTicktime) -> Res

       set_net_ticktime(NetTicktime, TransitionPeriod) -> Res

              Types:

                 NetTicktime = integer() >= 1
                 TransitionPeriod = integer() >= 0
                 Res =
                     unchanged | change_initiated |
                     {ongoing_change_to, NewNetTicktime}
                 NewNetTicktime = integer() >= 1

              Sets net_ticktime (see kernel(7)) to NetTicktime seconds. TransitionPeriod defaults
              to 60.

              Some definitions:

                Minimum transition traffic interval (MTTI):
                  minimum(NetTicktime, PreviousNetTicktime)*1000 div 4 milliseconds.

                Transition period:
                  The  time  of  the  least number of consecutive MTTIs to cover TransitionPeriod
                  seconds    following    the    call    to    set_net_ticktime/2    (that    is,
                  ((TransitionPeriod*1000 - 1) div MTTI + 1)*MTTI milliseconds).

              If NetTicktime < PreviousNetTicktime, the net_ticktime change is done at the end of
              the transition period; otherwise at the beginning. During  the  transition  period,
              net_kernel ensures that there is outgoing traffic on all connections at least every
              MTTI millisecond.

          Note:
              The net_ticktime changes must be initiated on all nodes in the  network  (with  the
              same  NetTicktime)  before  the end of any transition period on any node; otherwise
              connections can erroneously be disconnected.

              Returns one of the following:

                unchanged:
                  net_ticktime already has the value of NetTicktime and is left unchanged.

                change_initiated:
                  net_kernel initiated the change of net_ticktime to NetTicktime seconds.

                {ongoing_change_to, NewNetTicktime}:
                  The request is ignored because net_kernel  is  busy  changing  net_ticktime  to
                  NewNetTicktime seconds.

       setopts(Node, Options) -> ok | {error, Reason} | ignored

              Types:

                 Node = node() | new
                 Options = [inet:socket_setopt()]
                 Reason = inet:posix() | noconnection

              Set  one  or more options for distribution sockets. Argument Node can be either one
              node name or the atom  new  to  affect  the  distribution  sockets  of  all  future
              connected nodes.

              The  return  value  is  the same as from inet:setopts/2 or {error, noconnection} if
              Node is not a connected node or new.

              If Node is new the  Options  will  then  also  be  added  to  kernel  configuration
              parameters inet_dist_listen_options and inet_dist_connect_options.

              Returns ignored if the local node is not alive.

       start(Name, Options) -> {ok, pid()} | {error, Reason}

              Types:

                 Options =
                     #{name_domain => NameDomain,
                       net_ticktime => NetTickTime,
                       net_tickintensity => NetTickIntensity,
                       dist_listen => boolean(),
                       hidden => boolean()}
                 Name = atom()
                 NameDomain = shortnames | longnames
                 NetTickTime = integer() >= 1
                 NetTickIntensity = 4..1000
                 Reason = {already_started, pid()} | term()

              Turns  a  non-distributed  node  into a distributed node by starting net_kernel and
              other necessary processes.

              If Name is set to undefined the distribution will be started to request  a  dynamic
              node  name from the first node it connects to. See  Dynamic Node Name. Setting Name
              to undefined implies options dist_listen => false and hidden => true.

              Currently supported options:

                name_domain => NameDomain:
                  Determines the host name part of the node name. If NameDomain equals longnames,
                  fully  qualified  domain  names  will  be  used  which  also is the default. If
                  NameDomain equals shortnames, only the short name of the host will be used.

                net_ticktime => NetTickTime:
                  Net tick time  to use in seconds. Defaults to the  value  of  the  net_ticktime
                  kernel(7)  parameter. For more information about net tick time , see the kernel
                  parameter. However, note that if the value of the kernel parameter is  invalid,
                  it  will  silently  be replaced by a valid value, but if an invalid NetTickTime
                  value is passed as option value to this function, the call will fail.

                net_tickintensity => NetTickIntensity:
                  Net tick intensity  to use. Defaults to  the  value  of  the  net_tickintensity
                  kernel(7)  parameter.  For  more information about net tick intensity , see the
                  kernel parameter. However, note that if the value of the  kernel  parameter  is
                  invalid,  it  will  silently  be  replaced  by a valid value, but if an invalid
                  NetTickIntensity value is passed as option value to  this  function,  the  call
                  will fail.

                dist_listen => boolean():
                  Enable  or disable listening for incoming connections. Defaults to the value of
                  the -dist_listen erl command line argument.  Note  that  dist_listen  =>  false
                  implies hidden => true.

                  If undefined has been passed as Name, the dist_listen option will be overridden
                  with dist_listen => false.

                hidden => boolean():
                  Enable or disable hidden node. Defaults to true if the -hidden erl command line
                  argument has been passed; otherwise false.

                  If  undefined  has been passed as Name, or the option dist_listen equals false,
                  the hidden option will be overridden with hidden => true.

       start(Options) -> {ok, pid()} | {error, Reason}

              Types:

                 Options = [Name | NameDomain | TickTime, ...]
                 Name = atom()
                 NameDomain = shortnames | longnames
                 TickTime = integer() >= 1
                 Reason = {already_started, pid()} | term()

          Warning:
              start/1 is deprecated. Use start/2 instead.

              Turns a non-distributed node into a distributed node  by  starting  net_kernel  and
              other necessary processes.

              Options list can only be exactly one of the following lists (order is imporant):

                [Name]:
                  The same as net_kernel:start([Name, longnames, 15000]).

                [Name, NameDomain]:
                  The same as net_kernel:start([Name, NameDomain, 15000]).

                [Name, NameDomain, TickTime]:
                  The same as net_kernel:start(Name, #{name_domain => NameDomain, net_ticktime =>
                  ((TickTime*4-1) div 1000) + 1, net_tickintensity => 4}). Note that TickTime  is
                  not   the same as net tick time expressed in milliseconds. TickTime is the time
                  between ticks when net tick intensity equals 4.

       stop() -> ok | {error, Reason}

              Types:

                 Reason = not_allowed | not_found

              Turns a distributed node into a  non-distributed  node.  For  other  nodes  in  the
              network, this is the same as the node going down. Only possible when the net kernel
              was started using start/2, otherwise  {error,  not_allowed}  is  returned.  Returns
              {error, not_found} if the local node is not alive.