Skip to content

Commit 5b45506

Browse files
committed
improve ipv6 part, update test
1 parent 04090d8 commit 5b45506

File tree

4 files changed

+105
-22
lines changed

4 files changed

+105
-22
lines changed

ext/sockets/sockets.c

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1766,12 +1766,56 @@ PHP_FUNCTION(socket_recvfrom)
17661766
char s[INET6_ADDRSTRLEN], d[INET6_ADDRSTRLEN];
17671767
inet_ntop(AF_INET6, &ip->saddr, s, sizeof(s));
17681768
inet_ntop(AF_INET6, &ip->daddr, d, sizeof(d));
1769+
zval szpayload;
17691770
object_init_ex(&zpayload, ipv6packet_ce);
17701771
zend_update_property_string(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("srcAddr"), s);
17711772
zend_update_property_string(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("dstAddr"), d);
17721773
zend_update_property_long(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("headerSize"), totalip);
17731774
zend_update_property_string(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("rawPacket"), (char *)payload);
1774-
// TODO completing
1775+
unsigned char ipprotocol = ip->nexthdr;
1776+
unsigned char *ipdata = payload + sizeof(*ip);
1777+
1778+
switch (ipprotocol) {
1779+
case IPPROTO_TCP: {
1780+
struct tcphdr a;
1781+
memcpy(&a, ipdata, sizeof(a));
1782+
struct tcphdr *tcp = &a;
1783+
object_init_ex(&szpayload, tcppacket_ce);
1784+
zend_update_property_long(Z_OBJCE(szpayload), Z_OBJ(szpayload), ZEND_STRL("srcPort"), ntohs(tcp->th_sport));
1785+
zend_update_property_long(Z_OBJCE(szpayload), Z_OBJ(szpayload), ZEND_STRL("dstPort"), ntohs(tcp->th_dport));
1786+
zend_update_property_long(Z_OBJCE(szpayload), Z_OBJ(szpayload), ZEND_STRL("headerSize"), sizeof(*tcp));
1787+
zend_update_property_string(Z_OBJCE(szpayload), Z_OBJ(szpayload), ZEND_STRL("rawPacket"), (char *)ipdata);
1788+
zend_update_property(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("payload"), &szpayload);
1789+
Z_DELREF(szpayload);
1790+
break;
1791+
}
1792+
case IPPROTO_UDP: {
1793+
struct udphdr a;
1794+
memcpy(&a, ipdata, sizeof(a));
1795+
struct udphdr *udp = &a;
1796+
object_init_ex(&szpayload, udppacket_ce);
1797+
zend_update_property_long(Z_OBJCE(szpayload), Z_OBJ(szpayload), ZEND_STRL("srcPort"), ntohs(udp->uh_sport));
1798+
zend_update_property_long(Z_OBJCE(szpayload), Z_OBJ(szpayload), ZEND_STRL("dstPort"), ntohs(udp->uh_dport));
1799+
zend_update_property_long(Z_OBJCE(szpayload), Z_OBJ(szpayload), ZEND_STRL("headerSize"), sizeof(*udp));
1800+
zend_update_property_string(Z_OBJCE(szpayload), Z_OBJ(szpayload), ZEND_STRL("rawPacket"), (char *)ipdata);
1801+
zend_update_property(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("payload"), &szpayload);
1802+
Z_DELREF(szpayload);
1803+
break;
1804+
}
1805+
// TODO IPPROTO_ICMPV6 support
1806+
default:
1807+
zend_update_property(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("payload"), &zpayload);
1808+
zend_update_property_string(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("rawPacket"), ZSTR_VAL(recv_buf));
1809+
zend_string_efree(recv_buf);
1810+
ZEND_TRY_ASSIGN_REF_VALUE(arg2, &obj);
1811+
ZEND_TRY_ASSIGN_REF_STRING(arg5, ifrname);
1812+
1813+
if (arg6) {
1814+
ZEND_TRY_ASSIGN_REF_LONG(arg6, sll.sll_ifindex);
1815+
}
1816+
zend_value_error("unsupported ip header protocol");
1817+
RETURN_THROWS();
1818+
}
17751819
break;
17761820
}
17771821
case ETH_P_LOOP: {

ext/sockets/sockets.stub.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2211,6 +2211,7 @@ final class Ipv6Packet extends Packet
22112211
{
22122212
public string $srcAddr;
22132213
public string $dstAddr;
2214+
public ?Packet $payload;
22142215
}
22152216
#endif
22162217
}

ext/sockets/sockets_arginfo.h

Lines changed: 8 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ext/sockets/tests/socket_afpacket.phpt

Lines changed: 51 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -94,19 +94,39 @@ if (!function_exists("posix_getuid") || posix_getuid() != 0) {
9494
$s_s = socket_create(AF_PACKET, SOCK_RAW, ETH_P_IPV6);
9595
$v_bind = socket_bind($s_s, 'lo');
9696

97-
$ip = hex2bin(
98-
"60000000" .
99-
"0014" .
100-
"3A" .
101-
"40" .
102-
"00000000000000000000000000000001" .
103-
"00000000000000000000000000000001"
104-
);
97+
$ethhdr = pack("H12H12n", "ffffffffffff", "000000000000", ETH_P_IPV6);
98+
99+
$ipv6_first_4 = hex2bin("60000000");
100+
101+
$ipv6_payload_len = hex2bin("0014");
102+
103+
$ipv6_nexthdr = chr(6);
104+
105+
$ipv6_hop_limit = chr(64);
105106

106-
$payload = str_repeat("A", 20);
107+
$src_ip = hex2bin("00000000000000000000000000000001");
107108

108-
$buf = pack("H12H12n", "ffffffffffff", "000000000000", ETH_P_IPV6);
109-
$buf .= $ip . $payload;
109+
$dst_ip = hex2bin("00000000000000000000000000000001");
110+
111+
$tcp_hdr = pack("nnNNCCnn",
112+
12345,
113+
80,
114+
0,
115+
0,
116+
(5 << 4),
117+
0x02,
118+
65535,
119+
0
120+
);
121+
122+
$buf = $ethhdr
123+
. $ipv6_first_4
124+
. $ipv6_payload_len
125+
. $ipv6_nexthdr
126+
. $ipv6_hop_limit
127+
. $src_ip
128+
. $dst_ip
129+
. $tcp_hdr;
110130

111131
$buf .= str_repeat("\x00", max(0, 60 - strlen($buf)));
112132

@@ -165,7 +185,7 @@ object(Socket\EthernetPacket)#2 (7) {
165185
["dstMac"]=>
166186
string(%d) "%s:%s:%s:%s:%s:%s"
167187
["payload"]=>
168-
object(Socket\Ipv4Packet)#10 (5) {
188+
object(Socket\Ipv4Packet)#%d (5) {
169189
["headerSize"]=>
170190
int(%d)
171191
["rawPacket"]=>
@@ -175,7 +195,7 @@ object(Socket\EthernetPacket)#2 (7) {
175195
["dstAddr"]=>
176196
string(%d) "%d.%d.%d.%d"
177197
["payload"]=>
178-
object(Socket\%sPacket)#11 (4) {
198+
object(Socket\%sPacket)#%d (4) {
179199
["headerSize"]=>
180200
int(%d)
181201
["rawPacket"]=>
@@ -187,10 +207,10 @@ object(Socket\EthernetPacket)#2 (7) {
187207
}
188208
}
189209
}
190-
int(74)
191-
int(74)
210+
int(%d)
211+
int(%d)
192212
string(2) "lo"
193-
object(Socket\EthernetPacket)#9 (7) {
213+
object(Socket\EthernetPacket)#%d (7) {
194214
["headerSize"]=>
195215
int(14)
196216
["rawPacket"]=>
@@ -203,16 +223,27 @@ object(Socket\EthernetPacket)#9 (7) {
203223
["srcMac"]=>
204224
string(%d) "%s:%s:%s:%s:%s:%s"
205225
["dstMac"]=>
206-
string(17) "%s:%s:%s:%s:%s:%s"
226+
string(%d) "%s:%s:%s:%s:%s:%s"
207227
["payload"]=>
208-
object(Socket\Ipv6Packet)#1 (4) {
228+
object(Socket\Ipv6Packet)#%d (5) {
209229
["headerSize"]=>
210-
int(5160)
230+
int(%d)
211231
["rawPacket"]=>
212-
string(%d) "%s"
232+
string(%d) "%A"
213233
["srcAddr"]=>
214234
string(%d) "%s"
215235
["dstAddr"]=>
216236
string(%d) "%s"
237+
["payload"]=>
238+
object(Socket\TcpPacket)#%d (4) {
239+
["headerSize"]=>
240+
int(%d)
241+
["rawPacket"]=>
242+
string(%d) "%A"
243+
["srcPort"]=>
244+
int(%d)
245+
["dstPort"]=>
246+
int(%d)
247+
}
217248
}
218249
}

0 commit comments

Comments
 (0)