mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-21 08:19:28 +00:00
![Arnd Bergmann](/assets/img/avatar_default.png)
The 'timeval' and 'timespec' data structures used for socket timestamps are going to be redefined in user space based on 64-bit time_t in future versions of the C library to deal with the y2038 overflow problem, which breaks the ABI definition. Unlike many modern ioctl commands, SIOCGSTAMP and SIOCGSTAMPNS do not use the _IOR() macro to encode the size of the transferred data, so it remains ambiguous whether the application uses the old or new layout. The best workaround I could find is rather ugly: we redefine the command code based on the size of the respective data structure with a ternary operator. This lets it get evaluated as late as possible, hopefully after that structure is visible to the caller. We cannot use an #ifdef here, because inux/sockios.h might have been included before any libc header that could determine the size of time_t. The ioctl implementation now interprets the new command codes as always referring to the 64-bit structure on all architectures, while the old architecture specific command code still refers to the old architecture specific layout. The new command number is only used when they are actually different. Signed-off-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: David S. Miller <davem@davemloft.net>
174 lines
6.7 KiB
C
174 lines
6.7 KiB
C
/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
|
|
/*
|
|
* INET An implementation of the TCP/IP protocol suite for the LINUX
|
|
* operating system. INET is implemented using the BSD Socket
|
|
* interface as the means of communication with the user level.
|
|
*
|
|
* Definitions of the socket-level I/O control calls.
|
|
*
|
|
* Version: @(#)sockios.h 1.0.2 03/09/93
|
|
*
|
|
* Authors: Ross Biro
|
|
* Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version
|
|
* 2 of the License, or (at your option) any later version.
|
|
*/
|
|
#ifndef _LINUX_SOCKIOS_H
|
|
#define _LINUX_SOCKIOS_H
|
|
|
|
#include <asm/bitsperlong.h>
|
|
#include <asm/sockios.h>
|
|
|
|
/* Linux-specific socket ioctls */
|
|
#define SIOCINQ FIONREAD
|
|
#define SIOCOUTQ TIOCOUTQ /* output queue size (not sent + not acked) */
|
|
|
|
#define SOCK_IOC_TYPE 0x89
|
|
|
|
/*
|
|
* the timeval/timespec data structure layout is defined by libc,
|
|
* so we need to cover both possible versions on 32-bit.
|
|
*/
|
|
/* Get stamp (timeval) */
|
|
#define SIOCGSTAMP_NEW _IOR(SOCK_IOC_TYPE, 0x06, long long[2])
|
|
/* Get stamp (timespec) */
|
|
#define SIOCGSTAMPNS_NEW _IOR(SOCK_IOC_TYPE, 0x07, long long[2])
|
|
|
|
#if __BITS_PER_LONG == 64 || (defined(__x86_64__) && defined(__ILP32__))
|
|
/* on 64-bit and x32, avoid the ?: operator */
|
|
#define SIOCGSTAMP SIOCGSTAMP_OLD
|
|
#define SIOCGSTAMPNS SIOCGSTAMPNS_OLD
|
|
#else
|
|
#define SIOCGSTAMP ((sizeof(struct timeval)) == 8 ? \
|
|
SIOCGSTAMP_OLD : SIOCGSTAMP_NEW)
|
|
#define SIOCGSTAMPNS ((sizeof(struct timespec)) == 8 ? \
|
|
SIOCGSTAMPNS_OLD : SIOCGSTAMPNS_NEW)
|
|
#endif
|
|
|
|
/* Routing table calls. */
|
|
#define SIOCADDRT 0x890B /* add routing table entry */
|
|
#define SIOCDELRT 0x890C /* delete routing table entry */
|
|
#define SIOCRTMSG 0x890D /* unused */
|
|
|
|
/* Socket configuration controls. */
|
|
#define SIOCGIFNAME 0x8910 /* get iface name */
|
|
#define SIOCSIFLINK 0x8911 /* set iface channel */
|
|
#define SIOCGIFCONF 0x8912 /* get iface list */
|
|
#define SIOCGIFFLAGS 0x8913 /* get flags */
|
|
#define SIOCSIFFLAGS 0x8914 /* set flags */
|
|
#define SIOCGIFADDR 0x8915 /* get PA address */
|
|
#define SIOCSIFADDR 0x8916 /* set PA address */
|
|
#define SIOCGIFDSTADDR 0x8917 /* get remote PA address */
|
|
#define SIOCSIFDSTADDR 0x8918 /* set remote PA address */
|
|
#define SIOCGIFBRDADDR 0x8919 /* get broadcast PA address */
|
|
#define SIOCSIFBRDADDR 0x891a /* set broadcast PA address */
|
|
#define SIOCGIFNETMASK 0x891b /* get network PA mask */
|
|
#define SIOCSIFNETMASK 0x891c /* set network PA mask */
|
|
#define SIOCGIFMETRIC 0x891d /* get metric */
|
|
#define SIOCSIFMETRIC 0x891e /* set metric */
|
|
#define SIOCGIFMEM 0x891f /* get memory address (BSD) */
|
|
#define SIOCSIFMEM 0x8920 /* set memory address (BSD) */
|
|
#define SIOCGIFMTU 0x8921 /* get MTU size */
|
|
#define SIOCSIFMTU 0x8922 /* set MTU size */
|
|
#define SIOCSIFNAME 0x8923 /* set interface name */
|
|
#define SIOCSIFHWADDR 0x8924 /* set hardware address */
|
|
#define SIOCGIFENCAP 0x8925 /* get/set encapsulations */
|
|
#define SIOCSIFENCAP 0x8926
|
|
#define SIOCGIFHWADDR 0x8927 /* Get hardware address */
|
|
#define SIOCGIFSLAVE 0x8929 /* Driver slaving support */
|
|
#define SIOCSIFSLAVE 0x8930
|
|
#define SIOCADDMULTI 0x8931 /* Multicast address lists */
|
|
#define SIOCDELMULTI 0x8932
|
|
#define SIOCGIFINDEX 0x8933 /* name -> if_index mapping */
|
|
#define SIOGIFINDEX SIOCGIFINDEX /* misprint compatibility :-) */
|
|
#define SIOCSIFPFLAGS 0x8934 /* set/get extended flags set */
|
|
#define SIOCGIFPFLAGS 0x8935
|
|
#define SIOCDIFADDR 0x8936 /* delete PA address */
|
|
#define SIOCSIFHWBROADCAST 0x8937 /* set hardware broadcast addr */
|
|
#define SIOCGIFCOUNT 0x8938 /* get number of devices */
|
|
|
|
#define SIOCGIFBR 0x8940 /* Bridging support */
|
|
#define SIOCSIFBR 0x8941 /* Set bridging options */
|
|
|
|
#define SIOCGIFTXQLEN 0x8942 /* Get the tx queue length */
|
|
#define SIOCSIFTXQLEN 0x8943 /* Set the tx queue length */
|
|
|
|
/* SIOCGIFDIVERT was: 0x8944 Frame diversion support */
|
|
/* SIOCSIFDIVERT was: 0x8945 Set frame diversion options */
|
|
|
|
#define SIOCETHTOOL 0x8946 /* Ethtool interface */
|
|
|
|
#define SIOCGMIIPHY 0x8947 /* Get address of MII PHY in use. */
|
|
#define SIOCGMIIREG 0x8948 /* Read MII PHY register. */
|
|
#define SIOCSMIIREG 0x8949 /* Write MII PHY register. */
|
|
|
|
#define SIOCWANDEV 0x894A /* get/set netdev parameters */
|
|
|
|
#define SIOCOUTQNSD 0x894B /* output queue size (not sent only) */
|
|
#define SIOCGSKNS 0x894C /* get socket network namespace */
|
|
|
|
/* ARP cache control calls. */
|
|
/* 0x8950 - 0x8952 * obsolete calls, don't re-use */
|
|
#define SIOCDARP 0x8953 /* delete ARP table entry */
|
|
#define SIOCGARP 0x8954 /* get ARP table entry */
|
|
#define SIOCSARP 0x8955 /* set ARP table entry */
|
|
|
|
/* RARP cache control calls. */
|
|
#define SIOCDRARP 0x8960 /* delete RARP table entry */
|
|
#define SIOCGRARP 0x8961 /* get RARP table entry */
|
|
#define SIOCSRARP 0x8962 /* set RARP table entry */
|
|
|
|
/* Driver configuration calls */
|
|
|
|
#define SIOCGIFMAP 0x8970 /* Get device parameters */
|
|
#define SIOCSIFMAP 0x8971 /* Set device parameters */
|
|
|
|
/* DLCI configuration calls */
|
|
|
|
#define SIOCADDDLCI 0x8980 /* Create new DLCI device */
|
|
#define SIOCDELDLCI 0x8981 /* Delete DLCI device */
|
|
|
|
#define SIOCGIFVLAN 0x8982 /* 802.1Q VLAN support */
|
|
#define SIOCSIFVLAN 0x8983 /* Set 802.1Q VLAN options */
|
|
|
|
/* bonding calls */
|
|
|
|
#define SIOCBONDENSLAVE 0x8990 /* enslave a device to the bond */
|
|
#define SIOCBONDRELEASE 0x8991 /* release a slave from the bond*/
|
|
#define SIOCBONDSETHWADDR 0x8992 /* set the hw addr of the bond */
|
|
#define SIOCBONDSLAVEINFOQUERY 0x8993 /* rtn info about slave state */
|
|
#define SIOCBONDINFOQUERY 0x8994 /* rtn info about bond state */
|
|
#define SIOCBONDCHANGEACTIVE 0x8995 /* update to a new active slave */
|
|
|
|
/* bridge calls */
|
|
#define SIOCBRADDBR 0x89a0 /* create new bridge device */
|
|
#define SIOCBRDELBR 0x89a1 /* remove bridge device */
|
|
#define SIOCBRADDIF 0x89a2 /* add interface to bridge */
|
|
#define SIOCBRDELIF 0x89a3 /* remove interface from bridge */
|
|
|
|
/* hardware time stamping: parameters in linux/net_tstamp.h */
|
|
#define SIOCSHWTSTAMP 0x89b0 /* set and get config */
|
|
#define SIOCGHWTSTAMP 0x89b1 /* get config */
|
|
|
|
/* Device private ioctl calls */
|
|
|
|
/*
|
|
* These 16 ioctls are available to devices via the do_ioctl() device
|
|
* vector. Each device should include this file and redefine these names
|
|
* as their own. Because these are device dependent it is a good idea
|
|
* _NOT_ to issue them to random objects and hope.
|
|
*
|
|
* THESE IOCTLS ARE _DEPRECATED_ AND WILL DISAPPEAR IN 2.5.X -DaveM
|
|
*/
|
|
|
|
#define SIOCDEVPRIVATE 0x89F0 /* to 89FF */
|
|
|
|
/*
|
|
* These 16 ioctl calls are protocol private
|
|
*/
|
|
|
|
#define SIOCPROTOPRIVATE 0x89E0 /* to 89EF */
|
|
#endif /* _LINUX_SOCKIOS_H */
|