1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * INET An implementation of the TCP/IP protocol suite for the LINUX 4*4882a593Smuzhiyun * operating system. INET is implemented using the BSD Socket 5*4882a593Smuzhiyun * interface as the means of communication with the user level. 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * Definitions of the Internet Protocol. 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * Version: @(#)in.h 1.0.1 04/21/93 10*4882a593Smuzhiyun * 11*4882a593Smuzhiyun * Authors: Original taken from the GNU Project <netinet/in.h> file. 12*4882a593Smuzhiyun * Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG> 13*4882a593Smuzhiyun * 14*4882a593Smuzhiyun * This program is free software; you can redistribute it and/or 15*4882a593Smuzhiyun * modify it under the terms of the GNU General Public License 16*4882a593Smuzhiyun * as published by the Free Software Foundation; either version 17*4882a593Smuzhiyun * 2 of the License, or (at your option) any later version. 18*4882a593Smuzhiyun */ 19*4882a593Smuzhiyun #ifndef _UAPI_LINUX_IN_H 20*4882a593Smuzhiyun #define _UAPI_LINUX_IN_H 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun #include <linux/types.h> 23*4882a593Smuzhiyun #include <linux/libc-compat.h> 24*4882a593Smuzhiyun #include <linux/socket.h> 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun #if __UAPI_DEF_IN_IPPROTO 27*4882a593Smuzhiyun /* Standard well-defined IP protocols. */ 28*4882a593Smuzhiyun enum { 29*4882a593Smuzhiyun IPPROTO_IP = 0, /* Dummy protocol for TCP */ 30*4882a593Smuzhiyun #define IPPROTO_IP IPPROTO_IP 31*4882a593Smuzhiyun IPPROTO_ICMP = 1, /* Internet Control Message Protocol */ 32*4882a593Smuzhiyun #define IPPROTO_ICMP IPPROTO_ICMP 33*4882a593Smuzhiyun IPPROTO_IGMP = 2, /* Internet Group Management Protocol */ 34*4882a593Smuzhiyun #define IPPROTO_IGMP IPPROTO_IGMP 35*4882a593Smuzhiyun IPPROTO_IPIP = 4, /* IPIP tunnels (older KA9Q tunnels use 94) */ 36*4882a593Smuzhiyun #define IPPROTO_IPIP IPPROTO_IPIP 37*4882a593Smuzhiyun IPPROTO_TCP = 6, /* Transmission Control Protocol */ 38*4882a593Smuzhiyun #define IPPROTO_TCP IPPROTO_TCP 39*4882a593Smuzhiyun IPPROTO_EGP = 8, /* Exterior Gateway Protocol */ 40*4882a593Smuzhiyun #define IPPROTO_EGP IPPROTO_EGP 41*4882a593Smuzhiyun IPPROTO_PUP = 12, /* PUP protocol */ 42*4882a593Smuzhiyun #define IPPROTO_PUP IPPROTO_PUP 43*4882a593Smuzhiyun IPPROTO_UDP = 17, /* User Datagram Protocol */ 44*4882a593Smuzhiyun #define IPPROTO_UDP IPPROTO_UDP 45*4882a593Smuzhiyun IPPROTO_IDP = 22, /* XNS IDP protocol */ 46*4882a593Smuzhiyun #define IPPROTO_IDP IPPROTO_IDP 47*4882a593Smuzhiyun IPPROTO_TP = 29, /* SO Transport Protocol Class 4 */ 48*4882a593Smuzhiyun #define IPPROTO_TP IPPROTO_TP 49*4882a593Smuzhiyun IPPROTO_DCCP = 33, /* Datagram Congestion Control Protocol */ 50*4882a593Smuzhiyun #define IPPROTO_DCCP IPPROTO_DCCP 51*4882a593Smuzhiyun IPPROTO_IPV6 = 41, /* IPv6-in-IPv4 tunnelling */ 52*4882a593Smuzhiyun #define IPPROTO_IPV6 IPPROTO_IPV6 53*4882a593Smuzhiyun IPPROTO_RSVP = 46, /* RSVP Protocol */ 54*4882a593Smuzhiyun #define IPPROTO_RSVP IPPROTO_RSVP 55*4882a593Smuzhiyun IPPROTO_GRE = 47, /* Cisco GRE tunnels (rfc 1701,1702) */ 56*4882a593Smuzhiyun #define IPPROTO_GRE IPPROTO_GRE 57*4882a593Smuzhiyun IPPROTO_ESP = 50, /* Encapsulation Security Payload protocol */ 58*4882a593Smuzhiyun #define IPPROTO_ESP IPPROTO_ESP 59*4882a593Smuzhiyun IPPROTO_AH = 51, /* Authentication Header protocol */ 60*4882a593Smuzhiyun #define IPPROTO_AH IPPROTO_AH 61*4882a593Smuzhiyun IPPROTO_MTP = 92, /* Multicast Transport Protocol */ 62*4882a593Smuzhiyun #define IPPROTO_MTP IPPROTO_MTP 63*4882a593Smuzhiyun IPPROTO_BEETPH = 94, /* IP option pseudo header for BEET */ 64*4882a593Smuzhiyun #define IPPROTO_BEETPH IPPROTO_BEETPH 65*4882a593Smuzhiyun IPPROTO_ENCAP = 98, /* Encapsulation Header */ 66*4882a593Smuzhiyun #define IPPROTO_ENCAP IPPROTO_ENCAP 67*4882a593Smuzhiyun IPPROTO_PIM = 103, /* Protocol Independent Multicast */ 68*4882a593Smuzhiyun #define IPPROTO_PIM IPPROTO_PIM 69*4882a593Smuzhiyun IPPROTO_COMP = 108, /* Compression Header Protocol */ 70*4882a593Smuzhiyun #define IPPROTO_COMP IPPROTO_COMP 71*4882a593Smuzhiyun IPPROTO_SCTP = 132, /* Stream Control Transport Protocol */ 72*4882a593Smuzhiyun #define IPPROTO_SCTP IPPROTO_SCTP 73*4882a593Smuzhiyun IPPROTO_UDPLITE = 136, /* UDP-Lite (RFC 3828) */ 74*4882a593Smuzhiyun #define IPPROTO_UDPLITE IPPROTO_UDPLITE 75*4882a593Smuzhiyun IPPROTO_MPLS = 137, /* MPLS in IP (RFC 4023) */ 76*4882a593Smuzhiyun #define IPPROTO_MPLS IPPROTO_MPLS 77*4882a593Smuzhiyun IPPROTO_ETHERNET = 143, /* Ethernet-within-IPv6 Encapsulation */ 78*4882a593Smuzhiyun #define IPPROTO_ETHERNET IPPROTO_ETHERNET 79*4882a593Smuzhiyun IPPROTO_RAW = 255, /* Raw IP packets */ 80*4882a593Smuzhiyun #define IPPROTO_RAW IPPROTO_RAW 81*4882a593Smuzhiyun IPPROTO_MPTCP = 262, /* Multipath TCP connection */ 82*4882a593Smuzhiyun #define IPPROTO_MPTCP IPPROTO_MPTCP 83*4882a593Smuzhiyun IPPROTO_MAX 84*4882a593Smuzhiyun }; 85*4882a593Smuzhiyun #endif 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun #if __UAPI_DEF_IN_ADDR 88*4882a593Smuzhiyun /* Internet address. */ 89*4882a593Smuzhiyun struct in_addr { 90*4882a593Smuzhiyun __be32 s_addr; 91*4882a593Smuzhiyun }; 92*4882a593Smuzhiyun #endif 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun #define IP_TOS 1 95*4882a593Smuzhiyun #define IP_TTL 2 96*4882a593Smuzhiyun #define IP_HDRINCL 3 97*4882a593Smuzhiyun #define IP_OPTIONS 4 98*4882a593Smuzhiyun #define IP_ROUTER_ALERT 5 99*4882a593Smuzhiyun #define IP_RECVOPTS 6 100*4882a593Smuzhiyun #define IP_RETOPTS 7 101*4882a593Smuzhiyun #define IP_PKTINFO 8 102*4882a593Smuzhiyun #define IP_PKTOPTIONS 9 103*4882a593Smuzhiyun #define IP_MTU_DISCOVER 10 104*4882a593Smuzhiyun #define IP_RECVERR 11 105*4882a593Smuzhiyun #define IP_RECVTTL 12 106*4882a593Smuzhiyun #define IP_RECVTOS 13 107*4882a593Smuzhiyun #define IP_MTU 14 108*4882a593Smuzhiyun #define IP_FREEBIND 15 109*4882a593Smuzhiyun #define IP_IPSEC_POLICY 16 110*4882a593Smuzhiyun #define IP_XFRM_POLICY 17 111*4882a593Smuzhiyun #define IP_PASSSEC 18 112*4882a593Smuzhiyun #define IP_TRANSPARENT 19 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun /* BSD compatibility */ 115*4882a593Smuzhiyun #define IP_RECVRETOPTS IP_RETOPTS 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun /* TProxy original addresses */ 118*4882a593Smuzhiyun #define IP_ORIGDSTADDR 20 119*4882a593Smuzhiyun #define IP_RECVORIGDSTADDR IP_ORIGDSTADDR 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun #define IP_MINTTL 21 122*4882a593Smuzhiyun #define IP_NODEFRAG 22 123*4882a593Smuzhiyun #define IP_CHECKSUM 23 124*4882a593Smuzhiyun #define IP_BIND_ADDRESS_NO_PORT 24 125*4882a593Smuzhiyun #define IP_RECVFRAGSIZE 25 126*4882a593Smuzhiyun #define IP_RECVERR_RFC4884 26 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun /* IP_MTU_DISCOVER values */ 129*4882a593Smuzhiyun #define IP_PMTUDISC_DONT 0 /* Never send DF frames */ 130*4882a593Smuzhiyun #define IP_PMTUDISC_WANT 1 /* Use per route hints */ 131*4882a593Smuzhiyun #define IP_PMTUDISC_DO 2 /* Always DF */ 132*4882a593Smuzhiyun #define IP_PMTUDISC_PROBE 3 /* Ignore dst pmtu */ 133*4882a593Smuzhiyun /* Always use interface mtu (ignores dst pmtu) but don't set DF flag. 134*4882a593Smuzhiyun * Also incoming ICMP frag_needed notifications will be ignored on 135*4882a593Smuzhiyun * this socket to prevent accepting spoofed ones. 136*4882a593Smuzhiyun */ 137*4882a593Smuzhiyun #define IP_PMTUDISC_INTERFACE 4 138*4882a593Smuzhiyun /* weaker version of IP_PMTUDISC_INTERFACE, which allows packets to get 139*4882a593Smuzhiyun * fragmented if they exeed the interface mtu 140*4882a593Smuzhiyun */ 141*4882a593Smuzhiyun #define IP_PMTUDISC_OMIT 5 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun #define IP_MULTICAST_IF 32 144*4882a593Smuzhiyun #define IP_MULTICAST_TTL 33 145*4882a593Smuzhiyun #define IP_MULTICAST_LOOP 34 146*4882a593Smuzhiyun #define IP_ADD_MEMBERSHIP 35 147*4882a593Smuzhiyun #define IP_DROP_MEMBERSHIP 36 148*4882a593Smuzhiyun #define IP_UNBLOCK_SOURCE 37 149*4882a593Smuzhiyun #define IP_BLOCK_SOURCE 38 150*4882a593Smuzhiyun #define IP_ADD_SOURCE_MEMBERSHIP 39 151*4882a593Smuzhiyun #define IP_DROP_SOURCE_MEMBERSHIP 40 152*4882a593Smuzhiyun #define IP_MSFILTER 41 153*4882a593Smuzhiyun #define MCAST_JOIN_GROUP 42 154*4882a593Smuzhiyun #define MCAST_BLOCK_SOURCE 43 155*4882a593Smuzhiyun #define MCAST_UNBLOCK_SOURCE 44 156*4882a593Smuzhiyun #define MCAST_LEAVE_GROUP 45 157*4882a593Smuzhiyun #define MCAST_JOIN_SOURCE_GROUP 46 158*4882a593Smuzhiyun #define MCAST_LEAVE_SOURCE_GROUP 47 159*4882a593Smuzhiyun #define MCAST_MSFILTER 48 160*4882a593Smuzhiyun #define IP_MULTICAST_ALL 49 161*4882a593Smuzhiyun #define IP_UNICAST_IF 50 162*4882a593Smuzhiyun 163*4882a593Smuzhiyun #define MCAST_EXCLUDE 0 164*4882a593Smuzhiyun #define MCAST_INCLUDE 1 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun /* These need to appear somewhere around here */ 167*4882a593Smuzhiyun #define IP_DEFAULT_MULTICAST_TTL 1 168*4882a593Smuzhiyun #define IP_DEFAULT_MULTICAST_LOOP 1 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun /* Request struct for multicast socket ops */ 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun #if __UAPI_DEF_IP_MREQ 173*4882a593Smuzhiyun struct ip_mreq { 174*4882a593Smuzhiyun struct in_addr imr_multiaddr; /* IP multicast address of group */ 175*4882a593Smuzhiyun struct in_addr imr_interface; /* local IP address of interface */ 176*4882a593Smuzhiyun }; 177*4882a593Smuzhiyun 178*4882a593Smuzhiyun struct ip_mreqn { 179*4882a593Smuzhiyun struct in_addr imr_multiaddr; /* IP multicast address of group */ 180*4882a593Smuzhiyun struct in_addr imr_address; /* local IP address of interface */ 181*4882a593Smuzhiyun int imr_ifindex; /* Interface index */ 182*4882a593Smuzhiyun }; 183*4882a593Smuzhiyun 184*4882a593Smuzhiyun struct ip_mreq_source { 185*4882a593Smuzhiyun __be32 imr_multiaddr; 186*4882a593Smuzhiyun __be32 imr_interface; 187*4882a593Smuzhiyun __be32 imr_sourceaddr; 188*4882a593Smuzhiyun }; 189*4882a593Smuzhiyun 190*4882a593Smuzhiyun struct ip_msfilter { 191*4882a593Smuzhiyun __be32 imsf_multiaddr; 192*4882a593Smuzhiyun __be32 imsf_interface; 193*4882a593Smuzhiyun __u32 imsf_fmode; 194*4882a593Smuzhiyun __u32 imsf_numsrc; 195*4882a593Smuzhiyun __be32 imsf_slist[1]; 196*4882a593Smuzhiyun }; 197*4882a593Smuzhiyun 198*4882a593Smuzhiyun #define IP_MSFILTER_SIZE(numsrc) \ 199*4882a593Smuzhiyun (sizeof(struct ip_msfilter) - sizeof(__u32) \ 200*4882a593Smuzhiyun + (numsrc) * sizeof(__u32)) 201*4882a593Smuzhiyun 202*4882a593Smuzhiyun struct group_req { 203*4882a593Smuzhiyun __u32 gr_interface; /* interface index */ 204*4882a593Smuzhiyun struct __kernel_sockaddr_storage gr_group; /* group address */ 205*4882a593Smuzhiyun }; 206*4882a593Smuzhiyun 207*4882a593Smuzhiyun struct group_source_req { 208*4882a593Smuzhiyun __u32 gsr_interface; /* interface index */ 209*4882a593Smuzhiyun struct __kernel_sockaddr_storage gsr_group; /* group address */ 210*4882a593Smuzhiyun struct __kernel_sockaddr_storage gsr_source; /* source address */ 211*4882a593Smuzhiyun }; 212*4882a593Smuzhiyun 213*4882a593Smuzhiyun struct group_filter { 214*4882a593Smuzhiyun __u32 gf_interface; /* interface index */ 215*4882a593Smuzhiyun struct __kernel_sockaddr_storage gf_group; /* multicast address */ 216*4882a593Smuzhiyun __u32 gf_fmode; /* filter mode */ 217*4882a593Smuzhiyun __u32 gf_numsrc; /* number of sources */ 218*4882a593Smuzhiyun struct __kernel_sockaddr_storage gf_slist[1]; /* interface index */ 219*4882a593Smuzhiyun }; 220*4882a593Smuzhiyun 221*4882a593Smuzhiyun #define GROUP_FILTER_SIZE(numsrc) \ 222*4882a593Smuzhiyun (sizeof(struct group_filter) - sizeof(struct __kernel_sockaddr_storage) \ 223*4882a593Smuzhiyun + (numsrc) * sizeof(struct __kernel_sockaddr_storage)) 224*4882a593Smuzhiyun #endif 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun #if __UAPI_DEF_IN_PKTINFO 227*4882a593Smuzhiyun struct in_pktinfo { 228*4882a593Smuzhiyun int ipi_ifindex; 229*4882a593Smuzhiyun struct in_addr ipi_spec_dst; 230*4882a593Smuzhiyun struct in_addr ipi_addr; 231*4882a593Smuzhiyun }; 232*4882a593Smuzhiyun #endif 233*4882a593Smuzhiyun 234*4882a593Smuzhiyun /* Structure describing an Internet (IP) socket address. */ 235*4882a593Smuzhiyun #if __UAPI_DEF_SOCKADDR_IN 236*4882a593Smuzhiyun #define __SOCK_SIZE__ 16 /* sizeof(struct sockaddr) */ 237*4882a593Smuzhiyun struct sockaddr_in { 238*4882a593Smuzhiyun __kernel_sa_family_t sin_family; /* Address family */ 239*4882a593Smuzhiyun __be16 sin_port; /* Port number */ 240*4882a593Smuzhiyun struct in_addr sin_addr; /* Internet address */ 241*4882a593Smuzhiyun 242*4882a593Smuzhiyun /* Pad to size of `struct sockaddr'. */ 243*4882a593Smuzhiyun unsigned char __pad[__SOCK_SIZE__ - sizeof(short int) - 244*4882a593Smuzhiyun sizeof(unsigned short int) - sizeof(struct in_addr)]; 245*4882a593Smuzhiyun }; 246*4882a593Smuzhiyun #define sin_zero __pad /* for BSD UNIX comp. -FvK */ 247*4882a593Smuzhiyun #endif 248*4882a593Smuzhiyun 249*4882a593Smuzhiyun #if __UAPI_DEF_IN_CLASS 250*4882a593Smuzhiyun /* 251*4882a593Smuzhiyun * Definitions of the bits in an Internet address integer. 252*4882a593Smuzhiyun * On subnets, host and network parts are found according 253*4882a593Smuzhiyun * to the subnet mask, not these masks. 254*4882a593Smuzhiyun */ 255*4882a593Smuzhiyun #define IN_CLASSA(a) ((((long int) (a)) & 0x80000000) == 0) 256*4882a593Smuzhiyun #define IN_CLASSA_NET 0xff000000 257*4882a593Smuzhiyun #define IN_CLASSA_NSHIFT 24 258*4882a593Smuzhiyun #define IN_CLASSA_HOST (0xffffffff & ~IN_CLASSA_NET) 259*4882a593Smuzhiyun #define IN_CLASSA_MAX 128 260*4882a593Smuzhiyun 261*4882a593Smuzhiyun #define IN_CLASSB(a) ((((long int) (a)) & 0xc0000000) == 0x80000000) 262*4882a593Smuzhiyun #define IN_CLASSB_NET 0xffff0000 263*4882a593Smuzhiyun #define IN_CLASSB_NSHIFT 16 264*4882a593Smuzhiyun #define IN_CLASSB_HOST (0xffffffff & ~IN_CLASSB_NET) 265*4882a593Smuzhiyun #define IN_CLASSB_MAX 65536 266*4882a593Smuzhiyun 267*4882a593Smuzhiyun #define IN_CLASSC(a) ((((long int) (a)) & 0xe0000000) == 0xc0000000) 268*4882a593Smuzhiyun #define IN_CLASSC_NET 0xffffff00 269*4882a593Smuzhiyun #define IN_CLASSC_NSHIFT 8 270*4882a593Smuzhiyun #define IN_CLASSC_HOST (0xffffffff & ~IN_CLASSC_NET) 271*4882a593Smuzhiyun 272*4882a593Smuzhiyun #define IN_CLASSD(a) ((((long int) (a)) & 0xf0000000) == 0xe0000000) 273*4882a593Smuzhiyun #define IN_MULTICAST(a) IN_CLASSD(a) 274*4882a593Smuzhiyun #define IN_MULTICAST_NET 0xe0000000 275*4882a593Smuzhiyun 276*4882a593Smuzhiyun #define IN_BADCLASS(a) (((long int) (a) ) == (long int)0xffffffff) 277*4882a593Smuzhiyun #define IN_EXPERIMENTAL(a) IN_BADCLASS((a)) 278*4882a593Smuzhiyun 279*4882a593Smuzhiyun #define IN_CLASSE(a) ((((long int) (a)) & 0xf0000000) == 0xf0000000) 280*4882a593Smuzhiyun #define IN_CLASSE_NET 0xffffffff 281*4882a593Smuzhiyun #define IN_CLASSE_NSHIFT 0 282*4882a593Smuzhiyun 283*4882a593Smuzhiyun /* Address to accept any incoming messages. */ 284*4882a593Smuzhiyun #define INADDR_ANY ((unsigned long int) 0x00000000) 285*4882a593Smuzhiyun 286*4882a593Smuzhiyun /* Address to send to all hosts. */ 287*4882a593Smuzhiyun #define INADDR_BROADCAST ((unsigned long int) 0xffffffff) 288*4882a593Smuzhiyun 289*4882a593Smuzhiyun /* Address indicating an error return. */ 290*4882a593Smuzhiyun #define INADDR_NONE ((unsigned long int) 0xffffffff) 291*4882a593Smuzhiyun 292*4882a593Smuzhiyun /* Dummy address for src of ICMP replies if no real address is set (RFC7600). */ 293*4882a593Smuzhiyun #define INADDR_DUMMY ((unsigned long int) 0xc0000008) 294*4882a593Smuzhiyun 295*4882a593Smuzhiyun /* Network number for local host loopback. */ 296*4882a593Smuzhiyun #define IN_LOOPBACKNET 127 297*4882a593Smuzhiyun 298*4882a593Smuzhiyun /* Address to loopback in software to local host. */ 299*4882a593Smuzhiyun #define INADDR_LOOPBACK 0x7f000001 /* 127.0.0.1 */ 300*4882a593Smuzhiyun #define IN_LOOPBACK(a) ((((long int) (a)) & 0xff000000) == 0x7f000000) 301*4882a593Smuzhiyun 302*4882a593Smuzhiyun /* Defines for Multicast INADDR */ 303*4882a593Smuzhiyun #define INADDR_UNSPEC_GROUP 0xe0000000U /* 224.0.0.0 */ 304*4882a593Smuzhiyun #define INADDR_ALLHOSTS_GROUP 0xe0000001U /* 224.0.0.1 */ 305*4882a593Smuzhiyun #define INADDR_ALLRTRS_GROUP 0xe0000002U /* 224.0.0.2 */ 306*4882a593Smuzhiyun #define INADDR_ALLSNOOPERS_GROUP 0xe000006aU /* 224.0.0.106 */ 307*4882a593Smuzhiyun #define INADDR_MAX_LOCAL_GROUP 0xe00000ffU /* 224.0.0.255 */ 308*4882a593Smuzhiyun #endif 309*4882a593Smuzhiyun 310*4882a593Smuzhiyun /* <asm/byteorder.h> contains the htonl type stuff.. */ 311*4882a593Smuzhiyun #include <asm/byteorder.h> 312*4882a593Smuzhiyun 313*4882a593Smuzhiyun 314*4882a593Smuzhiyun #endif /* _UAPI_LINUX_IN_H */ 315