@@ -12,7 +12,7 @@ if (!defined("AF_PACKET")) {
1212if (!function_exists ("posix_getuid " ) || posix_getuid () != 0 ) {
1313 die ('SKIP AF_PACKET requires root permissions. ' );
1414}
15- if (PHP_INT_SIZE != 4 ) die ("skip this test is for 32 -bit only " );
15+ if (PHP_INT_SIZE != 8 ) die ("skip this test is for 64 -bit only " );
1616?>
1717--FILE--
1818<?php
@@ -34,20 +34,351 @@ if (PHP_INT_SIZE != 4) die("skip this test is for 32-bit only");
3434 $ buf = pack ("H12H12n " , "ffffffffffff " , "000000000000 " , ETH_P_LOOP );
3535 $ buf .= str_repeat ("A " , 46 );
3636
37+ var_dump (socket_sendto ($ s_s , $ buf , strlen ($ buf ), 0 , "lo " , 1 ));
38+ var_dump (socket_recvfrom ($ s_c , $ rsp , strlen ($ buf ), 0 , $ addr ));
39+
40+ var_dump ($ addr );
41+ var_dump ($ rsp );
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+
3751 var_dump (socket_sendto ($ s_s , $ buf , strlen ($ buf ), 0 , "lo " , 1 ));
3852
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_c );
60+ socket_close ($ s_s );
61+
62+ $ s_c = socket_create (AF_PACKET , SOCK_RAW , ETH_P_ALL );
63+ $ s_bind = socket_bind ($ s_c , 'lo ' );
64+
65+ $ s_s = socket_create (AF_PACKET , SOCK_RAW , ETH_P_IP );
66+ $ v_bind = socket_bind ($ s_s , 'lo ' );
67+
68+ $ ip = hex2bin (
69+ "4500 " .
70+ "0028 " .
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 ;
82+
83+ $ min_frame_size = 60 ;
84+ $ buf .= str_repeat ("\x00" , max (0 , $ min_frame_size - strlen ($ buf )));
85+
86+ var_dump (socket_sendto ($ s_s , $ buf , strlen ($ buf ), 0 , "lo " , 1 ));
87+ var_dump (socket_recvfrom ($ s_c , $ rsp , strlen ($ buf ), 0 , $ addr ));
88+
89+ var_dump ($ addr );
90+ var_dump ($ rsp );
91+
92+ socket_close ($ s_s );
93+ socket_close ($ s_c );
94+
95+ $ s_c = socket_create (AF_PACKET , SOCK_RAW , ETH_P_IPV6 );
96+ $ s_bind = socket_bind ($ s_c , 'lo ' );
97+ $ s_s = socket_create (AF_PACKET , SOCK_RAW , ETH_P_IPV6 );
98+ $ v_bind = socket_bind ($ s_s , 'lo ' );
99+
100+ $ ethhdr = pack ("H12H12n " , "ffffffffffff " , "000000000000 " , ETH_P_IPV6 );
101+
102+ $ ipv6_first_4 = hex2bin ("60000000 " );
103+
104+ $ ipv6_payload_len = hex2bin ("0014 " );
105+
106+ $ ipv6_nexthdr = chr (6 );
107+
108+ $ ipv6_hop_limit = chr (64 );
109+
110+ $ src_ip = hex2bin ("00000000000000000000000000000001 " );
111+
112+ $ dst_ip = hex2bin ("00000000000000000000000000000001 " );
113+
114+ $ tcp_hdr = pack ("nnNNCCnn " ,
115+ 12345 ,
116+ 80 ,
117+ 0 ,
118+ 0 ,
119+ (5 << 4 ),
120+ 0x02 ,
121+ 65535 ,
122+ 0
123+ );
124+
125+ $ buf = $ ethhdr
126+ . $ ipv6_first_4
127+ . $ ipv6_payload_len
128+ . $ ipv6_nexthdr
129+ . $ ipv6_hop_limit
130+ . $ src_ip
131+ . $ dst_ip
132+ . $ tcp_hdr ;
133+
134+ $ buf .= str_repeat ("\x00" , max (0 , 60 - strlen ($ buf )));
135+
136+ var_dump (socket_sendto ($ s_s , $ buf , strlen ($ buf ), 0 , "lo " , 1 ));
137+ var_dump (socket_recvfrom ($ s_c , $ rsp , strlen ($ buf ), 0 , $ addr ));
138+
139+ var_dump ($ addr );
140+ var_dump ($ rsp );
141+
142+ $ first_4_bytes = hex2bin ("60000000 " );
143+
144+ $ payload_len = hex2bin ("0014 " );
145+
146+ $ nexthdr = hex2bin ("43 " ); // Extended proto
147+
148+ $ hop_limit = hex2bin ("40 " );
149+
150+ $ src_ip = hex2bin ("00000000000000000000000000000001 " );
151+
152+ $ dst_ip = hex2bin ("00000000000000000000000000000001 " );
153+
154+ $ tcp_payload = str_repeat ("A " , 20 );
155+
156+ $ ethhdr = pack ("H12H12n " , "ffffffffffff " , "000000000000 " , ETH_P_IPV6 );
157+
158+ $ buf = $ ethhdr . $ first_4_bytes . $ payload_len . $ nexthdr . $ hop_limit . $ src_ip . $ dst_ip . $ tcp_payload ;
159+
160+ $ buf .= str_repeat ("\x00" , max (0 , 60 - strlen ($ buf )));
161+
162+ var_dump (socket_sendto ($ s_s , $ buf , strlen ($ buf ), 0 , "lo " , 1 ));
163+
39164 try {
40165 socket_recvfrom ($ s_c , $ rsp , strlen ($ buf ), 0 , $ addr );
41- } catch (\ValueError $ e ) {
42- echo $ e ->getMessage (), PHP_EOL ;
166+ } catch (\ValueError $ e ) {
167+ echo $ e ->getMessage (), PHP_EOL ;
43168 }
44169
45170 socket_close ($ s_s );
46171 socket_close ($ s_c );
172+
173+ $ s_c = socket_create (AF_PACKET , SOCK_RAW , ETH_P_IP );
174+ $ s_bind = socket_bind ($ s_c , 'lo ' );
175+
176+ $ s_s = socket_create (AF_PACKET , SOCK_RAW , ETH_P_IP );
177+ $ v_bind = socket_bind ($ s_s , 'lo ' );
178+
179+ $ ip = hex2bin (
180+ "4500 " .
181+ str_repeat ("0028 " , 16 ) .
182+ "0000 " .
183+ "4000 " .
184+ "4006 " .
185+ "0000 " .
186+ "7f000001 " .
187+ "7f000001 "
188+ );
189+ $ p = str_repeat ("A " , 20 );
190+
191+ $ buf = pack ("H12H12n " , "ffffffffffff " , "000000000000 " , ETH_P_IP );
192+ $ buf .= $ ip . $ p ;
193+
194+ $ min_frame_size = 60 ;
195+ $ buf .= str_repeat ("\x00" , max (0 , $ min_frame_size - strlen ($ buf )));
196+
197+ var_dump (socket_sendto ($ s_s , $ buf , strlen ($ buf ), 0 , "lo " , 1 ));
198+
199+ try {
200+ socket_recvfrom ($ s_c , $ rsp , strlen ($ buf ), 0 , $ addr );
201+ } catch (\ValueError $ e ) {
202+ echo $ e ->getMessage (), PHP_EOL ;
203+ }
204+
205+ $ ip = hex2bin (
206+ "9999 " .
207+ "0028 " .
208+ "0000 " .
209+ "4000 " .
210+ "4006 " .
211+ "0000 " .
212+ "FFFFFeFF " .
213+ "7f000001 "
214+ );
215+ $ p = str_repeat ("Bb " , 80 );
216+
217+ $ buf = pack ("H12H12n " , "ffffffffffffh " , "aaaaaAAAAAAA " , ETH_P_IP );
218+ $ buf .= $ ip . $ p ;
219+
220+ $ min_frame_size = 60 ;
221+ $ buf .= str_repeat ("\x00" , max (0 , $ min_frame_size - strlen ($ buf )));
222+
223+ var_dump (socket_sendto ($ s_s , $ buf , strlen ($ buf ), 0 , "lo " , 1 ));
224+ var_dump (socket_recvfrom ($ s_c , $ rsp , strlen ($ buf ), 0 , $ addr ));
225+
226+ var_dump ($ addr );
227+ var_dump ($ rsp );
228+
229+ socket_close ($ s_s );
230+ socket_close ($ s_c );
47231?>
48232--EXPECTF--
49233bool(true)
50234bool(true)
51235string(2) "lo"
236+ int(%i)
237+
238+ Warning: socket_getpeername(): unable to retrieve peer name [95]: %sot supported in %s on line %d
239+ int(60)
240+ int(60)
241+ string(2) "lo"
242+ object(Socket\EthernetPacket)#3 (%d) {
243+ ["headerSize"]=>
244+ int(%d)
245+ ["rawPacket"]=>
246+ string(%d) "%r(.|\n)*?"%r
247+ ["socket"]=>
248+ object(Socket)#1 (0) {
249+ }
250+ ["ethProtocol"]=>
251+ int(%i)
252+ ["srcMac"]=>
253+ string(%d) "%s:%s:%s:%s:%s:%s"
254+ ["dstMac"]=>
255+ string(%d) "%s:%s:%s:%s:%s:%s"
256+ ["payload"]=>
257+ %a
258+ }
259+ int(60)
260+ unsupported ethernet protocol
261+ int(60)
262+ int(%d)
263+ string(2) "lo"
264+ object(Socket\EthernetPacket)#2 (7) {
265+ ["headerSize"]=>
266+ int(14)
267+ ["rawPacket"]=>
268+ string(%d) "%r(.|\n)*?"%r
269+ ["socket"]=>
270+ object(Socket)#%d (0) {
271+ }
272+ ["ethProtocol"]=>
273+ int(%d)
274+ ["srcMac"]=>
275+ string(%d) "%s:%s:%s:%s:%s:%s"
276+ ["dstMac"]=>
277+ string(%d) "%s:%s:%s:%s:%s:%s"
278+ ["payload"]=>
279+ object(Socket\Ipv%sPacket)#%d (5) {
280+ ["headerSize"]=>
281+ int(%d)
282+ ["rawPacket"]=>
283+ string(%d) "%r(.|\n)*?"%r
284+ ["srcAddr"]=>
285+ string(%d) "%s"
286+ ["dstAddr"]=>
287+ string(%d) "%s"
288+ ["payload"]=>
289+ object(Socket\%sPacket)#%d (4) {
290+ ["headerSize"]=>
291+ int(%d)
292+ ["rawPacket"]=>
293+ string(%d) "%r(.|\n)*?"%r
294+ ["srcPort"]=>
295+ int(%d)
296+ ["dstPort"]=>
297+ int(%d)
298+ }
299+ }
300+ }
301+ int(%d)
52302int(%d)
53- invalid transport header length
303+ string(2) "lo"
304+ object(Socket\EthernetPacket)#%d (7) {
305+ ["headerSize"]=>
306+ int(14)
307+ ["rawPacket"]=>
308+ string(%d) "%r(.|\n)*?"%r
309+ ["socket"]=>
310+ object(Socket)#3 (0) {
311+ }
312+ ["ethProtocol"]=>
313+ int(%d)
314+ ["srcMac"]=>
315+ string(%d) "%s:%s:%s:%s:%s:%s"
316+ ["dstMac"]=>
317+ string(%d) "%s:%s:%s:%s:%s:%s"
318+ ["payload"]=>
319+ object(Socket\Ipv6Packet)#%d (5) {
320+ ["headerSize"]=>
321+ int(%d)
322+ ["rawPacket"]=>
323+ string(%d) "%A"
324+ ["srcAddr"]=>
325+ string(%d) "%s"
326+ ["dstAddr"]=>
327+ string(%d) "%s"
328+ ["payload"]=>
329+ object(Socket\TcpPacket)#%d (4) {
330+ ["headerSize"]=>
331+ int(%d)
332+ ["rawPacket"]=>
333+ string(%d) "%r(.|\n)*?"%r
334+ ["srcPort"]=>
335+ int(%d)
336+ ["dstPort"]=>
337+ int(%d)
338+ }
339+ }
340+ }
341+ int(%d)
342+ unsupported ipv6 header protocol
343+ int(%d)
344+ %A
345+ int(%d)
346+ %A
347+ string(%d) "%s"
348+ object(Socket\EthernetPacket)#%d (7) {
349+ ["headerSize"]=>
350+ int(%d)
351+ ["rawPacket"]=>
352+ string(%d) "%r(.|\n)*?"%r
353+ ["socket"]=>
354+ object(Socket)#%d (0) {
355+ }
356+ ["ethProtocol"]=>
357+ int(2048)
358+ ["srcMac"]=>
359+ string(%d) "%s"
360+ ["dstMac"]=>
361+ string(%d) "%s"
362+ ["payload"]=>
363+ object(Socket\Ipv4Packet)#%d (5) {
364+ ["headerSize"]=>
365+ int(%d)
366+ ["rawPacket"]=>
367+ string(%d) "%s"
368+ ["srcAddr"]=>
369+ string(%d) "%s.%s.%s.%s"
370+ ["dstAddr"]=>
371+ string(%d) "%s.%s.%s.%s"
372+ ["payload"]=>
373+ object(Socket\TcpPacket)#%d (4) {
374+ ["headerSize"]=>
375+ int(%d)
376+ ["rawPacket"]=>
377+ string(%d) "%r(.|\n)*?"%r
378+ ["srcPort"]=>
379+ int(%d)
380+ ["dstPort"]=>
381+ int(%d)
382+ }
383+ }
384+ }
0 commit comments