Provided by: manpages-pl_4.15.0-9_all bug

NAZWA

       ip - Implementacja protokołu IPv4 dla systemu Linux

SKŁADNIA

       #include <sys/socket.h>
       #include <netinet/in.h>
       #include <netinet/ip.h> /* superset of previous */

       tcp_socket = socket(AF_INET, SOCK_STREAM, 0);
       udp_socket = socket(AF_INET, SOCK_DGRAM, 0);
       raw_socket = socket(AF_INET, SOCK_RAW, protocol);

OPIS

       Linux  implementuje  protokół  IPv4  opisany w RFC 791 i RFC 1122. ip zawiera drugi poziom
       implementacji adresowania grupowego (multicasting) zgodny z RFC 1112. Zawiera  też  router
       IP, włączając w to filtr pakietów.

       Interfejs  programistyczny  jest zgodny z gniazdami BSD. Więcej informacji na temat gniazd
       można znaleźć, przeglądając socket(7).

       Gniazdo IP jest tworzone za pomocą socket(2):

           socket(AF_INET, typ_gniazda, protokół);

       Valid socket types include SOCK_STREAM to open a  stream  socket,  SOCK_DGRAM  to  open  a
       datagram socket, and SOCK_RAW to open a raw(7) socket to access the IP protocol directly.

       protocol  is  the  IP  protocol in the IP header to be received or sent.  Valid values for
       protocol include:

       • 0 and IPPROTO_TCP for tcp(7)  stream sockets;

       • 0 and IPPROTO_UDP for udp(7)  datagram sockets;

       • IPPROTO_SCTP for sctp(7)  stream sockets; and

       • IPPROTO_UDPLITE for udplite(7)  datagram sockets.

       For SOCK_RAW you may specify a  valid  IANA  IP  protocol  defined  in  RFC 1700  assigned
       numbers.

       Kiedy  proces  chce  odbierać nowe, nadchodzące pakiety lub połączenia, powinien podłączyć
       gniazdo do adresu lokalnego interfejsu za pomocą funkcji bind(2).  W  takim  przypadku  do
       dowolnej  lokalnej  pary  (adres,  port)  można  podłączyć  tylko  jedno gniazdo IP. Gdy w
       wywołaniu bind(2) podana  jest  wartość  INADDR_ANY,  to  gniazdo  zostanie  dowiązane  do
       wszystkich lokalnych interfejsów sieciowych. Gdy do niedowiązanego gniazda wywoływane jest
       listen(2), to gniazdo zostanie automatycznie dowiązane do losowo wybranego wolnego  portu,
       przy  czym  adres lokalny zostanie ustawiony na INADDR_ANY. Gdy dla niedowiązanego gniazda
       zostanie wywołane connect(2),  gniazdo  to  zostanie  automatycznie  dowiązane  do  losowo
       wybranego  wolnego  portu  lub  do  używalnego  portu  dzielonego, przy czym adres lokalny
       zostanie ustawiony na INADDR_ANY.

       Przypisywanie (często w literaturze: "nazywanie") lokalnego gniazda  TCP  jest  niemożliwe
       przez  pewien okres czasu po jego zamknięciu, chyba że zostanie dla tego gniazda ustawiony
       atrybut SO_REUSEADDR. Należy używać tego atrybutu z  rozwagą,  gdyż  czyni  on  TCP  mniej
       niezawodnym.

   Format adresu
       Adres  gniazda  IP  jest  przedstawiony  za  pomocą  kombinacji  adresu  interfejsu  IP  i
       16-bitowego numeru portu. Podstawowy protokół  IP  nie  zawiera  numerów  portów,  są  one
       zaimplementowane  w  protokołach  wyższej  warstwy, takich jak udp(7) i tcp(7). Dla gniazd
       surowych sin_port jest ustawione na protokół IP.

           struct sockaddr_in {
               sa_family_t    sin_family; /* rodzina adresów: AF_INET  */
               in_port_t      sin_port;   /* port - sieciowa kolejność bajtów */
               struct in_addr sin_addr;   /* adres internetowy */
           };

           /* Internet address */
           struct in_addr {
               uint32_t       s_addr;     /* address in network byte order */
           };

       sin_family is always set to AF_INET.  This is  required;  in  Linux  2.2  most  networking
       functions  return  EINVAL  when  this  setting  is missing.  sin_port contains the port in
       network byte order.   The  port  numbers  below  1024  are  called  privileged  ports  (or
       sometimes:  reserved  ports).  Only a privileged process (on Linux: a process that has the
       CAP_NET_BIND_SERVICE capability in the user namespace governing its network namespace) may
       bind(2)   to  these  sockets.  Note that the raw IPv4 protocol as such has no concept of a
       port, they are implemented only by higher protocols like tcp(7)  and udp(7).

       sin_addr is the IP host address.  The s_addr member of struct in_addr  contains  the  host
       interface  address  in network byte order.  in_addr should be assigned one of the INADDR_*
       values  (e.g.,  INADDR_LOOPBACK)   using  htonl(3)   or  set   using   the   inet_aton(3),
       inet_addr(3),  inet_makeaddr(3)  library functions or directly with the name resolver (see
       gethostbyname(3)).

       IPv4 addresses are divided into unicast,  broadcast,  and  multicast  addresses.   Unicast
       addresses specify a single interface of a host, broadcast addresses specify all hosts on a
       network, and multicast addresses address all hosts in a  multicast  group.   Datagrams  to
       broadcast addresses can be sent or received only when the SO_BROADCAST socket flag is set.
       In the current implementation, connection-oriented sockets are allowed to use only unicast
       addresses.

       Należy  zauważyć,  że  dla adresu i portu zawsze jest używana sieciowa kolejność bajtów. W
       szczególności oznacza to, że trzeba używać funkcji htons(3)  dla  numeru  przypisanego  do
       portu. Wszystkie funkcje standardowej biblioteki manipulujące adresem/portem automatycznie
       przekształcają podaną wartość na jej sieciową reprezentację.

       Istnieje kilka adresów specjalnych:  INADDR_LOOPBACK  (127.0.0.1)  zawsze  odnosi  się  do
       lokalnego   hosta   poprzez   urządzenie   loopback;  INADDR_ANY  (0.0.0.0)  oznacza  przy
       dowiązywaniu dowolny adres; INADDR_BROADCAST (255.255.255.255) oznacza dowolny komputer  i
       ze względów historycznych zachowuje się przy dowiązywaniu tak samo, jak INADDR_ANY.

   Opcje gniazda
       IP  wspiera niektóre opcje specyficzne dla protokołu, które mogą być ustawione przy użyciu
       setsockopt(2) i  odczytane  z  pomocą  getsockopt(2).  Poziom  opcji  gniazda  dla  IP  to
       IPPROTO_IP.  Dla  każdego ze znaczników logicznych wartość całkowita zero oznacza fałsz, a
       każda inna - prawdę.

       Gdy poda  się nieprawidłową  opcję gniazda,  getsockopt(2)  i  setsockopt(2)  zwrócą  błąd
       ENOPROTOOPT.

       IP_ADD_MEMBERSHIP (od Linuksa 1.2)
              Przyłącza grupę adresów. Argumentem jest struktura ip_mreqn .

           struct ip_mreqn {
               struct in_addr imr_multiaddr; /* grupowy adres IP */
               struct in_addr imr_address;   /* adres IP interfejsu
                                                lokalnego */
               int            imr_ifindex;   /* indeks interfejsu */
           };

       imr_multiaddr  zawiera adres grupy, którą aplikacja chce podłączyć lub rozłączyć. Musi być
       to poprawny adres grupowy (multicast;  w  przeciwnym  wypadku  setsockopt(2)  zwróci  błąd
       EINVAL).  imr_address  jest  to  adres  lokalnego  interfejsu, przez który system powinien
       połączyć grupę; jeśli jest równy INADDR_ANY, to odpowiedni interfejs jest wybierany  przez
       system.  imr_ifindex  jest indeksem interfejsu, który powinien być podłączony/odłączony do
       obsługi grupy imr_multiaddr lub 0, by wskazać na dowolny interfejs.

              Struktura ip_mreqn jest dostępna tylko od wersji 2.2 Linuksa. Dla  kompatybilności,
              stara  struktura  ip_mreq  wciąż jest obsługiwana. Różni się wprawdzie od ip_mreqn,
              lecz tylko tym, że nie zawiera pola  imr_ifindex  (jądro  określa  którą  strukturę
              zastosowano na podstawie rozmiaru podanego w optlen).

              IP_ADD_MEMBERSHIP jest prawidłowe wyłącznie dla setsockopt(2).

       IP_ADD_SOURCE_MEMBERSHIP (od Linuksa 2.4.22 / 2.5.68)
              Przyłącza  adres  grupowy  (multicast)  i  zezwala na otrzymywanie danych jedynie z
              podanego źródła. Argumentem jest struktura ip_mreq_source.

           struct ip_mreq_source {
               struct in_addr imr_multiaddr;  /* grupowy adres IP */
               struct in_addr imr_interface;  /* adres IP interfejsu
                                                 lokalnego */
               struct in_addr imr_sourceaddr; /* adres IP
                                                 grupowego źródła */
           };

       The ip_mreq_source structure is similar to  ip_mreqn  described  under  IP_ADD_MEMBERSHIP.
       The  imr_multiaddr field contains the address of the multicast group the application wants
       to join or leave.  The imr_interface field is the address  of  the  local  interface  with
       which  the  system  should  join  the  multicast group.  Finally, the imr_sourceaddr field
       contains the address of the source the application wants to receive data from.

              Opcja może być użyta kilkakrotnie aby otrzymywać dane z kilku źródeł.

       IP_BIND_ADDRESS_NO_PORT (od Linuksa 4.2)
              Informuje jądro, aby nie rezerwować portu efemerycznego przy korzystaniu z  bind(2)
              z numerem portu 0. Port będzie wybrany automatycznie później, w trakcie wykonywania
              connect(2), w sposób umożliwiający współdzielenie portu źródłowego tak  długo,  jak
              długo unikatowa jest czteroelementowa krotka.

       IP_BLOCK_SOURCE (od Linuksa 2.4.22 / 2.5.68)
              Kończy  otrzymywanie  danych  grupowych  z podanego źródła i podanej grupy. Jest to
              odpowiednie  jedynie   po   zapisaniu   się   do   adresu   grupowego   za   pomocą
              IP_ADD_MEMBERSHIP lub IP_ADD_SOURCE_MEMBERSHIP.

              Argumentem    jest   struktura   ip_mreq_source   opisana   w   części   dotyczącej
              IP_ADD_SOURCE_MEMBERSHIP.

       IP_DROP_MEMBERSHIP (od Linuksa 1.2)
              Odłącza się od grupy  adresów.  Argumentem  jest  struktura  ip_mreqn  lub  ip_mreq
              podobna do IP_ADD_MEMBERSHIP.

       IP_DROP_SOURCE_MEMBERSHIP (od Linuksa 2.4.22 / 2.5.68)
              Leave  a  source-specific group—that is, stop receiving data from a given multicast
              group that come from a given source.  If the application has subscribed to multiple
              sources  within  the  same  group,  data  from  the remaining sources will still be
              delivered.   To   stop   receiving   data   from   all   sources   at   once,   use
              IP_DROP_MEMBERSHIP.

              Argumentem    jest   struktura   ip_mreq_source   opisana   w   części   dotyczącej
              IP_ADD_SOURCE_MEMBERSHIP.

       IP_FREEBIND (od Linuksa 2.4)
              Jeśli jest włączona,  to  ta  opcja  logiczna  pozwala  na  przypisanie  do  adresu
              nielokalnego   lub  (jeszcze)  nieistniejącego.  Pozwala  to  na  nasłuchiwanie  na
              gnieździe bez wymagania,  żeby   interfejs  sieciowy  niższej  warstwy  lub  podany
              dynamiczny  adres  IP  były  ustawione  podczas  próby  przypisania  gniazda  przez
              aplikację. Ta opcja jest odpowiednikiem -  dla  pojedynczego  gniazda  -  opisanego
              poniżej interfejsu /proc ip_nonlocal_bind.

       IP_HDRINCL (od Linuksa 2.0)
              Jeśli  włączone, to dopuszczalne jest tworzenie przez użytkownika własnego nagłówka
              IP przed danymi użytkownika. Działa to jedynie dla gniazd SOCK_RAW,  patrz  raw(7),
              by uzyskać więcej informacji. Gdy ten znacznik jest włączony, to wartości ustawiane
              przez IP_OPTIONS, IP_TTL i IP_TOS są ignorowane.

       IP_MSFILTER (od Linuksa 2.4.22 / 2.5.68)
              Opcja  pozwala  na  uzyskanie  dostępu  do  zaawansowanego  interfejsu  filtrowania
              pełnostanowego. Argumentem jest struktura ip_msfilter.

           struct ip_mreqn {
               struct in_addr imsf_multiaddr; /* grupowy adres IP */
               struct in_addr imsf_interface; /* adres IP interfejsu
                                                 lokalnego */
               uint32_t       imsf_fmode;     /* tryb filtra */
           };

               uint32_t       imsf_numsrc;    /* Liczba źródeł w
                                                 kolejnej macierzy */
               struct in_addr imsf_slist[1];  /* Macierz źródeł
                                                 adresów */
           };

       Do  określenia  trybu  filtrowania  służą dwa makra - MCAST_INCLUDE i MCAST_EXCLUDE. Makro
       IP_MSFILTER_SIZE(n)  służy  natomiast  do  określenia  wielkości  pamięci  potrzebnej   do
       przechowania struktury ip_msfilter z n źródeł w liście źródeł.

              Pełny opis filtrowania źródeł adresów zawiera dokument RFC 3376.

       IP_MTU (od Linuksa 2.2)
              Pobiera bieżącą wartość MTU ścieżki obecnego gniazda. Zwraca liczbę całkowitą.

              IP_MTU  jest  poprawne tylko do getsockopt(2) i można go użyć wyłącznie gdy gniazdo
              zostało połączone.

       IP_MTU_DISCOVER (od Linuksa 2.2)
              Ustawia lub pobiera opcję  badania  MTU  ścieżki  (ang.  Path  MTU  Discovery)  dla
              gniazda.  Gdy  opcja  ta  jest  włączona, to Linux będzie przeprowadzał badanie MTU
              ścieżki dla gniazd SOCK_STREAM zgodnie z definicją zawartą w RFC 1191. W  przypadku
              gniazd  nie  będących  gniazdami  SOCK_STREAM, IP_PMTUDISC_DO wymusza ustawienie we
              wszystkich pakietach wychodzących znacznika zakazu fragmentacji. Za poprawne zgodne
              z  wartością  MTU,  podzielenie na pakiety i za wykonanie ewentualnych retransmisji
              jest odpowiedzialny program użytkownika.  Jądro odrzuci (z błędem EMSGSIZE) pakiety
              większe  niż  znane  MTU  ścieżki.  Ustawienie znacznika IP_PMTUDISC_WANT spowoduje
              sfragmentowanie datagramu, jeśli MTU ścieżki  tego  wymaga,  albo  -  w  przeciwnym
              wypadku - ustawienie znacznika zakazującego fragmentacji.

              Domyślną   dla   systemu   wartość   można  ustawić  na   IP_PMTUDISC_WANT  lub  na
              IP_PMTUDISC_DONT, wpisując odpowiednio - zero lub  wartość  niezerową  -  do  pliku
              /proc/sys/net/ipv4/ip_no_pmtu_disc.

              Wart. badan. MTU ścieżki   Znaczenie
              IP_PMTUDISC_WANT           Używaj ustawień zależnych od trasy.
              IP_PMTUDISC_DONT           Nie badaj MTU ścieżki.
              IP_PMTUDISC_DO             Zawsze badaj MTU ścieżki.
              IP_PMTUDISC_PROBE          Ustawia bit DF, ale ignoruje MTU ścieżki.

              Gdy  włączone  jest  badanie MTU ścieżki, jądro automatycznie namierza wartości MTU
              ścieżki dla każdego komputera docelowego.  Gdy  aktywne  jest  połączenie  z  danym
              komputerem,  można  wygodnie  odczytać  aktualnie rozpoznaną wartość MTU ścieżki za
              pomocą  connect(2)  używając  opcji  gniazda  IP_MTU  (np.  po  wystąpieniu   błędu
              EMSGSIZE).   Wartość   MTU   ścieżki   może  się  zmieniać  z  czasem.  Dla  gniazd
              bezpołączeniowych z wieloma komputerami docelowymi MTU dla danego, również  nowego,
              komputera docelowego można uzyskać za pomocą kolejki błędów (zobacz IP_RECVERR). Po
              nadejściu każdej aktualizacji MTU zostanie skolejkowany nowy błąd.

              W trakcie rozpoznawania MTU, pakiety inicjujące z gniazd datagramowych mogą  zostać
              porzucone.  Programy  korzystające  z UDP powinny być tego świadome i nie brać tego
              pod uwagę w swojej strategii retransmisji pakietów.

              To bootstrap the path MTU discovery process on unconnected sockets, it is  possible
              to  start  with  a  big  datagram size (headers up to 64 kilobytes long) and let it
              shrink by updates of the path MTU.

              Aby oszacować inicjalne MTU ścieżki, należy podłączyć gniazdo datagramowe do adresu
              docelowego za pomocą connect(2) i pobrać MTU, wołając getsockopt(2) z opcją IP_MTU.

              Poprzez  ustawienie  wartości  w  IP_PMTUDISC_PROBE  (dostępnej  od Linuksa 2.6.22)
              możliwe jest zaimplementowanie opisanego w  RFC 4821  próbkowania  MTU  dla  gniazd
              SOCK_DGRAM   lub   SOCK_RAW.   Jest   to   szczególnie   użyteczne   w  narzędziach
              diagnostycznych typu tracepath(8), które w sposób zamierzony chcą  wysyłać  pakiety
              testowe większe niż zaobserwowane MTU ścieżki.

       IP_MULTICAST_ALL (od Linuksa 2.6.31)
              Tej  opcji  można  użyć  do  modyfikacji zasad dostarczania wiadomości grupowych do
              gniazd ograniczonych maską adresu INADDR_ANY. Argument wynosi 0  lub  1  (domyślnie
              1).  Gdy  jest  ustawiony  na  1, to gniazdo otrzyma wiadomości ze wszystkich grup,
              które dołączono globalnie z całego systemu. W  przeciwnym  razie  dostarczone  będą
              tylko  wiadomości  z  grup dołączonych jawnie (np. opcją IP_ADD_MEMBERSHIP) do tego
              konkretnego gniazda.

       IP_MULTICAST_IF (od Linuksa 1.2)
              Ustawia lokalne urządzenie dla gniazda grupowego. Argumentem do setsockopt(2)  jest
              ip_mreqn lub (od Linuksa 3.5) ip_mreq, struktura podobna do IP_ADD_MEMBERSHIP; albo
              struktura in_addr (jądro określa którą strukturę się podało na  podstawie  rozmiaru
              przekazanego w optlen). Do getsockopt(2) argumentem jest struktura in_addr.

       IP_MULTICAST_LOOP (od Linuksa 1.2)
              Ustawia lub pobiera logiczny argument typu całkowitego, określający, czy przesyłane
              pakiety grupowe powinny wracać do lokalnego gniazda.

       IP_MULTICAST_TTL (od Linuksa 1.2)
              Ustawia lub pobiera wartość czasu życia pakietu dla  wychodzących  z  tego  gniazda
              pakietów  grupowych.  Jest  bardzo  istotne  w  przypadku adresowania grupowego, by
              ustawić najmniejszą możliwą wartość TTL.  Domyślnie  jest  to  1,  co  oznacza,  że
              pakiety  grupowe  nie  opuszczają  sieci  lokalnej,  chyba  że  program użytkownika
              wyraźnie tego żąda. Argument jest liczbą całkowitą.

       IP_NODEFRAG (od Linuksa 2.6.36)
              Jeśli włączone (argument jest  niezerowy),  łączenie  pakietów  wychodzących  przez
              warstwę netfilter jest wyłączone. Argumentem jest liczba całkowita.

              Ta opcja jest prawidłowa tylko dla gniazd SOCK_RAW.

       IP_OPTIONS (od Linuksa 2.0)
              Set  or  get  the  IP  options  to be sent with every packet from this socket.  The
              arguments are a pointer to a memory buffer containing the options  and  the  option
              length.  The setsockopt(2)  call sets the IP options associated with a socket.  The
              maximum option size for IPv4 is 40 bytes.  See RFC 791  for  the  allowed  options.
              When  the  initial  connection  request packet for a SOCK_STREAM socket contains IP
              options, the IP options will be set automatically to the options from  the  initial
              packet  with  routing headers reversed.  Incoming packets are not allowed to change
              options after the connection is established.  The processing of all incoming source
              routing   options  is  disabled  by  default  and  can  be  enabled  by  using  the
              accept_source_route /proc interface.   Other  options  like  timestamps  are  still
              handled.   For  datagram  sockets,  IP  options  can be set only by the local user.
              Calling getsockopt(2)  with IP_OPTIONS puts the current IP options used for sending
              into the supplied buffer.

       IP_PASSSEC (since Linux 2.6.17)
              If labeled IPSEC or NetLabel is configured on the sending and receiving hosts, this
              option enables receiving of the security context of the peer socket in an ancillary
              message  of type SCM_SECURITY retrieved using recvmsg(2).  This option is supported
              only for UDP sockets;  for  TCP  or  SCTP  sockets,  see  the  description  of  the
              SO_PEERSEC option below.

              The  value  given  as  an  argument to setsockopt(2)  and returned as the result of
              getsockopt(2)  is an integer boolean flag.

              The security context returned in the SCM_SECURITY ancillary message is of the  same
              format as the one described under the SO_PEERSEC option below.

              Note:  the  reuse of the SCM_SECURITY message type for the IP_PASSSEC socket option
              was likely a mistake, since other IP  control  messages  use  their  own  numbering
              scheme  in  the  IP  namespace and often use the socket option value as the message
              type.  There is no conflict currently since the IP option with the  same  value  as
              SCM_SECURITY is IP_HDRINCL and this is never used for a control message type.

       IP_PKTINFO (od Linuksa 2.2)
              Pass  an  IP_PKTINFO  ancillary  message  that  contains  a  pktinfo structure that
              supplies some information about the incoming packet.  This works only for  datagram
              oriented  sockets.   The  argument  is  a  flag  that  tells the socket whether the
              IP_PKTINFO  message  should  be  passed  or  not.   The  message  itself   can   be
              sent/retrieved  only  as  a  control  message  with  a  packet using recvmsg(2)  or
              sendmsg(2).

                  struct in_pktinfo {
                      unsigned int   ipi_ifindex;  /* Indeks interfejsu */
                      struct in_addr ipi_spec_dst; /* Adres lokalny */
                      struct in_addr ipi_addr;     /* Nagłówek adresu
                                                      docelowego */
                  };

              ipi_ifindex  jest  unikatowym  indeksem  interfejsu,  przez  który  pakiet   został
              odebrany. Adres ipi_spec_dst jest lokalnym adresem pakietu, a ipi_addr jest adresem
              docelowym wynikającym z nagłówka  pakietu.  Jeśli  IP_PKTINFO  jest  przekazane  do
              sendmsg(2),  a  ipi_spec_dst  ma wartość niezerową, to zostanie użyte jako źródłowy
              adres lokalny podczas  przeszukiwania  tablicy  routingu  i  dla  ustawienia  opcji
              routingu  według  adresu  źródłowego.  Gdy  ipi_ifindex  ma  wartość  niezerową, to
              podstawowy  adres  lokalny  interfejsu  wskazywanego  przez  ten  indeks  nadpisuje
              ipi_spec_dst podczas przeszukiwania tablicy routingu.

       IP_RECVERR (od Linuksa 2.2)
              Włącza  przekazywanie  dodatkowych  komunikatów o błędach, zwiększając niezawodność
              połączenia. Gdy jest to ustawione w gnieździe datagramowym, to wszystkie generowane
              błędy  będą  zapamiętane  w  specjalnej  kolejce błędów przypisanej do gniazda. Gdy
              użytkownik (proces użytkownika) otrzyma błąd (przez zwrócony kod błędu operacji  na
              gnieździe),   to   może  go  odebrać,  używając  funkcji  recvmsg(2)  z  ustawionym
              znacznikiem  MSG_ERRQUEUE.  Struktura  opisująca  błąd  sock_extended_err  zostanie
              przekazana w pomocniczym komunikacie o typie IP_RECVERR i poziomie IPPROTO_IP. Jest
              to niezwykle pomocne przy niezawodnym przechwytywaniu błędów niepołączonych gniazd.
              Odbierana z kolejki błędów porcja danych zawiera pakiet z informacją o błędzie.

              Komunikat  sterujący  IP_RECVERR  zawiera  strukturę sock_extended_err zdefiniowaną
              następująco:

                  #define SO_EE_ORIGIN_NONE    0
                  #define SO_EE_ORIGIN_LOCAL   1
                  #define SO_EE_ORIGIN_ICMP    2
                  #define SO_EE_ORIGIN_ICMP6   3

                  struct sock_extended_err {
                      uint32_t ee_errno;   /* numer błędu */
                      uint8_t  ee_origin;  /* źródło błędu */
                      uint8_t  ee_type;    /* typ */
                      uint8_t  ee_code;    /* kod */
                      uint8_t  ee_pad;
                      uint32_t ee_info;    /* informacje dodatkowe */
                      uint32_t ee_data;    /* inne dane */
                      /* Dalej mogą wystąpić dodatkowe dane */
                  };

                  struct sockaddr *SO_EE_OFFENDER(struct sock_extended_err *);

              ee_errno  zawiera  numer  errno  błędu  kolejki.  ee_origin  jest   kodem   miejsca
              pochodzenia  błędu.  Pozostałe  pola  są zależne od protokołu. Makro SO_EE_OFFENDER
              zwraca wskaźnik do adresu obiektu sieciowego, z którego pochodził  błąd  o  zadanym
              wskaźniku  do komunikatu pomocniczego. Gdy ten adres nie jest znany, pole sa_family
              struktury sockaddr  zawiera  wartość  AF_UNSPEC  a  pozostałe  pola  tej  struktury
              sockaddr są niezdefiniowane.

              IP  używa  struktury sock_extended_err w następujący sposób: ee_origin ustawione na
              SO_EE_ORIGIN_ICMP   dla   błędów   odbieranych   jako   pakiet   ICMP   albo    też
              SO_EE_ORIGIN_LOCAL  dla  błędów  generowanych  lokalnie.  Nieznane  wartości należy
              ignorować. ee_type i ee_code są ustawiane zgodnie z typem i kodem  pól  w  nagłówku
              ICMP. ee_info zawiera rozpoznaną wartość MTU dla błędów EMSGSIZE. Komunikat zawiera
              również sockaddr_in węzła, który spowodował błąd, a do którego można uzyskać dostęp
              za  pomocą  makra  SO_EE_OFFENDER. Pole sin_family adresu SO_EE_OFFENDER ma wartość
              AF_UNSPEC, gdy źródło błędu nie jest znane. Gdy błąd pochodzi  z  sieci,  wszystkie
              opcje  IP (IP_OPTIONS, IP_TTL itd.) włączone w gnieździe i zawarte w pakiecie błędu
              są przekazywane jako komunikaty kontrolne. Właściwe dane pakietu, który  spowodował
              błąd są zwracane jako normalne dane. Należy zauważyć, że TCP nie ma kolejki błędów;
              MSG_ERRQUEUE jest  nielegalne  w  przypadku  gniazd  SOCK_STREAM.  IP_RECVERR  jest
              poprawne  dla  TCP,  ale  wszystkie  błędy  są  przekazywane przez zwracaną wartość
              funkcji albo przez SO_ERROR.

              For raw sockets, IP_RECVERR enables passing of all  received  ICMP  errors  to  the
              application, otherwise errors are reported only on connected sockets

              Ustawia  lub  pobiera  znacznik  logiczny  zapisany  za  pomocą  liczby całkowitej.
              IP_RECVERR jest domyślnie wyłączone.

       IP_RECVOPTS (od Linuksa 2.2)
              Przekazuje użytkownikowi wszystkie nadchodzące opcje IP  z  komunikatu  sterującego
              IP_OPTIONS.  Nagłówek  wyboru  trasy  i  inne  opcje  są  już  wstępnie  wypełnione
              informacjami  o  lokalnej  maszynie.  Nieobsługiwane  w   przypadku   gniazd   typu
              SOCK_STREAM.

       IP_RECVORIGDSTADDR (od Linuksa 2.6.29)
              Ta opcja logiczna włącza komunikat pomocniczy IP_ORIGDSTADDR w recvmsg(2), w którym
              jądro  zwraca  oryginalny  adres  docelowy  otrzymywanego  właśnie  datagramu.  Ten
              komunikat pomocniczy  zawiera strukturę struct sockaddr_in.

       IP_RECVTOS (od Linuksa 2.2)
              Jeśli  jest  ustawione,  to  pomocniczy komunikat IP_TOS jest przepuszczany razem z
              nadchodzącymi pakietami. Zawiera on bajt, który  określa  pole  zdefiniowane  także
              jako  bajt  znajdujące  się  w  nagłówku pakietu, a zwane Typ Usługi/Pierwszeństwa.
              Wymaga logicznego znacznika w postaci liczby całkowitej.

       IP_RECVTTL (od Linuksa 2.2)
              When this flag is set, pass a IP_TTL control message with the time-to-live field of
              the received packet as a 32 bit integer.  Not supported for SOCK_STREAM sockets.

       IP_RETOPTS (od Linuksa 2.2)
              Działanie  identyczne  do  IP_RECVOPTS,  ale  zwraca surowe, nieprzetworzone opcje,
              włącznie z rekordem opcji, mówiącym o znaczniku czasowym i  trasie,  niewypełnionym
              wartościami w tym przejściu pakietu.

       IP_ROUTER_ALERT (od Linuksa 2.2)
              Pass  all  to-be  forwarded  packets  with  the  IP Router Alert option set to this
              socket.  Valid only for raw sockets.  This is useful, for instance, for  user-space
              RSVP daemons.  The tapped packets are not forwarded by the kernel; it is the user's
              responsibility to send them out again.  Socket binding is ignored, such packets are
              filtered only by protocol.  Expects an integer flag.

       IP_TOS (od Linuksa 1.0)
              Ustawia  lub  pobiera  pole  znacznika  Typ-Usługi (ang. Type-Of-Service, w skrócie
              TOS), które jest przesyłane z każdym pakietem  IP  pochodzącym  z  danego  gniazda.
              Służy  do  ustalenia  priorytetów  pakietów w sieci. TOS jest bajtem. Oto definicje
              niektórych standardowych znaczników TOS: IPTOS_LOWDELAY - minimalizacja  opóźnienia
              we  wzajemnym  ruchu, IPTOS_THROUGHPUT - optymalizacja wyjścia, IPTOS_RELIABILITY -
              optymalizacja pod kątem niezawodności, a IPTOS_MINCOST  powinna  być  używana  jako
              "dane  wypełniające"  tam,  gdzie  szybkość  transmisji nie ma większego znaczenia.
              Można podać najwyżej jedną z powyższych wartości TOS. Inne bity  są  niepoprawne  i
              powinny  być  wyzerowane.  Linux domyślnie wysyła najpierw datagram IPTOS_LOWDELAY,
              ale dokładne zachowanie zależy od konfiguracji właściwości  szeregowania.  Niektóre
              poziomy  o  wysokim  priorytecie mogą wymagać uprawnień administratora (ustawionego
              atrybutu CAP_NET_ADMIN).

       IP_TRANSPARENT (od Linuksa 2.6.24)
              Ustawienie tej opcji logicznej włącza przezroczyste (ang. "transparent") proxy  dla
              tego gniazda. Ta opcja gniazda pozwala wywołującej aplikacji przypisanie gniazda do
              nielokalnego adresu IP i operowanie jako zarówno klient, jak i serwer z zewnętrznym
              adresem  IP  dla  lokalnego  punktu docelowego. UWAGA: wymaga to takiego ustawienia
              reguł routingu, żeby pakiety wysyłane na ten  adres  zewnętrzny  były  przekazywane
              przez  TProxy  (tj.  system  na  którym  działa  aplikacja korzysta z opcji gniazda
              IP_TRANSPARENT). Włączenie tej opcji wymaga  uprawnień  administratora  (właściwość
              CAP_NET_ADMIN).

              Przekierowanie  TProxy używające celu TPROXY z iptables(8) także wymagają włączenia
              tej opcji w przekierowywanym gnieździe.

       IP_TTL (od Linuksa 1.0)
              Ustawia lub pobiera pole "czas  życia"  (ang.  Time-To-Live,  w  skrócie  TTL)  dla
              każdego wychodzącego z danego gniazda pakietu IP.

       IP_UNBLOCK_SOURCE (od Linuksa 2.4.22 / 2.5.68)
              Odblokowuje  zablokowaną  uprzednio  grupę adresów. Zwraca EADDRNOTAVAIL gdy podane
              źródło nie było zablokowane.

              Argumentem   jest   struktura   ip_mreq_source   opisana   w   części    dotyczącej
              IP_ADD_SOURCE_MEMBERSHIP.

       SO_PEERSEC (since Linux 2.6.17)
              If labeled IPSEC or NetLabel is configured on both the sending and receiving hosts,
              this read-only socket option returns  the  security  context  of  the  peer  socket
              connected  to  this  socket.   By  default,  this  will be the same as the security
              context of the process that created the peer socket unless overridden by the policy
              or by a process with the required permissions.

              The  argument to getsockopt(2)  is a pointer to a buffer of the specified length in
              bytes into which the security context string will be copied.  If the buffer  length
              is less than the length of the security context string, then getsockopt(2)  returns
              -1, sets errno to ERANGE, and returns the required length via optlen.   The  caller
              should  allocate at least NAME_MAX bytes for the buffer initially, although this is
              not guaranteed to be sufficient.  Resizing the buffer to the  returned  length  and
              retrying may be necessary.

              The  security  context  string  may  include  a  terminating  null character in the
              returned length, but is not guaranteed to do so: a security context "foo" might  be
              represented  as either {'f','o','o'} of length 3 or {'f','o','o','\0'} of length 4,
              which are considered to be interchangeable.  The  string  is  printable,  does  not
              contain  non-terminating  null  characters,  and  is in an unspecified encoding (in
              particular, it is not guaranteed to be ASCII or UTF-8).

              The use of this option for sockets in the AF_INET address family is supported since
              Linux 2.6.17 for TCP sockets, and since Linux 4.17 for SCTP sockets.

              For  SELinux,  NetLabel conveys only the MLS portion of the security context of the
              peer across the wire, defaulting the rest of the security  context  to  the  values
              defined  in  the policy for the netmsg initial security identifier (SID).  However,
              NetLabel can be configured to pass full security contexts over  loopback.   Labeled
              IPSEC  always  passes  full  security contexts as part of establishing the security
              association (SA) and looks them up based on the association for each packet.

   Interfejsy /proc
       Protokół IP obsługuje zbiór interfejsów /proc i korzysta z niech do ustawiania  niektórych
       parametrów  globalnych.  Parametry  są  dostępne  przez zapis lub odczyt plików z katalogu
       /proc/sys/net/ipv4/. Interfejsy opisane jako logiczne pobierają liczbę  całkowitą,  której
       wartość  niezerowa  ("prawda")  oznacza,  że  dana  opcja jest włączona, a zero ("fałsz"),
       oznacza, że opcja jest wyłączona.

       ip_always_defrag (logiczna; od Linuksa 2.2.13)
              [Nowa w jądrze 2.2.13; we wcześniejszych wersjach jądra funkcją tą sterowało się  w
              czasie  kompilacji  za  pomocą  opcji  CONFIG_IP_ALWAYS_DEFRAG,  która nie jest już
              obecna w 2.4.x i kolejnych]

              Gdy ten znacznik logiczny  jest  włączony  (różny  od  0),  przychodzące  fragmenty
              (części  pakietów  IP, które się pojawiają, gdy pewien komputer pomiędzy komputerem
              źródłowym a docelowym zdecyduje, że pakiety były za duże i podzieli je na  kawałki)
              będą ponownie złożone (zdefragmentowane) przed ich przetworzeniem, nawet jeśli mają
              być przekazane dalej (and. forwarded).

              Enable only if running either a firewall that is the sole link to your network or a
              transparent  proxy;  never  ever  use  it  for a normal router or host.  Otherwise,
              fragmented communication can be disturbed if the fragments  travel  over  different
              links.  Defragmentation also has a large memory and CPU time cost.

              Jest   to   włączane   automagicznie,   gdy   skonfigurowane  jest  maskowanie  lub
              przezroczyste proxy.

       ip_autoconfig (od Linuksa 2.2 do 2.6.17)
              Nie udokumentowane.

       ip_default_ttl (liczba, domyślnie: 64; od Linuksa 2.2)
              Ustawia domyślną wartość "czasu życia" (ang. time-to-live)  wychodzących  pakietów.
              Może być ona zmieniona dla gniazda za pomocą opcji IP_TTL.

       ip_dynaddr (logiczna; domyślnie: wyłączona; od Linuksa 2.0.31)
              Włącza dynamiczne adresowanie gniazda oraz przepisywanie adresu dla maskowania przy
              zmianie adresu interfejsu. Jest to  bardzo  przydatne  w  przypadku  korzystania  z
              interfejsu  sprzęgniętego z linią telefoniczną, którego adres IP może się zmieniać.
              0 oznacza brak przepisywania, 1 włącza przepisywanie, a  2  włącza  tryb  rozwlekły
              (ang. verbose).

       ip_forward(logiczna; domyślnie: wyłączona; od Linuksa 1.2)
              Włącza  przekazywanie  (ang. forwarding) pakietów przy użyciu logicznego znacznika.
              Może być ustawione także na podstawie interfejsu.

       ip_local_port_range (od Linuksa 2.2)
              Plik zawierający dwa liczby całkowite określające domyślny zakres lokalnych  portów
              przypisanych  do  gniazd  niebędących  bezpośrednio  przydzielonych  do portu - tj.
              zakres  ten  jest  używany   do   portów   efemerycznych   (portów   przypisywanych
              dynamicznie).  Port  efemeryczny  jest  przydzielany  do  gniazda  w  następujących
              sytuacjach:

              *  numer portu w adresie gniazda  jest  określony  jako  0  w  trakcie  wywoływania
                 bind(2);

              *  listen(2)  jest wywoływane na gnieździe strumieniowych, które nie było wcześniej
                 przydzielone;

              *  connect(2) była wywołana na gnieździe, które nie było wcześniej przydzielone;

              *  sendto(2) jest wywoływane na gnieździe datagramowym, które  nie  było  wcześniej
                 przydzielone.

              Przypisywanie   portów   efemerycznych   rozpoczyna  się  od  pierwszego  numeru  w
              ip_local_port_range i kończy się na drugim  numerze.  Jeśli  wyczerpie  się  zakres
              portów  efemerycznych,  to  odpowiednie wywołanie systemowe zwróci błąd (ale proszę
              sprawdzić rozdział BŁĘDY!).

              Proszę zauważyć, że zakres portów w ip_local_port_range nie powinien pokrywać się z
              zakresem   portów   wykorzystywanym  do  maskowania  (chociaż  taka  sytuacja  jest
              obsługiwana). Dowolny wybór może również powodować problemy z  niektórymi  zaporami
              sieciowymi,  które  robią  pewne  założenia  odnośnie do portów używanych lokalnie.
              Pierwsza liczba powinna być większa niż 1024, albo - co byłoby lepsze - większa niż
              4096,  aby  uniknąć konfliktów z dobrze znanymi portami i zminimalizować problemy z
              zaporami sieciowymi.

       ip_no_pmtu_disc (logiczna; domyślnie: wyłączona; od Linuksa 2.2)
              Jeśli jest to włączone, to domyślnie nie będzie wykonywane badanie MTU ścieżki  dla
              gniazd  TCP.  Badanie  MTU  może się nie sprawdzać w przypadku źle skonfigurowanych
              firewalli  (odrzucających  wszelkie  pakiety   ICMP)   lub   źle   skonfigurowanych
              interfejsów  (np.  połączenie typu point-to-point, gdzie oba końce nie zgadzają się
              na MTU). Lepiej poprawić wszelkie wadliwie  skonfigurowane  rutery  po  drodze  niż
              całkowicie  wyłączyć  badanie  MTU  ścieżki,  ponieważ  niewykonywanie tej operacji
              pociąga za sobą duże straty w obrębie sieci.

       ip_nonlocal_bind (logiczna; domyślnie: wyłączona; od Linuksa 2.4)
              Jeżeli ustawione, pozwala procesowi  na  wywołanie  funkcji  bind()  z  nielokalnym
              adresem IP, co może być całkiem przydatne, ale może popsuć niektóre aplikacje.

       ip6frag_time (liczba; domyślnie: 30)
              Czas w sekundach przetrzymywania w pamięci fragmentu IPv6.

       ip6frag_secret_interval (liczba; domyślnie: 600)
              Interwał  (w  sekundach)  odświeżania  sekretnego  klucza funkcji mieszkającej (lub
              czasu życia tego klucza) dla fragmentów IPv6.

       ipfrag_high_thresh (liczba), ipfrag_low_thresh (liczba)
              Jeśli liczba zebranych w kolejce fragmentów IP  osiągnie  wartość  określoną  przez
              ipfrag_high_thresh,   wtedy   kolejka   jest  opróżniana  do  ilości  określonej  w
              ipfrag_low_thresh. Zawiera ona liczbę całkowitą z podaną liczbą bajtów.

       neigh/*
              Patrz arp(7).

   Kontrolki systemowe (ioctl)
       Do protokołu ip mają zastosowanie wszystkie kontrolki wejścia/wyjścia opisane w socket(7).

       Kontrolki konfigurowania ogólnych parametrów urządzenia są opisane w netdevice(7).

BŁĘDY

       EACCES Użytkownik próbował wykonać operację, nie  mając  potrzebnych  praw.  Obejmuje  to:
              wysyłanie  pakietu  na adres rozgłoszeniowy bez ustawionego znacznika SO_BROADCAST,
              wysyłanie pakietu zakazaną drogą, próbę modyfikacji ustawień firewalla,  nie  mając
              uprawnień  administratora  (ustawionego znacznika CAP_NET_ADMIN), próbę przypisania
              uprzywilejowanego portu, nie mając uprawnień administratora (ustawionego  znacznika
              CAP_NET_BIND_SERVICE).

       EADDRINUSE
              Próbowano przypisać port do adresu będącego już w użyciu.

       EADDRNOTAVAIL
              Zażądano  nieistniejącego  interfejsu  lub  żądany  adres źródłowy nie jest adresem
              lokalnym.

       EAGAIN Operacja na gnieździe z wyłączonym blokowaniem spowodowałaby zablokowanie.

       EALREADY
              A connection operation on a nonblocking socket is already in progress.

       ECONNABORTED
              Połączenie zostało zamknięte podczas accept(2).

       EHOSTUNREACH
              No valid routing table entry matches the destination address.  This  error  can  be
              caused by an ICMP message from a remote router or for the local routing table.

       EINVAL Przypisano  niewłaściwy  argument.  W  przypadku  operacji  wysyłania  może  to być
              spowodowane przez wysyłanie drogą przypisaną do czarnej dziury.

       EISCONN
              connect(2) była wywołana na już połączonym gnieździe.

       EMSGSIZE
              Datagram jest większy niż wartość MTU po drodze do celu i nie może być podzielony.

       ENOBUFS, ENOMEM
              Niewystarczająca ilość dostępnej  pamięci.  Często  oznacza  to,  że  przydzielanie
              pamięci   jest   ograniczone   przez  ograniczenia  bufora  gniazda,  a  nie  przez
              ograniczenia pamięci systemowej. Jednak nie jest to pewne na 100%.

       ENOENT SIOCGSTAMP było wywołane na gnieździe, do którego nie dotarł żaden pakiet.

       ENOPKG Podsystem jądra nie był konfigurowany.

       ENOPROTOOPT i EOPNOTSUPP
              Przypisano niewłaściwą opcję gniazda.

       ENOTCONN
              Operacja może być wykonana tylko na połączonym gnieździe,  a  gniazdo  nie  zostało
              połączone.

       EPERM  Użytkownik  nie ma praw do ustawiania wysokiego priorytetu, zmiany konfiguracji lub
              wysyłania sygnałów do żądanych procesów lub grup procesów.

       EPIPE  Połączenie zostało nieoczekiwanie zamknięte lub wyłączył się drugi koniec.

       ESOCKTNOSUPPORT
              Gniazdo nie jest skonfigurowane lub zażądano nieznanego typu gniazda.

       Inne błędy mogą być generowane przez protokoły wyższych warstw; obejrzyj  tcp(7),  raw(7),
       udp(7) i socket(7).

UWAGI

       IP_FREEBIND,   IP_MSFILTER,   IP_MTU,   IP_MTU_DISCOVER,  IP_RECVORIGDSTADDR,  IP_PASSSEC,
       IP_PKTINFO, IP_RECVERR, IP_ROUTER_ALERT, and IP_TRANSPARENT are Linux-specific.

       Należy być bardzo ostrożnym przy stosowaniu opcji SO_BROADCAST - nie jest ona  w  systemie
       Linux  uprzywilejowana,  jest  więc  łatwo  przeciążyć  sieć  za  pomocą  niedbale użytych
       rozgłoszeń. W przypadku protokołów nowych aplikacji lepiej używać grupy adresowej  zamiast
       rozgłoszeń. Stosowanie adresów rozgłoszeniowych jest niezalecane.

       Niektóre  inne  implementacje  gniazd  BSD  dopuszczają  dla  gniazd opcje IP_RCVDSTADDR i
       IP_RECVIF używane do pobierania adresu przeznaczenia i interfejsu odbieranych  datagramów.
       Linux udostępnia bardziej ogólną opcję IP_PKTINFO, robiącą to samo.

       Niektóre  implementacja  gniazd  BSD  także  udostępniają  opcję IP_RECVTTL, ale łącznie z
       przychodzącym pakietem jest przekazywany pomocniczy komunikat o typie  IP_RECVTTL.  W  tym
       właśnie różni się to od opcji IP_TTL, używanej w Linuksie.

       Using  the SOL_IP socket options level isn't portable; BSD-based stacks use the IPPROTO_IP
       level.

       INADDR_ANY (0.0.0.0) and INADDR_BROADCAST (255.255.255.255) are byte-order-neutral.
        This means htonl(3) has no effect on them.

   Zgodność
       Dla  zgodności  z  Linuksem   2.0,   wciąż   jest   dopuszczalna   przestarzała   składnia
       socket(AF_INET,  SOCK_PACKET,  protokół),  by stworzyć gniazdo typu packet(7). Nie jest to
       zbyt poprawne i powinno  być  zastępowane  przez  socket(AF_PACKET,  SOCK_RAW,  protokół).
       Głównym  powodem jest różnica w strukturze adresowej sockaddr_ll przechowującej informacje
       dla warstwy łącza (dokładniej: warstwy  kanałowej),  które  kiedyś  przechowywane  były  w
       sockaddr_pkt.

BŁĘDY

       Jest zbyt wiele nieokreślonych wartości błędów.

       Błąd  używany  do  zdiagnozowania  wyczerpania  się zakresu portów efemerycznych różni się
       między poszczególnymi wywołaniami systemowymi (connect(2), bind(2), listen(2), sendto(2)),
       które przypisują porty efemeryczne.

       Nie  są  opisane  kontrolki  wejścia/wyjścia  do konfigurowania specyficznych dla IP opcji
       interfejsu i tabele ARP.

       Pobieranie pierwotnego adresu docelowego za pomocą wywołania recvmsg(2) z  MSG_ERRQUEUE  w
       msg_name nie działa w niektórych jądrach 2.2.

ZOBACZ TAKŻE

       recvmsg(2),  sendmsg(2),  byteorder(3),  capabilities(7),  icmp(7), ipv6(7), netdevice(7),
       netlink(7), raw(7), socket(7), tcp(7), udp(7), ip(8)

       The kernel source file Documentation/networking/ip-sysctl.txt.

       RFC 791 - oryginalny opis IP. RFC 1122 -  wymagania  stacji  IPv4.  RFC 1812  -  wymagania
       rutera IPv4.

O STRONIE

       Angielska  wersja  tej  strony  pochodzi  z  wydania  5.13  projektu Linux man-pages. Opis
       projektu, informacje dotyczące zgłaszania błędów oraz  najnowszą  wersję  oryginału  można
       znaleźć pod adresem https://www.kernel.org/doc/man-pages/.

TŁUMACZENIE

       Autorami   polskiego   tłumaczenia   niniejszej   strony   podręcznika   są:   Paweł  Wilk
       <siefca@pl.qmail.org>,   Robert    Luberda    <robert@debian.org>    i    Michał    Kułach
       <michal.kulach@gmail.com>

       Niniejsze  tłumaczenie  jest  wolną  dokumentacją. Bliższe informacje o warunkach licencji
       można   uzyskać   zapoznając   się   z   GNU   General   Public   License   w   wersji   3
       ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩   lub   nowszej.   Nie  przyjmuje  się  ŻADNEJ
       ODPOWIEDZIALNOŚCI.

       Błędy w tłumaczeniu  strony  podręcznika  prosimy  zgłaszać  na  adres  listy  dyskusyjnej
       ⟨manpages-pl-list@lists.sourceforge.net⟩.