@@ -127,7 +127,12 @@ static PHP_RSHUTDOWN_FUNCTION(sockets);
127
127
zend_class_entry * socket_ce ;
128
128
static zend_object_handlers socket_object_handlers ;
129
129
#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 ;
131
136
#endif
132
137
133
138
static zend_object * socket_create_object (zend_class_entry * class_type ) {
@@ -492,7 +497,12 @@ static PHP_MINIT_FUNCTION(sockets)
492
497
socket_object_handlers .compare = zend_objects_not_comparable ;
493
498
494
499
#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 );
496
506
#endif
497
507
address_info_ce = register_class_AddressInfo ();
498
508
address_info_ce -> create_object = address_info_create_object ;
@@ -1666,40 +1676,50 @@ PHP_FUNCTION(socket_recvfrom)
1666
1676
unsigned char * payload ;
1667
1677
1668
1678
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 );
1670
1683
1671
1684
switch (protocol ) {
1672
1685
case ETH_P_IP : {
1673
- payload = ((unsigned char * )e + sizeof ( struct ethhdr ) );
1686
+ payload = ((unsigned char * )e + ETH_HLEN );
1674
1687
struct iphdr * ip = (struct iphdr * )payload ;
1675
1688
unsigned char * ipdata = payload + (ip -> ihl * 4 );
1676
1689
struct in_addr s , d ;
1677
1690
s .s_addr = ip -> saddr ;
1678
1691
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 );
1679
1698
1680
1699
switch (ip -> protocol ) {
1681
1700
case IPPROTO_TCP : {
1682
1701
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 );
1688
1707
break ;
1689
1708
}
1690
1709
case IPPROTO_UDP : {
1691
1710
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 );
1697
1718
break ;
1698
1719
}
1699
1720
default :
1700
- ZVAL_NULL (& zpayload );
1701
1721
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 ));
1703
1723
zend_string_efree (recv_buf );
1704
1724
ZEND_TRY_ASSIGN_REF_VALUE (arg2 , & obj );
1705
1725
ZEND_TRY_ASSIGN_REF_STRING (arg5 , ifrname );
@@ -1713,27 +1733,35 @@ PHP_FUNCTION(socket_recvfrom)
1713
1733
break ;
1714
1734
}
1715
1735
case ETH_P_IPV6 : {
1716
- payload = ((unsigned char * )e + sizeof ( struct ethhdr ) );
1736
+ payload = ((unsigned char * )e + ETH_HLEN );
1717
1737
struct ipv6hdr * ip = (struct ipv6hdr * )payload ;
1718
1738
char s [INET6_ADDRSTRLEN ], d [INET6_ADDRSTRLEN ];
1719
1739
inet_ntop (AF_INET6 , & ip -> saddr , s , sizeof (s ));
1720
1740
inet_ntop (AF_INET6 , & ip -> daddr , d , sizeof (d ));
1721
- object_init (& zpayload );
1741
+ object_init_ex (& zpayload , ipv6packet_ce );
1722
1742
zend_update_property_string (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("ipsrc" ), s );
1723
1743
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 ));
1724
1745
break ;
1725
1746
}
1726
1747
case ETH_P_LOOP : {
1727
1748
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 );
1729
1752
zend_update_property_string (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("macsrc" ), ether_ntoa ((struct ether_addr * )innere -> h_source ));
1730
1753
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 );
1731
1759
break ;
1732
1760
}
1733
1761
default :
1734
1762
ZVAL_NULL (& zpayload );
1735
1763
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 ));
1737
1765
zend_string_efree (recv_buf );
1738
1766
ZEND_TRY_ASSIGN_REF_VALUE (arg2 , & obj );
1739
1767
ZEND_TRY_ASSIGN_REF_STRING (arg5 , ifrname );
@@ -1745,12 +1773,10 @@ PHP_FUNCTION(socket_recvfrom)
1745
1773
RETURN_THROWS ();
1746
1774
}
1747
1775
1748
- zend_update_property (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("socket" ), arg1 );
1749
1776
zend_update_property_string (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("macsrc" ), ether_ntoa ((struct ether_addr * )e -> h_source ));
1750
1777
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 );
1752
1778
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 ));
1754
1780
Z_DELREF (zpayload );
1755
1781
zend_string_efree (recv_buf );
1756
1782
0 commit comments