58
58
# ifdef HAVE_NETINET_ETHER_H
59
59
# include <netinet/ether.h>
60
60
# include <netinet/ip.h>
61
+ # include <linux/ipv6.h>
61
62
# endif
62
63
# if defined(HAVE_LINUX_SOCK_DIAG_H )
63
64
# include <linux/sock_diag.h>
@@ -1628,8 +1629,6 @@ PHP_FUNCTION(socket_recvfrom)
1628
1629
#endif
1629
1630
#ifdef AF_PACKET
1630
1631
case AF_PACKET :
1631
- // TODO expose and use proper ethernet frame type instead i.e. src mac, dst mac and payload to userland
1632
- // ditto for socket_sendto
1633
1632
slen = sizeof (sll );
1634
1633
memset (& sll , 0 , sizeof (sll ));
1635
1634
sll .sll_family = AF_PACKET ;
@@ -1688,6 +1687,24 @@ PHP_FUNCTION(socket_recvfrom)
1688
1687
}
1689
1688
break ;
1690
1689
}
1690
+ case ETH_P_IPV6 : {
1691
+ struct ipv6hdr * ip = (struct ipv6hdr * )payload ;
1692
+ char s [INET6_ADDRSTRLEN ], d [INET6_ADDRSTRLEN ];
1693
+ inet_ntop (AF_INET6 , & ip -> saddr , s , sizeof (s ));
1694
+ inet_ntop (AF_INET6 , & ip -> daddr , d , sizeof (d ));
1695
+ add_assoc_string (& zpayload , "ipsrc" , s );
1696
+ add_assoc_string (& zpayload , "ipdst" , d );
1697
+ break ;
1698
+ }
1699
+ case ETH_P_LOOP : {
1700
+ struct iphdr * ip = (struct iphdr * )payload ;
1701
+ struct in_addr s , d ;
1702
+ s .s_addr = ip -> saddr ;
1703
+ d .s_addr = ip -> daddr ;
1704
+ add_assoc_string (& zpayload , "ipsrc" , inet_ntoa (s ));
1705
+ add_assoc_string (& zpayload , "ipdst" , inet_ntoa (d ));
1706
+ break ;
1707
+ }
1691
1708
default :
1692
1709
zend_value_error ("unsupported ethernet protocol" );
1693
1710
RETURN_THROWS ();
@@ -1719,7 +1736,7 @@ PHP_FUNCTION(socket_sendto)
1719
1736
struct sockaddr_in6 sin6 ;
1720
1737
#endif
1721
1738
#ifdef AF_PACKET
1722
- // struct sockaddr_ll sll;
1739
+ struct sockaddr_ll sll ;
1723
1740
#endif
1724
1741
int retval ;
1725
1742
size_t buf_len ;
@@ -1796,7 +1813,6 @@ PHP_FUNCTION(socket_sendto)
1796
1813
break ;
1797
1814
#endif
1798
1815
#ifdef AF_PACKET
1799
- /*
1800
1816
case AF_PACKET :
1801
1817
if (port_is_null ) {
1802
1818
zend_argument_value_error (6 , "cannot be null when the socket type is AF_PACKET" );
@@ -1806,10 +1822,11 @@ PHP_FUNCTION(socket_sendto)
1806
1822
memset (& sll , 0 , sizeof (sll ));
1807
1823
sll .sll_family = AF_PACKET ;
1808
1824
sll .sll_ifindex = port ;
1825
+ sll .sll_halen = ETH_ALEN ;
1809
1826
1827
+ // TODO allows to use more user friendly type to replace raw buffer usage
1810
1828
retval = sendto (php_sock -> bsd_socket , buf , ((size_t )len > buf_len ) ? buf_len : (size_t )len , flags , (struct sockaddr * ) & sin , sizeof (sin ));
1811
1829
break ;
1812
- */
1813
1830
#endif
1814
1831
default :
1815
1832
zend_argument_value_error (1 , "must be one of AF_UNIX, AF_INET, or AF_INET6" );
0 commit comments