@@ -127,7 +127,12 @@ static PHP_RSHUTDOWN_FUNCTION(sockets);
127127zend_class_entry * socket_ce ;
128128static 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
133138static 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
0 commit comments