@@ -16,154 +16,117 @@ if (PHP_INT_SIZE != 4) die("skip this test is for 32-bit only");
16
16
?>
17
17
--FILE--
18
18
<?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 );
22
21
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 ' ));
28
23
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 ));
31
27
32
- $ buf = pack ("H12H12n " , "ffffffffffff " , "000000000000 " , ETH_P_LOOP );
33
- $ buf .= str_repeat ("A " , 46 );
28
+ var_dump (socket_bind ($ sender , 'lo ' ));
34
29
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 ;
36
32
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 ));
61
34
62
- $ s_c = socket_create (AF_PACKET , SOCK_RAW , ETH_P_ALL );
63
- $ s_bind = socket_bind ($ s_c , 'lo ' );
35
+ usleep (10000 );
64
36
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 );
82
41
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 ' ));
85
44
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 ] );
87
46
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 ;
92
51
}
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 "
103
67
);
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 ));
108
71
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 ));
111
73
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 );
114
75
76
+ $ len = socket_recvfrom ($ receiver , $ rsp , 1500 , 0 , $ addr );
77
+ var_dump ($ len );
115
78
var_dump ($ addr );
116
79
var_dump ($ rsp );
117
-
118
- socket_close ($ s_s );
119
- socket_close ($ s_c );
80
+
81
+ socket_close ($ sender );
82
+ socket_close ($ receiver );
120
83
?>
121
84
--EXPECTF--
122
85
bool(true)
123
86
bool(true)
124
87
string(2) "lo"
125
- int(%d)
126
- int(%d)
88
+ bool(true)
89
+ bool(true)
90
+ int(60)
91
+ int(60)
92
+ string(2) "lo"
93
+ bool(true)
94
+ bool(false)
95
+ Socket receive timed out as expected.
96
+ bool(true)
127
97
int(60)
128
- unsupported ethernet protocol
129
- int(84)
130
- int(%d)
131
- int(%d)
132
- string(%d) "%s"
133
- object(Socket\EthernetPacket)#%d (7) {
98
+ int(60)
99
+ string(2) "lo"
100
+ object(Socket\EthernetPacket)#2 (7) {
134
101
["headerSize"]=>
135
- int(%d )
102
+ int(14 )
136
103
["rawPacket"]=>
137
- string(%d) "%s"
104
+ string (%d) "%s"
138
105
["socket"]=>
139
- object(Socket)#%d (0) {
106
+ object(Socket)#1 (0) {
140
107
}
141
108
["ethProtocol"]=>
142
- int(2048 )
109
+ int(96 )
143
110
["srcMac"]=>
144
111
string(%d) "%s"
145
112
["dstMac"]=>
146
113
string(%d) "%s"
147
114
["payload"]=>
148
- object(Socket\Ipv4Packet)#%d (5 ) {
115
+ object(Socket\EthernetPacket)#7 (7 ) {
149
116
["headerSize"]=>
150
- int(%d )
117
+ int(14 )
151
118
["rawPacket"]=>
119
+ NULL
120
+ ["socket"]=>
121
+ object(Socket)#1 (0) {
122
+ }
123
+ ["ethProtocol"]=>
124
+ int(0)
125
+ ["srcMac"]=>
126
+ string(%d) "%s"
127
+ ["dstMac"]=>
152
128
string(%d) "%s"
153
- ["srcAddr"]=>
154
- string(%d) "%s.%s.%s.%s"
155
- ["dstAddr"]=>
156
- string(%d) "%s.%s.%s.%s"
157
129
["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
- }
130
+ NULL
168
131
}
169
132
}
0 commit comments