socket DF flag on UDP socket via IP_MTU_DISCOVER on Linux and IP_DONTFRAGMENT on FreeBSD for path MTU discovery purpose.

idea proposal via ml :
https://marc.info/?l=php-internals&m=167329288509393&w=2

Close GH-10282
This commit is contained in:
David Carlier 2023-01-10 20:39:19 +00:00
parent 55d19eee49
commit 9198e8894b
6 changed files with 128 additions and 1 deletions

1
NEWS
View file

@ -86,6 +86,7 @@ PHP NEWS
. Added socket_atmark if send/recv needs using MSG_OOB. (David Carlier) . Added socket_atmark if send/recv needs using MSG_OOB. (David Carlier)
. Added TCP_QUICKACK constant, to give tigher control over . Added TCP_QUICKACK constant, to give tigher control over
ACK delays. (David Carlier) ACK delays. (David Carlier)
. Added DONTFRAGMENT support for path MTU discovery purpose. (David Carlier)
- Standard: - Standard:
. E_NOTICEs emitted by unserialize() have been promoted to E_WARNING. (timwolla) . E_NOTICEs emitted by unserialize() have been promoted to E_WARNING. (timwolla)

View file

@ -117,6 +117,14 @@ PHP 8.3 UPGRADE NOTES
- Sockets: - Sockets:
. SO_ATTACH_REUSEPORT_CBPF (Linux only). . SO_ATTACH_REUSEPORT_CBPF (Linux only).
. TCP_QUICKACK (Linux only). . TCP_QUICKACK (Linux only).
. IP_DONTFRAG (FreeBSD only).
. IP_MTU_DISCOVER (Linux only).
. IP_PMTUDISC_DO (Linux only).
. IP_PMTUDISC_DONT (Linux only).
. IP_PMTUDISC_WANT (Linux only).
. IP_PMTUDISC_PROBE (Linux only).
. IP_PMTUDISC_INTERFACE (Linux only).
. IP_PMTUDISC_OMIT (Linux only).
======================================== ========================================
11. Changes to INI File Handling 11. Changes to INI File Handling

View file

@ -1706,6 +1706,62 @@ const SO_DETACH_BPF = UNKNOWN;
*/ */
const TCP_QUICKACK = UNKNOWN; const TCP_QUICKACK = UNKNOWN;
#endif #endif
#if defined(IP_DONTFRAG)
/**
* @var int
* @cvalue IP_DONTFRAG
*/
const IP_DONTFRAG = UNKNOWN;
#endif
#if defined(IP_MTU_DISCOVER)
/**
* @var int
* @cvalue IP_MTU_DISCOVER
*/
const IP_MTU_DISCOVER = UNKNOWN;
#endif
#if defined(IP_PMTUDISC_DO)
/**
* @var int
* @cvalue IP_PMTUDISC_DO
*/
const IP_PMTUDISC_DO = UNKNOWN;
#endif
#if defined(IP_PMTUDISC_DONT)
/**
* @var int
* @cvalue IP_PMTUDISC_DONT
*/
const IP_PMTUDISC_DONT = UNKNOWN;
#endif
#if defined(IP_PMTUDISC_WANT)
/**
* @var int
* @cvalue IP_PMTUDISC_WANT
*/
const IP_PMTUDISC_WANT = UNKNOWN;
#endif
#if defined(IP_PMTUDISC_PROBE)
/**
* @var int
* @cvalue IP_PMTUDISC_PROBE
*/
const IP_PMTUDISC_PROBE = UNKNOWN;
#endif
#if defined(IP_PMTUDISC_INTERFACE)
/**
* @var int
* @cvalue IP_PMTUDISC_INTERFACE
*/
const IP_PMTUDISC_INTERFACE = UNKNOWN;
#endif
#if defined(IP_PMTUDISC_OMIT)
/**
* @var int
* @cvalue IP_PMTUDISC_OMIT
*/
const IP_PMTUDISC_OMIT = UNKNOWN;
#endif
/** /**
* @strict-properties * @strict-properties

View file

@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead. /* This is a generated file, edit the .stub.php file instead.
* Stub hash: abec5e538a69c27451c0cac0a19a92fc6df667eb */ * Stub hash: add91c303eddf7518566bc7e6c1698d7198c0d4c */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_socket_select, 0, 4, MAY_BE_LONG|MAY_BE_FALSE) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_socket_select, 0, 4, MAY_BE_LONG|MAY_BE_FALSE)
ZEND_ARG_TYPE_INFO(1, read, IS_ARRAY, 1) ZEND_ARG_TYPE_INFO(1, read, IS_ARRAY, 1)
@ -991,6 +991,30 @@ static void register_sockets_symbols(int module_number)
#if defined(TCP_QUICKACK) #if defined(TCP_QUICKACK)
REGISTER_LONG_CONSTANT("TCP_QUICKACK", TCP_QUICKACK, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("TCP_QUICKACK", TCP_QUICKACK, CONST_PERSISTENT);
#endif #endif
#if defined(IP_DONTFRAG)
REGISTER_LONG_CONSTANT("IP_DONTFRAG", IP_DONTFRAG, CONST_PERSISTENT);
#endif
#if defined(IP_MTU_DISCOVER)
REGISTER_LONG_CONSTANT("IP_MTU_DISCOVER", IP_MTU_DISCOVER, CONST_PERSISTENT);
#endif
#if defined(IP_PMTUDISC_DO)
REGISTER_LONG_CONSTANT("IP_PMTUDISC_DO", IP_PMTUDISC_DO, CONST_PERSISTENT);
#endif
#if defined(IP_PMTUDISC_DONT)
REGISTER_LONG_CONSTANT("IP_PMTUDISC_DONT", IP_PMTUDISC_DONT, CONST_PERSISTENT);
#endif
#if defined(IP_PMTUDISC_WANT)
REGISTER_LONG_CONSTANT("IP_PMTUDISC_WANT", IP_PMTUDISC_WANT, CONST_PERSISTENT);
#endif
#if defined(IP_PMTUDISC_PROBE)
REGISTER_LONG_CONSTANT("IP_PMTUDISC_PROBE", IP_PMTUDISC_PROBE, CONST_PERSISTENT);
#endif
#if defined(IP_PMTUDISC_INTERFACE)
REGISTER_LONG_CONSTANT("IP_PMTUDISC_INTERFACE", IP_PMTUDISC_INTERFACE, CONST_PERSISTENT);
#endif
#if defined(IP_PMTUDISC_OMIT)
REGISTER_LONG_CONSTANT("IP_PMTUDISC_OMIT", IP_PMTUDISC_OMIT, CONST_PERSISTENT);
#endif
} }
static zend_class_entry *register_class_Socket(void) static zend_class_entry *register_class_Socket(void)

View file

@ -0,0 +1,19 @@
--TEST--
IP_MTU_DISCOVER test
--EXTENSIONS--
sockets
--SKIPIF--
<?php
if (PHP_OS != 'Linux') {
die('skip For Linux only');
}
?>
--FILE--
<?php
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_bind($socket, '127.0.0.1', 5557);
$ret = socket_set_option($socket, IPPROTO_IP, IP_MTU_DISCOVER, IP_PMTUDISC_DO);
var_dump($ret);
?>
--EXPECT--
bool(true)

View file

@ -0,0 +1,19 @@
--TEST--
IP_DONTFRAG test
--EXTENSIONS--
sockets
--SKIPIF--
<?php
if (PHP_OS != 'FreeBSD') {
die('skip For FreeBSD only');
}
?>
--FILE--
<?php
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_bind($socket, '127.0.0.1', 5557);
$ret = socket_set_option($socket, IPPROTO_IP, IP_DONTFRAG, 1);
var_dump($ret);
?>
--EXPECT--
bool(true)