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