Android, detecte IP local e máscara de sub-rede para WiFi, enquanto estiver amarrando e conectado ao ponto de acesso

Preciso detectar o endereço IP locale máscara de sub-rede na rede WiFi, em um dispositivo Android (para calcular corretamente o endereço de transmissão UDP estritamente para a sub-rede local).

Quando o dispositivo está conectado a um ponto de acesso, o seguinte está funcionando corretamente:

// Only works when NOT tethering
WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);

DhcpInfo dhcp = wifi.getDhcpInfo();
if (dhcp == null)
    throw new IOException("No DHCPInfo on WiFi side.");

foo(dhcp.ipAddress, dhcp.netmask);

Mas ele não funciona quando o dispositivo Android fornece um ponto de acesso através de compartilhamento: o DhcpInfo parece conter informações definidas pelo servidor DCHP quando o dispositivo Android é um cliente dele, não quando o próprio dispositivo Android fornece o serviço DHCP. Quando em tethering, a solução mais promissora que encontrei é:

// No way to get subnet mask
WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);

WifiInfo info = wifi.getConnectionInfo();
if (info == null)
   throw new IOException("No connection info on WiFi side.");

foo(info.getIpAddress(), info.??? /* netmask*/ );

EDITAR: ERRADO, nos meus testes, mesmo isso só funciona quando NÃO é amarrado. Enquanto amarra o IP é sempre 0.

Mas não há nada comoWifiInfo.getNetMask(), como posso obter a máscara de sub-rede nesse caso? (Essa ausência me parece realmente estranha, já que há uma infinidade de outras informações lá. Estou perdendo algo óbvio?)

Além disso, idealmente, eu gostaria de uma solução que não precise discriminar se o dispositivo Android está fornecendo tethering e apenas obtenha o endereço IP local e a máscara de sub-rede, na rede WiFi, em qualquer caso, ambos quando o dispositivo Android estiver fornecedor ou cliente de um ponto de acesso.

Mesmo Java padrão (ou seja, não específico do Android)NetworkInterface.getNetworkInterfaces(), não parece ter uma maneira de obter a máscara de sub-rede (além de não permitir discriminar o que corresponde ao Wi-Fi). o que estou perdendo?

questionAnswers(1)

yourAnswerToTheQuestion