@@ -16,154 +16,84 @@ if (PHP_INT_SIZE != 4) die("skip this test is for 32-bit only");
1616?>
1717--FILE--
1818<?php
19- $ s_c = socket_create (AF_PACKET , SOCK_RAW , ETH_P_ALL );
20- $ s_bind = socket_bind ($ s_c , 'lo ' );
21- var_dump ($ s_bind );
19+ $ receiver = socket_create (AF_PACKET , SOCK_RAW , ETH_P_ALL );
20+ $ sender = socket_create (AF_PACKET , SOCK_RAW , ETH_P_LOOP );
2221
23- // sock_getsockname in this context gets the interface rather than the address.
24- $ s_conn = socket_getsockname ($ s_c , $ istr , $ iindex );
25- var_dump ($ s_conn );
26- var_dump ($ istr );
27- var_dump ($ iindex );
22+ var_dump (socket_bind ($ receiver , 'lo ' ));
2823
29- $ s_s = socket_create (AF_PACKET , SOCK_RAW , ETH_P_LOOP );
30- $ v_bind = socket_bind ($ s_s , 'lo ' );
24+ var_dump (socket_getsockname ($ receiver , $ if_name , $ if_index ));
25+ var_dump ($ if_name );
26+ var_dump (is_int ($ if_index ));
3127
32- $ buf = pack ("H12H12n " , "ffffffffffff " , "000000000000 " , ETH_P_LOOP );
33- $ buf .= str_repeat ("A " , 46 );
28+ var_dump (socket_bind ($ sender , 'lo ' ));
3429
35- var_dump (socket_sendto ($ s_s , $ buf , strlen ($ buf ), 0 , "lo " , 1 ));
30+ $ payload = str_repeat ("A " , 46 );
31+ $ eth_frame = pack ("H12H12n " , "ffffffffffff " , "000000000000 " , ETH_P_LOOP ) . $ payload ;
3632
37- try {
38- socket_recvfrom ($ s_c , $ rsp , strlen ($ buf ), 0 , $ addr );
39- } catch (\ValueError $ e ) {
40- echo $ e ->getMessage (), PHP_EOL ;
41- }
42-
43- socket_close ($ s_c );
44- // purposely unsupported ethernet protocol (ARP)
45-
46- $ s_c = socket_create (AF_PACKET , SOCK_RAW , 0x0806 );
47- $ s_bind = socket_bind ($ s_c , 'lo ' );
48- $ buf = pack ("H12H12n " , "ffffffffffff " , "000000000000 " , 0x0806 );
49- $ buf .= str_repeat ("A " , 46 );
50-
51- var_dump (socket_sendto ($ s_s , $ buf , strlen ($ buf ), 0 , "lo " , 1 ));
52-
53- try {
54- socket_recvfrom ($ s_c , $ rsp2 , strlen ($ buf ), 0 , $ addr2 );
55- } catch (\ValueError $ e ) {
56- echo $ e ->getMessage (), PHP_EOL ;
57- }
58-
59- socket_close ($ s_s );
60- socket_close ($ s_c );
33+ var_dump (socket_sendto ($ sender , $ eth_frame , strlen ($ eth_frame ), 0 , "lo " , 1 ));
6134
62- $ s_c = socket_create (AF_PACKET , SOCK_RAW , ETH_P_ALL );
63- $ s_bind = socket_bind ($ s_c , 'lo ' );
35+ usleep (10000 );
6436
65- $ s_s = socket_create (AF_PACKET , SOCK_RAW , ETH_P_ALL );
66- $ v_bind = socket_bind ($ s_s , 'lo ' );
67-
68- $ ip = hex2bin (
69- "4500 " .
70- str_repeat ("0028 " , 16 ) .
71- "0000 " .
72- "4000 " .
73- "4006 " .
74- "0000 " .
75- "7f000001 " .
76- "7f000001 "
77- );
78- $ p = str_repeat ("A " , 20 );
79-
80- $ buf = pack ("H12H12n " , "ffffffffffff " , "000000000000 " , ETH_P_IP );
81- $ buf .= $ ip . $ p ;
37+ $ len = socket_recvfrom ($ receiver , $ rsp , 1500 , 0 , $ addr );
38+ var_dump ($ len );
39+ var_dump ($ addr );
40+ socket_close ($ sender );
8241
83- $ min_frame_size = 60 ;
84- $ buf .= str_repeat ( "\x00" , max ( 0 , $ min_frame_size - strlen ( $ buf ) ));
42+ $ arp_receiver = socket_create ( AF_PACKET , SOCK_RAW , 0x0806 ); // ETH_P_ARP
43+ var_dump ( socket_bind ( $ arp_receiver , ' lo ' ));
8544
86- var_dump ( socket_sendto ( $ s_s , $ buf , strlen ( $ buf ), 0 , "lo " , 1 ) );
45+ socket_set_option ( $ arp_receiver , SOL_SOCKET , SO_RCVTIMEO , [ " sec " => 0 , "usec " => 50000 ] );
8746
88- try {
89- socket_recvfrom ( $ s_c , $ rsp , strlen ( $ buf ), 0 , $ addr );
90- } catch ( \ ValueError $ e ) {
91- echo $ e -> getMessage (), PHP_EOL ;
47+ $ recv_result = socket_recvfrom ( $ arp_receiver , $ rsp2 , 1500 , 0 , $ addr2 );
48+ var_dump ( $ recv_result );
49+ if ( $ recv_result === false ) {
50+ echo " Socket receive timed out as expected. " . PHP_EOL ;
9251 }
93-
94- $ ip = hex2bin (
95- "9999 " .
96- "0028 " .
97- "0000 " .
98- "4000 " .
99- "4006 " .
100- "0000 " .
101- "FFFFFeFF " .
102- "7f000001 "
52+ socket_close ($ arp_receiver );
53+
54+ $ sender = socket_create (AF_PACKET , SOCK_RAW , ETH_P_IP );
55+ var_dump (socket_bind ($ sender , 'lo ' ));
56+
57+ $ malformed_eth_header = pack ("H12H12n " , "001122334455 " , "AABBCCDDEEFF " , ETH_P_IP );
58+ $ malformed_ip_header = hex2bin (
59+ "9999 " .
60+ "0028 " .
61+ "0000 " .
62+ "4000 " .
63+ "4006 " .
64+ "0000 " .
65+ "7f000001 " .
66+ "7f000001 "
10367 );
104- $ p = str_repeat ("Bb " , 80 );
105-
106- $ buf = pack ("H12H12n " , "ffffffffffffh " , "aaaaaAAAAAAA " , ETH_P_IP );
107- $ buf .= $ ip . $ p ;
68+ $ malformed_payload = str_repeat ("B " , 20 );
69+ $ malformed_frame = $ malformed_eth_header . $ malformed_ip_header . $ malformed_payload ;
70+ $ malformed_frame .= str_repeat ("\x00" , 60 - strlen ($ malformed_frame ));
10871
109- $ min_frame_size = 60 ;
110- $ buf .= str_repeat ("\x00" , max (0 , $ min_frame_size - strlen ($ buf )));
72+ var_dump (socket_sendto ($ sender , $ malformed_frame , strlen ($ malformed_frame ), 0 , "lo " , 1 ));
11173
112- var_dump (socket_sendto ($ s_s , $ buf , strlen ($ buf ), 0 , "lo " , 1 ));
113- var_dump (socket_recvfrom ($ s_c , $ rsp , strlen ($ buf ), 0 , $ addr ));
74+ usleep (10000 );
11475
76+ $ len = socket_recvfrom ($ receiver , $ rsp , 1500 , 0 , $ addr );
77+ var_dump ($ len );
11578 var_dump ($ addr );
11679 var_dump ($ rsp );
117-
118- socket_close ($ s_s );
119- socket_close ($ s_c );
80+
81+ socket_close ($ sender );
82+ socket_close ($ receiver );
12083?>
12184--EXPECTF--
12285bool(true)
12386bool(true)
12487string(2) "lo"
125- int(%d )
126- int(%d )
88+ bool(true )
89+ bool(true )
12790int(60)
128- unsupported ethernet protocol
129- int(84)
130- int(%d)
131- int(%d)
132- string(%d) "%s"
133- object(Socket\EthernetPacket)#%d (7) {
134- ["headerSize"]=>
135- int(%d)
136- ["rawPacket"]=>
137- string(%d) "%s"
138- ["socket"]=>
139- object(Socket)#%d (0) {
140- }
141- ["ethProtocol"]=>
142- int(2048)
143- ["srcMac"]=>
144- string(%d) "%s"
145- ["dstMac"]=>
146- string(%d) "%s"
147- ["payload"]=>
148- object(Socket\Ipv4Packet)#%d (5) {
149- ["headerSize"]=>
150- int(%d)
151- ["rawPacket"]=>
152- string(%d) "%s"
153- ["srcAddr"]=>
154- string(%d) "%s.%s.%s.%s"
155- ["dstAddr"]=>
156- string(%d) "%s.%s.%s.%s"
157- ["payload"]=>
158- object(Socket\TcpPacket)#%d (4) {
159- ["headerSize"]=>
160- int(%d)
161- ["rawPacket"]=>
162- string(%d) "%s"
163- ["srcPort"]=>
164- int(%d)
165- ["dstPort"]=>
166- int(%d)
167- }
168- }
169- }
91+ int(60)
92+ string(2) "lo"
93+ bool(true)
94+ bool(false)
95+ Socket receive timed out as expected.
96+ bool(true)
97+ int(60)
98+ int(60)
99+ string(2) "lo"
0 commit comments