Skip to content

Commit 57a17bd

Browse files
committed
address most of remarks
1 parent 91947f6 commit 57a17bd

File tree

5 files changed

+291
-55
lines changed

5 files changed

+291
-55
lines changed

ext/sockets/php_sockets.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,12 @@ typedef struct {
7878
extern PHP_SOCKETS_API zend_class_entry *socket_ce;
7979

8080
#ifdef AF_PACKET
81-
extern PHP_SOCKETS_API zend_class_entry *socket_ethinfo_ce;
81+
extern PHP_SOCKETS_API zend_class_entry *packet_ce;
82+
extern PHP_SOCKETS_API zend_class_entry *ethinfopacket_ce;
83+
extern PHP_SOCKETS_API zend_class_entry *tcppacket_ce;
84+
extern PHP_SOCKETS_API zend_class_entry *udppacket_ce;
85+
extern PHP_SOCKETS_API zend_class_entry *ipv4packet_ce;
86+
extern PHP_SOCKETS_API zend_class_entry *ipv6packet_ce;
8287
#endif
8388

8489
static inline php_socket *socket_from_obj(zend_object *obj) {

ext/sockets/sockets.c

Lines changed: 49 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,12 @@ static PHP_RSHUTDOWN_FUNCTION(sockets);
127127
zend_class_entry *socket_ce;
128128
static zend_object_handlers socket_object_handlers;
129129
#ifdef AF_PACKET
130-
zend_class_entry *socket_ethinfo_ce;
130+
zend_class_entry *packet_ce;
131+
zend_class_entry *ethpacket_ce;
132+
zend_class_entry *tcppacket_ce;
133+
zend_class_entry *udppacket_ce;
134+
zend_class_entry *ipv4packet_ce;
135+
zend_class_entry *ipv6packet_ce;
131136
#endif
132137

133138
static zend_object *socket_create_object(zend_class_entry *class_type) {
@@ -492,7 +497,12 @@ static PHP_MINIT_FUNCTION(sockets)
492497
socket_object_handlers.compare = zend_objects_not_comparable;
493498

494499
#if defined(AF_PACKET)
495-
socket_ethinfo_ce = register_class_SocketEthernetInfo();
500+
packet_ce = register_class_Packet();
501+
ethpacket_ce = register_class_EthernetPacket(packet_ce);
502+
tcppacket_ce = register_class_TcpPacket(packet_ce);
503+
udppacket_ce = register_class_UdpPacket(packet_ce);
504+
ipv4packet_ce = register_class_Ipv4Packet(packet_ce);
505+
ipv6packet_ce = register_class_Ipv6Packet(packet_ce);
496506
#endif
497507
address_info_ce = register_class_AddressInfo();
498508
address_info_ce->create_object = address_info_create_object;
@@ -1666,40 +1676,50 @@ PHP_FUNCTION(socket_recvfrom)
16661676
unsigned char *payload;
16671677

16681678
zval obj;
1669-
object_init_ex(&obj, socket_ethinfo_ce);
1679+
object_init_ex(&obj, ethpacket_ce);
1680+
zend_update_property(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("socket"), arg1);
1681+
zend_update_property_long(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("headersize"), sizeof(*e));
1682+
zend_update_property_long(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("ethprotocol"), protocol);
16701683

16711684
switch (protocol) {
16721685
case ETH_P_IP: {
1673-
payload = ((unsigned char *)e + sizeof(struct ethhdr));
1686+
payload = ((unsigned char *)e + ETH_HLEN);
16741687
struct iphdr *ip = (struct iphdr *)payload;
16751688
unsigned char *ipdata = payload + (ip->ihl * 4);
16761689
struct in_addr s, d;
16771690
s.s_addr = ip->saddr;
16781691
d.s_addr = ip->daddr;
1692+
zval szpayload;
1693+
object_init_ex(&zpayload, ipv4packet_ce);
1694+
zend_update_property_string(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("ipsrc"), inet_ntoa(s));
1695+
zend_update_property_string(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("ipdst"), inet_ntoa(d));
1696+
zend_update_property_long(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("headersize"), sizeof(*ip));
1697+
zend_update_property(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("socket"), arg1);
16791698

16801699
switch (ip->protocol) {
16811700
case IPPROTO_TCP: {
16821701
struct tcphdr *tcp = (struct tcphdr *)ipdata;
1683-
object_init(&zpayload);
1684-
zend_update_property_string(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("ipsrc"), inet_ntoa(s));
1685-
zend_update_property_string(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("ipdst"), inet_ntoa(d));
1686-
zend_update_property_long(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("portsrc"), ntohs(tcp->th_sport));
1687-
zend_update_property_long(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("portdst"), ntohs(tcp->th_dport));
1702+
object_init_ex(&szpayload, tcppacket_ce);
1703+
zend_update_property_long(Z_OBJCE(szpayload), Z_OBJ(szpayload), ZEND_STRL("srcport"), ntohs(tcp->th_sport));
1704+
zend_update_property_long(Z_OBJCE(szpayload), Z_OBJ(szpayload), ZEND_STRL("dstport"), ntohs(tcp->th_dport));
1705+
zend_update_property_long(Z_OBJCE(szpayload), Z_OBJ(szpayload), ZEND_STRL("headersize"), sizeof(*tcp));
1706+
zend_update_property(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("payload"), &szpayload);
16881707
break;
16891708
}
16901709
case IPPROTO_UDP: {
16911710
struct udphdr *udp = (struct udphdr *)ipdata;
1692-
object_init(&zpayload);
1693-
zend_update_property_string(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("ipsrc"), inet_ntoa(s));
1694-
zend_update_property_string(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("ipdst"), inet_ntoa(d));
1695-
zend_update_property_long(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("portsrc"), ntohs(udp->uh_sport));
1696-
zend_update_property_long(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("portdst"), ntohs(udp->uh_dport));
1711+
object_init_ex(&szpayload, udppacket_ce);
1712+
zend_update_property_string(Z_OBJCE(szpayload), Z_OBJ(szpayload), ZEND_STRL("ipsrc"), inet_ntoa(s));
1713+
zend_update_property_string(Z_OBJCE(szpayload), Z_OBJ(szpayload), ZEND_STRL("ipdst"), inet_ntoa(d));
1714+
zend_update_property_long(Z_OBJCE(szpayload), Z_OBJ(szpayload), ZEND_STRL("srcport"), ntohs(udp->uh_sport));
1715+
zend_update_property_long(Z_OBJCE(szpayload), Z_OBJ(szpayload), ZEND_STRL("dstport"), ntohs(udp->uh_dport));
1716+
zend_update_property_long(Z_OBJCE(szpayload), Z_OBJ(szpayload), ZEND_STRL("headersize"), sizeof(*udp));
1717+
zend_update_property(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("payload"), &szpayload);
16971718
break;
16981719
}
16991720
default:
1700-
ZVAL_NULL(&zpayload);
17011721
zend_update_property(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("payload"), &zpayload);
1702-
zend_update_property_string(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("rawpayload"), ZSTR_VAL(recv_buf));
1722+
zend_update_property_string(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("rawpacket"), ZSTR_VAL(recv_buf));
17031723
zend_string_efree(recv_buf);
17041724
ZEND_TRY_ASSIGN_REF_VALUE(arg2, &obj);
17051725
ZEND_TRY_ASSIGN_REF_STRING(arg5, ifrname);
@@ -1713,27 +1733,35 @@ PHP_FUNCTION(socket_recvfrom)
17131733
break;
17141734
}
17151735
case ETH_P_IPV6: {
1716-
payload = ((unsigned char *)e + sizeof(struct ethhdr));
1736+
payload = ((unsigned char *)e + ETH_HLEN);
17171737
struct ipv6hdr *ip = (struct ipv6hdr *)payload;
17181738
char s[INET6_ADDRSTRLEN], d[INET6_ADDRSTRLEN];
17191739
inet_ntop(AF_INET6, &ip->saddr, s, sizeof(s));
17201740
inet_ntop(AF_INET6, &ip->daddr, d, sizeof(d));
1721-
object_init(&zpayload);
1741+
object_init_ex(&zpayload, ipv6packet_ce);
17221742
zend_update_property_string(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("ipsrc"), s);
17231743
zend_update_property_string(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("ipdst"), d);
1744+
zend_update_property_long(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("headersize"), sizeof(*ip));
17241745
break;
17251746
}
17261747
case ETH_P_LOOP: {
17271748
struct ethhdr *innere = (struct ethhdr *)((unsigned char *)e + ETH_HLEN);
1728-
object_init(&zpayload);
1749+
zval innerp;
1750+
ZVAL_NULL(&innerp);
1751+
object_init_ex(&zpayload, ethpacket_ce);
17291752
zend_update_property_string(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("macsrc"), ether_ntoa((struct ether_addr *)innere->h_source));
17301753
zend_update_property_string(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("macdst"), ether_ntoa((struct ether_addr *)innere->h_dest));
1754+
zend_update_property_long(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("headersize"), sizeof(*innere));
1755+
zend_update_property(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("socket"), arg1);
1756+
zend_update_property(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("rawpacket"), &innerp);
1757+
zend_update_property(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("payload"), &innerp);
1758+
zend_update_property_long(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("ethprotocol"), 0);
17311759
break;
17321760
}
17331761
default:
17341762
ZVAL_NULL(&zpayload);
17351763
zend_update_property(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("payload"), &zpayload);
1736-
zend_update_property_string(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("rawpayload"), ZSTR_VAL(recv_buf));
1764+
zend_update_property_string(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("rawpacket"), ZSTR_VAL(recv_buf));
17371765
zend_string_efree(recv_buf);
17381766
ZEND_TRY_ASSIGN_REF_VALUE(arg2, &obj);
17391767
ZEND_TRY_ASSIGN_REF_STRING(arg5, ifrname);
@@ -1745,12 +1773,10 @@ PHP_FUNCTION(socket_recvfrom)
17451773
RETURN_THROWS();
17461774
}
17471775

1748-
zend_update_property(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("socket"), arg1);
17491776
zend_update_property_string(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("macsrc"), ether_ntoa((struct ether_addr *)e->h_source));
17501777
zend_update_property_string(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("macdst"), ether_ntoa((struct ether_addr *)e->h_dest));
1751-
zend_update_property_long(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("ethprotocol"), protocol);
17521778
zend_update_property(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("payload"), &zpayload);
1753-
zend_update_property_string(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("rawpayload"), ZSTR_VAL(recv_buf));
1779+
zend_update_property_string(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("rawpacket"), ZSTR_VAL(recv_buf));
17541780
Z_DELREF(zpayload);
17551781
zend_string_efree(recv_buf);
17561782

ext/sockets/sockets.stub.php

Lines changed: 45 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2170,19 +2170,51 @@ function socket_wsaprotocol_info_release(string $info_id): bool {}
21702170
#endif
21712171

21722172
#ifdef AF_PACKET
2173-
final class SocketEthernetInfo
2173+
readonly class Packet
21742174
{
2175-
/** @readonly **/
2176-
public Socket $socket;
2177-
/** @readonly **/
2178-
public int $ethprotocol;
2179-
/** @readonly **/
2180-
public string $macsrc;
2181-
/** @readonly **/
2182-
public string $macdst;
2183-
/** @readonly **/
2184-
public string $rawpayload;
2185-
/** @readonly **/
2186-
public ?object $payload;
2175+
public int $headersize;
2176+
public ?string $rawpacket;
2177+
}
2178+
2179+
2180+
final readonly class EthernetPacket extends Packet
2181+
{
2182+
public Socket $socket;
2183+
public int $ethprotocol;
2184+
public string $macsrc;
2185+
public string $macdst;
2186+
public Ipv4Packet|Ipv6Packet|EthernetPacket|null $payload;
2187+
}
2188+
2189+
final readonly class TcpPacket extends Packet
2190+
{
2191+
public string $srcaddr;
2192+
public string $dstaddr;
2193+
public string $srcport;
2194+
public string $dstport;
2195+
public ?object $payload;
2196+
}
2197+
2198+
final readonly class UdpPacket extends Packet
2199+
{
2200+
public string $srcaddr;
2201+
public string $dstaddr;
2202+
public string $srcport;
2203+
public string $dstport;
2204+
public ?object $payload;
2205+
}
2206+
2207+
final readonly class Ipv4Packet extends Packet
2208+
{
2209+
public string $srcaddr;
2210+
public string $dstaddr;
2211+
public ?object $payload;
2212+
}
2213+
2214+
final readonly class Ipv6Packet extends Packet
2215+
{
2216+
public string $srcaddr;
2217+
public string $dstaddr;
2218+
public ?object $payload;
21872219
}
21882220
#endif

0 commit comments

Comments
 (0)