diff --git a/erts/emulator/nifs/common/prim_socket_nif.c b/erts/emulator/nifs/common/prim_socket_nif.c index 80d7072c9ae3..6db99c5e6012 100644 --- a/erts/emulator/nifs/common/prim_socket_nif.c +++ b/erts/emulator/nifs/common/prim_socket_nif.c @@ -827,11 +827,29 @@ const ESockFlag esock_ioctl_flags[] = { // FreeBSD, ... { #ifdef IFF_NOGROUP - IFF_NOGROUP, + IFF_NOGROUP, #else - 0, + 0, +#endif + &esock_atom_nogroup}, + + // Solaris, ... + { +#ifdef IFF_DHCPRUNNING + IFF_DHCPRUNNING, +#else + 0, #endif - &esock_atom_nogroup} + &esock_atom_dhcprunning}, + + // Solaris, ... + { +#ifdef IFF_PRIVATE + IFF_PRIVATE, +#else + 0, +#endif + &esock_atom_private} }; const int esock_ioctl_flags_length = NUM(esock_ioctl_flags); @@ -2007,6 +2025,7 @@ static const struct in6_addr in6addr_loopback = GLOBAL_ATOM_DECL(default_send_params); \ GLOBAL_ATOM_DECL(delayed_ack_time); \ GLOBAL_ATOM_DECL(dgram); \ + GLOBAL_ATOM_DECL(dhcprunning); \ GLOBAL_ATOM_DECL(disable_fragments); \ GLOBAL_ATOM_DECL(dlci); \ GLOBAL_ATOM_DECL(dma); \ @@ -2182,6 +2201,7 @@ static const struct in6_addr in6addr_loopback = GLOBAL_ATOM_DECL(primary_addr); \ GLOBAL_ATOM_DECL(prim_file); \ GLOBAL_ATOM_DECL(priority); \ + GLOBAL_ATOM_DECL(private); \ GLOBAL_ATOM_DECL(promisc); \ GLOBAL_ATOM_DECL(pronet); \ GLOBAL_ATOM_DECL(protocol); \ @@ -2361,7 +2381,7 @@ ERL_NIF_TERM esock_atom_socket_tag; // This has a "special" name ('$socket') LOCAL_ATOM_DECL(exclude); \ LOCAL_ATOM_DECL(false); \ LOCAL_ATOM_DECL(frag_needed); \ - LOCAL_ATOM_DECL(genhwaddr); \ + LOCAL_ATOM_DECL(genaddr); \ LOCAL_ATOM_DECL(gifaddr); \ LOCAL_ATOM_DECL(gifbrdaddr); \ LOCAL_ATOM_DECL(gifconf); \ @@ -4881,6 +4901,7 @@ ERL_NIF_TERM esock_supports_ioctl_requests(ErlNifEnv* env) requests = MKEL(env); + /* --- GET REQUESTS --- */ #if defined(SIOCGIFCONF) requests = MKC(env, MKT2(env, atom_gifconf, MKUL(env, SIOCGIFCONF)), requests); diff --git a/erts/emulator/nifs/common/socket_int.h b/erts/emulator/nifs/common/socket_int.h index c88efdd02d0a..46f4573086d4 100644 --- a/erts/emulator/nifs/common/socket_int.h +++ b/erts/emulator/nifs/common/socket_int.h @@ -281,6 +281,7 @@ typedef long ssize_t; GLOBAL_ATOM_DEF(default_send_params); \ GLOBAL_ATOM_DEF(delayed_ack_time); \ GLOBAL_ATOM_DEF(dgram); \ + GLOBAL_ATOM_DEF(dhcprunning); \ GLOBAL_ATOM_DEF(disable_fragments); \ GLOBAL_ATOM_DEF(dlci); \ GLOBAL_ATOM_DEF(dma); \ @@ -454,8 +455,9 @@ typedef long ssize_t; GLOBAL_ATOM_DEF(portrange); \ GLOBAL_ATOM_DEF(portsel); \ GLOBAL_ATOM_DEF(primary_addr); \ - GLOBAL_ATOM_DEF(priority); \ GLOBAL_ATOM_DEF(prim_file); \ + GLOBAL_ATOM_DEF(priority); \ + GLOBAL_ATOM_DEF(private); \ GLOBAL_ATOM_DEF(promisc); \ GLOBAL_ATOM_DEF(pronet); \ GLOBAL_ATOM_DEF(protocol); \ diff --git a/erts/emulator/nifs/unix/unix_socket_syncio.c b/erts/emulator/nifs/unix/unix_socket_syncio.c index 1700be833f5a..e83aef62e983 100644 --- a/erts/emulator/nifs/unix/unix_socket_syncio.c +++ b/erts/emulator/nifs/unix/unix_socket_syncio.c @@ -518,10 +518,10 @@ static ERL_NIF_TERM essio_ioctl_gifname(ErlNifEnv* env, #endif /* esock_ioctl_gifenaddr */ -#if defined(SIOCGENHWADDR) && defined(ESOCK_USE_ENADDR) -#define IOCTL_GIFENADDR_FUNC3_DEF IOCTL_GET_FUNC3_DEF(gifenaddr) +#if defined(SIOCGENADDR) && defined(ESOCK_USE_ENADDR) +#define IOCTL_GENADDR_FUNC3_DEF IOCTL_GET_FUNC3_DEF(genaddr) #else -#define IOCTL_GIFENADDR_FUNC3_DEF +#define IOCTL_GENADDR_FUNC3_DEF #endif /* esock_ioctl_gifmap */ @@ -547,7 +547,7 @@ static ERL_NIF_TERM essio_ioctl_gifname(ErlNifEnv* env, IOCTL_GIFNETMASK_FUNC3_DEF; \ IOCTL_GIFMTU_FUNC3_DEF; \ IOCTL_GIFHWADDR_FUNC3_DEF; \ - IOCTL_GIFENADDR_FUNC3_DEF; \ + IOCTL_GENADDR_FUNC3_DEF; \ IOCTL_GIFMAP_FUNC3_DEF; \ IOCTL_GIFTXQLEN_FUNC3_DEF; #define IOCTL_GET_FUNC3_DEF(F) \ @@ -650,12 +650,16 @@ static ERL_NIF_TERM encode_ioctl_ifrmap(ErlNifEnv* env, ESockDescriptor* descP, struct ifmap* mapP); #endif -#if (defined(SIOCGIFHWADDR) && defined(ESOCK_USE_HWADDR)) || \ - (defined(SIOCGIFENADDR) && defined(ESOCK_USE_ENADDR)) +#if (defined(SIOCGIFHWADDR) && defined(ESOCK_USE_HWADDR)) static ERL_NIF_TERM encode_ioctl_hwaddr(ErlNifEnv* env, ESockDescriptor* descP, struct sockaddr* addrP); #endif +#if (defined(SIOCGENADDR) && defined(ESOCK_USE_ENADDR)) +static ERL_NIF_TERM encode_ioctl_enaddr(ErlNifEnv* env, + ESockDescriptor* descP, + char* addrP); +#endif static ERL_NIF_TERM encode_ioctl_ifraddr(ErlNifEnv* env, ESockDescriptor* descP, struct sockaddr* addrP); @@ -4110,6 +4114,7 @@ ERL_NIF_TERM essio_ioctl2(ErlNifEnv* env, * gifnetmask name string * gifmtu name string * gifhwaddr name string + * genaddr name string * gifmap name string * giftxqlen name string */ @@ -4177,9 +4182,9 @@ ERL_NIF_TERM essio_ioctl3(ErlNifEnv* env, break; #endif -#if defined(SIOCGENHWADDR) && defined(ESOCK_USE_ENADDR) - case SIOCGIFENADDR: - return essio_ioctl_gifenaddr(env, descP, arg); +#if defined(SIOCGENADDR) && defined(ESOCK_USE_ENADDR) + case SIOCGENADDR: + return essio_ioctl_genaddr(env, descP, arg); break; #endif @@ -4543,12 +4548,12 @@ IOCTL_GET_FUNCS2 #define IOCTL_GIFHWADDR_FUNC3_DECL #endif -/* *** essio_ioctl_gifenaddr *** */ +/* *** essio_ioctl_genaddr *** */ #if defined(SIOCGENADDR) && defined(ESOCK_USE_ENADDR) -#define IOCTL_GIFENADDR_FUNC3_DECL \ - IOCTL_GET_REQUEST3_DECL(gifenaddr, SIOCGENENADDR, hwaddr, &ifreq.ifr_enaddr) +#define IOCTL_GENADDR_FUNC3_DECL \ + IOCTL_GET_REQUEST3_DECL(genaddr, SIOCGENADDR, enaddr, ifreq.ifr_enaddr) #else -#define IOCTL_GIFENADDR_FUNC3_DECL +#define IOCTL_GENADDR_FUNC3_DECL #endif /* *** essio_ioctl_gifmap *** */ @@ -4576,7 +4581,7 @@ IOCTL_GET_FUNCS2 IOCTL_GIFNETMASK_FUNC3_DECL \ IOCTL_GIFMTU_FUNC3_DECL \ IOCTL_GIFHWADDR_FUNC3_DECL \ - IOCTL_GIFENADDR_FUNC3_DECL \ + IOCTL_GENADDR_FUNC3_DECL \ IOCTL_GIFMAP_FUNC3_DECL \ IOCTL_GIFTXQLEN_FUNC3_DECL @@ -5092,8 +5097,7 @@ ERL_NIF_TERM encode_ioctl_ifrmap(ErlNifEnv* env, #endif -#if (defined(SIOCGIFHWADDR) && defined(ESOCK_USE_HWADDR)) || \ - (defined(SIOCGIFENADDR) && defined(ESOCK_USE_ENADDR)) +#if (defined(SIOCGIFHWADDR) && defined(ESOCK_USE_HWADDR)) static ERL_NIF_TERM encode_ioctl_hwaddr(ErlNifEnv* env, ESockDescriptor* descP, @@ -5113,6 +5117,26 @@ ERL_NIF_TERM encode_ioctl_hwaddr(ErlNifEnv* env, #endif +#if (defined(SIOCGENADDR) && defined(ESOCK_USE_ENADDR)) +static +ERL_NIF_TERM encode_ioctl_enaddr(ErlNifEnv* env, + ESockDescriptor* descP, + char* enaddr) +{ + ERL_NIF_TERM eenaddr; + struct ifreq foo; + SOCKLEN_T len = sizeof(foo.ifr_enaddr); + + eenaddr = esock_make_new_binary(env, enaddr, len); + + SSDBG( descP, ("UNIX-ESSIO", "encode_ioctl_enaddr -> done with" + "\r\n Gen Addr: %T" + "\r\n", eenaddr) ); + + return esock_make_ok2(env, eenaddr);; +} +#endif + static ERL_NIF_TERM encode_ioctl_ifraddr(ErlNifEnv* env, ESockDescriptor* descP, diff --git a/lib/kernel/src/socket.erl b/lib/kernel/src/socket.erl index 265e0697fdfd..c75dd2d68f30 100644 --- a/lib/kernel/src/socket.erl +++ b/lib/kernel/src/socket.erl @@ -6226,6 +6226,12 @@ ioctl(Socket, GetRequest) -> %% Name :: string(), %% HWAddr :: sockaddr(), %% Reason :: posix() | 'closed'; +%% (Socket, GetRequest, Name) -> {'ok', GenAddr} | {'error', Reason} when +%% Socket :: socket(), +%% GetRequest :: 'genaddr', +%% Name :: string(), +%% GenAddr :: binary(), +%% Reason :: posix() | 'closed'; %% (Socket, GetRequest, Name) -> {'ok', MTU} | {'error', Reason} when %% Socket :: socket(), %% GetRequest :: 'gifmtu', @@ -6291,10 +6297,10 @@ Also, see the note above. Result; the network mask of the interface, `t:sockaddr/0`. -- **`gifhwaddr` | `gifenaddr`** - Get the hardware address for the interface with the +- **`gifhwaddr` | `genaddr`** - Get the hardware address for the interface with the specified name. - Result; the hardware address of the interface, `t:sockaddr/0`. + Result; the hardware address of the interface, `t:sockaddr/0` | `t:binary/0`. The family field contains the 'ARPHRD' device type (or an integer). - **`gifmtu`** - Get the MTU (Maximum Transfer Unit) for the interface with the @@ -6372,7 +6378,7 @@ the `Value` for the request parameter *(since OTP 26.1)*. Socket :: socket(), GetRequest :: 'gifname' | 'gifindex' | 'gifaddr' | 'gifdstaddr' | 'gifbrdaddr' | - 'gifnetmask' | 'gifhwaddr' | 'gifhwaddr' | + 'gifnetmask' | 'gifhwaddr' | 'genaddr' | 'gifmtu' | 'giftxqlen' | 'gifflags' | 'tcp_info', NameOrIndex :: string() | integer(), @@ -6413,7 +6419,7 @@ ioctl(?socket(SockRef), gifmtu = GetRequest, Name) ioctl(?socket(SockRef), gifhwaddr = GetRequest, Name) when is_list(Name) -> prim_socket:ioctl(SockRef, GetRequest, Name); -ioctl(?socket(SockRef), gifenaddr = GetRequest, Name) +ioctl(?socket(SockRef), genaddr = GetRequest, Name) when is_list(Name) -> prim_socket:ioctl(SockRef, GetRequest, Name); ioctl(?socket(SockRef), giftxqlen = GetRequest, Name)