@@ -1403,7 +1403,7 @@ PHP_FUNCTION(socket_bind)
1403
1403
}
1404
1404
#endif
1405
1405
default :
1406
- zend_argument_value_error (1 , "must be one of AF_UNIX, AF_INET, or AF_INET6" );
1406
+ zend_argument_value_error (1 , "must be one of AF_UNIX, AF_PACKET, AF_INET, or AF_INET6" );
1407
1407
RETURN_THROWS ();
1408
1408
}
1409
1409
@@ -1504,6 +1504,9 @@ PHP_FUNCTION(socket_recvfrom)
1504
1504
struct sockaddr_in sin ;
1505
1505
#ifdef HAVE_IPV6
1506
1506
struct sockaddr_in6 sin6 ;
1507
+ #endif
1508
+ #ifdef AF_PACKET
1509
+ struct sockaddr_ll sll ;
1507
1510
#endif
1508
1511
char addrbuf [INET6_ADDRSTRLEN ];
1509
1512
socklen_t slen ;
@@ -1608,9 +1611,39 @@ PHP_FUNCTION(socket_recvfrom)
1608
1611
ZEND_TRY_ASSIGN_REF_STRING (arg5 , addrbuf [0 ] ? addrbuf : "::" );
1609
1612
ZEND_TRY_ASSIGN_REF_LONG (arg6 , ntohs (sin6 .sin6_port ));
1610
1613
break ;
1614
+ #endif
1615
+ #ifdef AF_PACKET
1616
+ case AF_PACKET :
1617
+ // TODO expose and use proper ethernet frame type instead i.e. src mac, dst mac and payload to userland
1618
+ // ditto for socket_sendto
1619
+ slen = sizeof (sll );
1620
+ memset (& sll , 0 , sizeof (sll ));
1621
+ sll .sll_family = AF_PACKET ;
1622
+ char ifrname [IFNAMSIZ ];
1623
+
1624
+ retval = recvfrom (php_sock -> bsd_socket , ZSTR_VAL (recv_buf ), arg3 , arg4 , (struct sockaddr * )& sll , (socklen_t * )& slen );
1625
+
1626
+ if (retval < 0 ) {
1627
+ PHP_SOCKET_ERROR (php_sock , "unable to recvfrom" , errno );
1628
+ zend_string_efree (recv_buf );
1629
+ RETURN_FALSE ;
1630
+ }
1631
+ ZSTR_LEN (recv_buf ) = retval ;
1632
+ ZSTR_VAL (recv_buf )[ZSTR_LEN (recv_buf )] = '\0' ;
1633
+
1634
+ if (UNEXPECTED (!if_indextoname (sll .sll_ifindex , ifrname ))) {
1635
+ PHP_SOCKET_ERROR (php_sock , "unable to get the interface name" , errno );
1636
+ zend_string_efree (recv_buf );
1637
+ RETURN_FALSE ;
1638
+ }
1639
+
1640
+ ZEND_TRY_ASSIGN_REF_NEW_STR (arg2 , recv_buf );
1641
+ ZEND_TRY_ASSIGN_REF_STRING (arg5 , ifrname );
1642
+ ZEND_TRY_ASSIGN_REF_LONG (arg6 , sll .sll_ifindex );
1643
+ break ;
1611
1644
#endif
1612
1645
default :
1613
- zend_argument_value_error (1 , "must be one of AF_UNIX, AF_INET, or AF_INET6" );
1646
+ zend_argument_value_error (1 , "must be one of AF_UNIX, AF_PACKET, AF_INET, or AF_INET6" );
1614
1647
RETURN_THROWS ();
1615
1648
}
1616
1649
0 commit comments