1 IP(7P) Protocols IP(7P) 2 3 4 5 NAME 6 ip, IP - Internet Protocol 7 8 SYNOPSIS 9 #include <sys/socket.h> 10 11 12 #include <netinet/in.h> 13 14 15 s = socket(AF_INET, SOCK_RAW, proto); 16 17 18 t = t_open ("/dev/rawip", O_RDWR); 19 20 21 DESCRIPTION 22 IP is the internetwork datagram delivery protocol that is central to 23 the Internet protocol family. Programs may use IP through higher-level 24 protocols such as the Transmission Control Protocol (TCP) or the User 25 Datagram Protocol (UDP), or may interface directly to IP. See tcp(7P) 26 and udp(7P). Direct access may be by means of the socket interface, 27 using a "raw socket," or by means of the Transport Level Interface 28 (TLI). The protocol options defined in the IP specification may be set 29 in outgoing datagrams. 30 31 32 Packets sent to or from this system may be subject to IPsec policy. See 33 ipsec(7P) for more information. 34 35 APPLICATION PROGRAMMING INTERFACE 36 The STREAMS driver /dev/rawip is the TLI transport provider that 37 provides raw access to IP. 38 39 40 Raw IP sockets are connectionless and are normally used with the 41 sendto() and recvfrom() calls (see send(3SOCKET) and recv(3SOCKET)), 42 although the connect(3SOCKET) call may also be used to fix the 43 destination for future datagram. In this case, the read(2) or 44 recv(3SOCKET) and write(2) or send(3SOCKET) calls may be used. If proto 45 is IPPROTO_RAW or IPPROTO_IGMP, the application is expected to include 46 a complete IP header when sending. Otherwise, that protocol number 47 will be set in outgoing datagrams and used to filter incoming datagrams 48 and an IP header will be generated and prepended to each outgoing 49 datagram. In either case, received datagrams are returned with the IP 50 header and options intact. 51 52 53 If an application uses IP_HDRINCL and provides the IP header contents, 54 the IP stack does not modify the following supplied fields under any 55 conditions: Type of Service, DF Flag, Protocol, and Destination 56 Address. The IP Options and IHL fields are set by use of IP_OPTIONS, 57 and Total Length is updated to include any options. Version is set to 58 the default. Identification is chosen by the normal IP ID selection 59 logic. The source address is updated if none was specified and the TTL 60 is changed if the packet has a broadcast destination address. Since an 61 applicaton cannot send down fragments (as IP assigns the IP ID), 62 Fragment Offset is always 0. The IP Checksum field is computed by IP. 63 None of the data beyond the IP header are changed, including the 64 application-provided transport header. 65 66 67 The socket options supported at the IP level are: 68 69 IP_OPTIONS 70 IP options for outgoing datagrams. This socket 71 option may be used to set IP options to be 72 included in each outgoing datagram. IP options to 73 be sent are set with setsockopt() (see 74 getsockopt(3SOCKET)). The getsockopt(3SOCKET) 75 call returns the IP options set in the last 76 setsockopt() call. IP options on received 77 datagrams are visible to user programs only using 78 raw IP sockets. The format of IP options given in 79 setsockopt() matches those defined in the IP 80 specification with one exception: the list of 81 addresses for the source routing options must 82 include the first-hop gateway at the beginning of 83 the list of gateways. The first-hop gateway 84 address will be extracted from the option list 85 and the size adjusted accordingly before use. IP 86 options may be used with any socket type in the 87 Internet family. 88 89 90 IP_SEC_OPT 91 Enable or obtain IPsec security settings for this 92 socket. For more details on the protection 93 services of IPsec, see ipsec(7P). 94 95 96 IP_ADD_MEMBERSHIP 97 Join a multicast group. 98 99 100 IP_DROP_MEMBERSHIP 101 Leave a multicast group. 102 103 104 IP_BOUND_IF 105 Limit reception and transmission of packets to 106 this interface. Takes an integer as an argument. 107 The integer is the selected interface index. 108 109 110 111 The following option takes in_pktinfo_t as the parameter: 112 113 IP_PKTINFO 114 115 Set the source address and/or transmit interface of the packet(s). 116 Note that the IP_BOUND_IF socket option takes precedence over the 117 interface index passed in IP_PKTINFO. 118 119 struct in_pktinfo { 120 unsigned int ipi_ifindex;/* send/recv interface index */ 121 struct in_addr ipi_spec_dst;/* matched source addr. */ 122 struct in_addr ipi_addr;/* src/dst addr. in IP hdr */ 123 } in_pktinfo_t; 124 125 When passed in (on transmit) via ancillary data with IP_PKTINFO, 126 ipi_spec_dst is used as the source address and ipi_ifindex is used 127 as the interface index to send the packet out. 128 129 130 131 The following options are boolean switches controlling the reception of 132 ancillary data: 133 134 135 IP_RECVDSTADDR 136 When enabled on a SOCK_DGRAM socket, enables 137 receipt of the destination IP address of the 138 incoming packet. Returns inaddr_t as ancillary 139 data. 140 141 142 IP_RECVIF 143 Enable/disable receipt of the inbound interface 144 index. Returns uint_t as ancillary data. 145 146 147 IP_RECVOPTS 148 When enabled on a SOCK_DGRAM socket, enables 149 receipt of the IP options from the incoming 150 packet. Returns variable-length IP options, up to 151 40 bytes, as ancillary data. 152 153 154 IP_RECVPKTINFO 155 Enable/disable receipt of the index of the 156 interface the packet arrived on, the local 157 address that was matched for reception, and the 158 inbound packet's actual destination address. 159 Takes boolean as the parameter. Returns 160 in_pktinfo_t as ancillary data. 161 162 163 IP_RECVSLLA 164 When enabled on a SOCK_DGRAM socket, enables 165 receipt of the source link-layer address for the 166 incoming packet. Returns struct sockaddr_dl as 167 ancillary data. 168 169 170 IP_RECVTTL 171 When enabled on a SOCK_DGRAM socket, the IP TTL 172 (time to live) field for an incoming datagram is 173 returned as uint8_t in ancillary data. 174 175 176 IP_RECVTOS 177 When enabled, the IP TOS (type of service) field 178 is returned as uint8_t in ancillary data. For 179 SOCK_DGRAM sockets, the ancillary data item is 180 included for every call to recvmsg(). For 181 SOCK_STREAM sockets, where there is no direct 182 mapping between received TCP segments and receive 183 operations, the ancillary data item will only be 184 present when the value has changed. 185 186 187 188 The following options take a struct ip_mreq as the parameter. The 189 structure contains a multicast address which must be set to the CLASS-D 190 IP multicast address and an interface address. Normally the interface 191 address is set to INADDR_ANY which causes the kernel to choose the 192 interface on which to join. 193 194 IP_BLOCK_SOURCE 195 Block multicast packets whose source 196 address matches the given source address. 197 The specified group must be joined 198 previously using IP_ADD_MEMBERSHIP or 199 MCAST_JOIN_GROUP. 200 201 202 IP_UNBLOCK_SOURCE 203 Unblock (begin receiving) multicast 204 packets which were previously blocked 205 using IP_BLOCK_SOURCE. 206 207 208 IP_ADD_SOURCE_MEMBERSHIP 209 Begin receiving packets for the given 210 multicast group whose source address 211 matches the specified address. 212 213 214 IP_DROP_SOURCE_MEMBERSHIP 215 Stop receiving packets for the given 216 multicast group whose source address 217 matches the specified address. 218 219 220 221 The following options take a struct ip_mreq_source as the parameter. 222 The structure contains a multicast address (which must be set to the 223 CLASS-D IP multicast address), an interface address, and a source 224 address. 225 226 MCAST_JOIN_GROUP 227 Join a multicast group. Functionally 228 equivalent to IP_ADD_MEMBERSHIP. 229 230 231 MCAST_BLOCK_SOURCE 232 Block multicast packets whose source 233 address matches the given source address. 234 The specified group must be joined 235 previously using IP_ADD_MEMBERSHIP or 236 MCAST_JOIN_GROUP. 237 238 239 MCAST_UNBLOCK_SOURCE 240 Unblock (begin receiving) multicast packets 241 which were previously blocked using 242 MCAST_BLOCK_SOURCE. 243 244 245 MCAST_LEAVE_GROUP 246 Leave a multicast group. Functionally 247 equivalent to IP_DROP_MEMBERSHIP. 248 249 250 MCAST_JOIN_SOURCE_GROUP 251 Begin receiving packets for the given 252 multicast group whose source address 253 matches the specified address. 254 255 256 MCAST_LEAVE_SOURCE_GROUP 257 Stop receiving packets for the given 258 multicast group whose source address 259 matches the specified address. 260 261 262 263 The following options take a struct group_req or struct 264 group_source_req as the parameter. The `group_req structure contains an 265 interface index and a multicast address which must be set to the CLASS- 266 D multicast address. The group_source_req structure is used for those 267 options which include a source address. It contains an interface index, 268 multicast address, and source address. 269 270 IP_MULTICAST_IF 271 The outgoing interface for multicast packets. This 272 option takes a struct in_addr as an argument, and 273 it selects that interface for outgoing IP 274 multicast packets. If the address specified is 275 INADDR_ANY, it uses the unicast routing table to 276 select the outgoing interface (which is the 277 default behavior). 278 279 280 IP_MULTICAST_TTL 281 Time to live for multicast datagrams. This option 282 takes an unsigned character as an argument. Its 283 value is the TTL that IP uses on outgoing 284 multicast datagrams. The default is 1. 285 286 287 IP_MULTICAST_LOOP 288 Loopback for multicast datagrams. Normally 289 multicast datagrams are delivered to members on 290 the sending host (or sending zone). Setting the 291 unsigned character argument to 0 causes the 292 opposite behavior, meaning that when multiple 293 zones are present, the datagrams are delivered to 294 all zones except the sending zone. 295 296 297 IP_TOS 298 This option takes an integer argument as its input 299 value. The least significant 8 bits of the value 300 are used to set the Type Of Service field in the 301 IP header of the outgoing packets. 302 303 304 IP_NEXTHOP 305 This option specifies the address of the onlink 306 nexthop for traffic originating from that socket. 307 It causes the routing table to be bypassed and 308 outgoing traffic is sent directly to the specified 309 nexthop. This option takes an ipaddr_t argument 310 representing the IPv4 address of the nexthop as 311 the input value. The IP_NEXTHOP option takes 312 precedence over IPOPT_LSRR. IP_BOUND_IF and 313 SO_DONTROUTE take precedence over IP_NEXTHOP. This 314 option has no meaning for broadcast and multicast 315 packets. The application must ensure that the 316 specified nexthop is alive. An application may 317 want to specify the IP_NEXTHOP option on a TCP 318 listener socket only for incoming requests to a 319 particular IP address. In this case, it must avoid 320 binding the socket to INADDR_ANY and instead must 321 bind the listener socket to the specific IP 322 address. In addition, typically the application 323 may want the incoming and outgoing interface to be 324 the same. In this case, the application must 325 select a suitable nexthop that is onlink and 326 reachable via the desired interface and do a 327 setsockopt (IP_NEXTHOP) on it. Then it must bind 328 to the IP address of the desired interface. 329 Setting the IP_NEXTHOP option requires the 330 PRIV_SYS_NET_CONFIG privilege. 331 332 333 334 The multicast socket options (IP_MULTICAST_IF, IP_MULTICAST_TTL, 335 IP_MULTICAST_LOOP and IP_RECVIF) can be used with any datagram socket 336 type in the Internet family. 337 338 339 At the socket level, the socket option SO_DONTROUTE may be applied. 340 This option forces datagrams being sent to bypass routing and 341 forwarding by forcing the IP Time To Live field to 1, meaning that the 342 packet will not be forwarded by routers. 343 344 345 Raw IP datagrams can also be sent and received using the TLI 346 connectionless primitives. 347 348 349 Datagrams flow through the IP layer in two directions: from the network 350 up to user processes and from user processes down to the network. 351 Using this orientation, IP is layered above the network interface 352 drivers and below the transport protocols such as UDP and TCP. The 353 Internet Control Message Protocol (ICMP) is logically a part of IP. See 354 icmp(7P). 355 356 357 IP provides for a checksum of the header part, but not the data part, 358 of the datagram. The checksum value is computed and set in the process 359 of sending datagrams and checked when receiving datagrams. 360 361 362 IP options in received datagrams are processed in the IP layer 363 according to the protocol specification. Currently recognized IP 364 options include: security, loose source and record route (LSRR), strict 365 source and record route (SSRR), record route, and internet timestamp. 366 367 368 By default, the IP layer will not forward IPv4 packets that are not 369 addressed to it. This behavior can be overridden by using routeadm(1M) 370 to enable the ipv4-forwarding option. IPv4 forwarding is configured at 371 boot time based on the setting of routeadm(1M)'s ipv4-forwarding 372 option. 373 374 375 For backwards compatibility, IPv4 forwarding can be enabled or disabled 376 using ndd(1M)'s ip_forwarding variable. It is set to 1 if IPv4 377 forwarding is enabled, or 0 if it is disabled. 378 379 380 Additionally, finer-grained forwarding can be configured in IP. Each 381 interface can be configured to forward IP packets by setting the 382 IFF_ROUTER interface flag. This flag can be set and cleared using 383 ifconfig(1M)'s router and router options. If an interface's IFF_ROUTER 384 flag is set, packets can be forwarded to or from the interface. If it 385 is clear, packets will neither be forwarded from this interface to 386 others, nor forwarded to this interface. Setting the ip_forwarding 387 variable sets all of the IPv4 interfaces' IFF_ROUTER flags. 388 389 390 For backwards compatibility, each interface creates an 391 <ifname>:ip_forwarding /dev/ip variable that can be modified using 392 ndd(1M). An interface's :ip_forwarding ndd variable is a boolean 393 variable that mirrors the status of its IFF_ROUTER interface flag. It 394 is set to 1 if the flag is set, or 0 if it is clear. This interface 395 specific <ifname> :ip_forwarding ndd variable is obsolete and may be 396 removed in a future release of Solaris. The ifconfig(1M) router and 397 -router interfaces are preferred. 398 399 400 The IP layer sends an ICMP message back to the source host in many 401 cases when it receives a datagram that can not be handled. A "time 402 exceeded" ICMP message is sent if the "time to live" field in the IP 403 header drops to zero in the process of forwarding a datagram. A 404 "destination unreachable" message is sent if a datagram can not be 405 forwarded because there is no route to the final destination, or if it 406 can not be fragmented. If the datagram is addressed to the local host 407 but is destined for a protocol that is not supported or a port that is 408 not in use, a destination unreachable message is also sent. The IP 409 layer may send an ICMP "source quench" message if it is receiving 410 datagrams too quickly. ICMP messages are only sent for the first 411 fragment of a fragmented datagram and are never returned in response to 412 errors in other ICMP messages. 413 414 415 The IP layer supports fragmentation and reassembly. Datagrams are 416 fragmented on output if the datagram is larger than the maximum 417 transmission unit (MTU) of the network interface. Fragments of received 418 datagrams are dropped from the reassembly queues if the complete 419 datagram is not reconstructed within a short time period. 420 421 422 Errors in sending discovered at the network interface driver layer are 423 passed by IP back up to the user process. 424 425 426 Multi-Data Transmit allows more than one packet to be sent from the IP 427 module to another in a given call, thereby reducing the per-packet 428 processing costs. The behavior of Multi-Data Transmit can be 429 overrideen by using ndd(1M) to set the /dev/ip variable, 430 ip_multidata_outbound to 0. Note, the IP module will only initiate 431 Multi-Data Transmit if the network interface driver supports it. 432 433 PACKET EVENTS 434 Through the netinfo framework, this driver provides the following 435 packet events: 436 437 Physical in 438 Packets received on a network interface from an 439 external source. 440 441 442 Physical out 443 Packets to be sent out a network interface. 444 445 446 Forwarding 447 Packets being forwarded through this host to another 448 network. 449 450 451 loopback in 452 Packets that have been sent by a local application to 453 another. 454 455 456 loopback out 457 Packets about to be received by a local application 458 from another. 459 460 461 462 Currently, only a single function may be registered for each event. As 463 a result, if the slot for an event is already occupied by someone else, 464 a second attempt to register a callback fails. 465 466 467 To receive packet events in a kernel module, it is first necessary to 468 obtain a handle for either IPv4 or IPv6 traffic. This is achieved by 469 passing NHF_INET or NHF_INET6 through to a net_protocol_lookup() call. 470 The value returned from this call must then be passed into a call to 471 net_register_hook(), along with a description of the hook to add. For a 472 description of the structure passed through to the callback, please 473 see hook_pkt_event(9S). For IP packets, this structure is filled out as 474 follows: 475 476 hpe_ifp 477 Identifier indicating the inbound interface for packets 478 received with the "physical in" event. 479 480 481 hpe_ofp 482 Identifier indicating the outbound interface for packets 483 received with the "physical out" event. 484 485 486 hpe_hdr 487 Pointer to the start of the IP header (not the ethernet 488 header). 489 490 491 hpe_mp 492 Pointer to the start of the mblk_t chain containing the IP 493 packet. 494 495 496 hpe_mb 497 Pointer to the mblk_t with the IP header in it. 498 499 500 NETWORK INTERFACE EVENTS 501 In addition to events describing packets as they move through the 502 system, it is also possible to receive notification of events relating 503 to network interfaces. These events are all reported back through the 504 same callback. The list of events is as follows: 505 506 plumb 507 A new network interface has been instantiated. 508 509 510 unplumb 511 A network interface is no longer associated with this 512 protocol. 513 514 515 up 516 At least one logical interface is now ready to 517 receive packets. 518 519 520 down 521 There are no logical interfaces expecting to receive 522 packets. 523 524 525 address change 526 An address has changed on a logical interface. 527 528 529 SEE ALSO 530 ifconfig(1M), routeadm(1M), ndd(1M), read(2), write(2), 531 socket.h(3HEAD), bind(3SOCKET), connect(3SOCKET), getsockopt(3SOCKET), 532 recv(3SOCKET), send(3SOCKET), defaultrouter(4), icmp(7P), if_tcp(7P), 533 inet(7P), ip(7P), ip6(7P), ipsec(7P), routing(7P), tcp(7P), udp(7P), 534 net_hook_register(9F), hook_pkt_event(9S) 535 536 537 Braden, R., RFC 1122, Requirements for Internet Hosts - Communication 538 Layers, Information Sciences Institute, University of Southern 539 California, October 1989. 540 541 542 Postel, J., RFC 791, Internet Protocol - DARPA Internet Program 543 Protocol Specification, Information Sciences Institute, University of 544 Southern California, September 1981. 545 546 DIAGNOSTICS 547 A socket operation may fail with one of the following errors returned: 548 549 EACCES 550 A bind() operation was attempted with a "reserved" 551 port number and the effective user ID of the process 552 was not the privileged user. 553 554 Setting the IP_NEXTHOP was attempted by a process 555 lacking the PRIV_SYS_NET_CONFIG privilege. 556 557 558 EADDRINUSE 559 A bind() operation was attempted on a socket with a 560 network address/port pair that has already been bound 561 to another socket. 562 563 564 EADDRNOTAVAIL 565 A bind() operation was attempted for an address that 566 is not configured on this machine. 567 568 569 EINVAL 570 A sendmsg() operation with a non-NULL msg_accrights 571 was attempted. 572 573 574 EINVAL 575 A getsockopt() or setsockopt() operation with an 576 unknown socket option name was given. 577 578 579 EINVAL 580 A getsockopt() or setsockopt() operation was attempted 581 with the IP option field improperly formed; an option 582 field was shorter than the minimum value or longer 583 than the option buffer provided. 584 585 586 EISCONN 587 A connect() operation was attempted on a socket on 588 which a connect() operation had already been 589 performed, and the socket could not be successfully 590 disconnected before making the new connection. 591 592 593 EISCONN 594 A sendto() or sendmsg() operation specifying an 595 address to which the message should be sent was 596 attempted on a socket on which a connect() operation 597 had already been performed. 598 599 600 EMSGSIZE 601 A send(), sendto(), or sendmsg() operation was 602 attempted to send a datagram that was too large for an 603 interface, but was not allowed to be fragmented (such 604 as broadcasts). 605 606 607 ENETUNREACH 608 An attempt was made to establish a connection by means 609 of connect(), or to send a datagram by means of 610 sendto() or sendmsg(), where there was no matching 611 entry in the routing table; or if an ICMP "destination 612 unreachable" message was received. 613 614 615 ENOTCONN 616 A send() or write() operation, or a sendto() or 617 sendmsg() operation not specifying an address to which 618 the message should be sent, was attempted on a socket 619 on which a connect() operation had not already been 620 performed. 621 622 623 ENOBUFS 624 The system ran out of memory for fragmentation buffers 625 or other internal data structures. 626 627 628 ENOBUFS 629 SO_SNDBUF or SO_RCVBUF exceeds a system limit. 630 631 632 EINVAL 633 Invalid length for IP_OPTIONS. 634 635 636 EHOSTUNREACH 637 Invalid address for IP_MULTICAST_IF. 638 639 Invalid (offlink) nexthop address for IP_NEXTHOP. 640 641 642 EINVAL 643 Not a multicast address for IP_ADD_MEMBERSHIP and 644 IP_DROP_MEMBERSHIP. 645 646 647 EADDRNOTAVAIL 648 Bad interface address for IP_ADD_MEMBERSHIP and 649 IP_DROP_MEMBERSHIP. 650 651 652 EADDRINUSE 653 Address already joined for IP_ADD_MEMBERSHIP. 654 655 656 ENOENT 657 Address not joined for IP_DROP_MEMBERSHIP. 658 659 660 ENOPROTOOPT 661 Invalid socket type. 662 663 664 EPERM 665 No permissions. 666 667 668 NOTES 669 Raw sockets should receive ICMP error packets relating to the protocol; 670 currently such packets are simply discarded. 671 672 673 Users of higher-level protocols such as TCP and UDP should be able to 674 see received IP options. 675 676 677 678 September 18, 2020 IP(7P)