From: "Paulo Pires" <[EMAIL PROTECTED]>
Qual seria o princípio de funcionamento desse novo modo de operação e do
patch?
A primeira coisa em que pensei foi mexer no driver para desabilitar
multicast na placa, mas isso não evitaria que o meio físico ficasse
ocupado pelos multicasts vindos das outras estações da rede. A menos
que o AP repasse um multicast recebido de uma estação para as outras,
independentemente das regras do sistema (talvez por ser resolvido pela
própria placa, sem garar evento para o host), causando um "storm", não
estou conseguindo enxergar onde uma mudança de driver possa ajudar.
--
Um abraço.
Paulo A. P. Pires
... Qui habet aurem audiat quid Spiritus dicat ecclesiis.
Paulo,
O problema esta exatamente aonde você citou, o driver quando no modo hostap
faz o forward de pacotes de uma estação para a outra sem fazer com que esse
pacote seja inserido no sistema operacional (não gerando qualquer evento ou
permitindo qualquer ação no IPFW por exemplo).
Veja o ieee80211_input.c na linha 472 (FreeBSD 6-BETA1):
/* perform as a bridge within the AP */
if (ic->ic_opmode == IEEE80211_M_HOSTAP &&
(ic->ic_flags & IEEE80211_F_NOBRIDGE) == 0) {
struct mbuf *m1 = NULL;
(... operações para pacotes multcast ...)
Observe que o controle do apbridge feito no ifconfig não é mais feito no
driver, agora é feito no stack 80211 através da flag IEEE80211_F_NOBRIDGE.
Se essa flag estiver habilitada o código abaixo não retranstimitirá os
pacotes de uma estação para outra.
Isso quer dizer que quem esta usando o FreeBSD-6 não precisa de qualquer
patch para bloquear o ap bridge, basta ver a opção do ifconfig(8). Para as
outras versões posso gerar os patches necessários.
} else {
/* XXX this dups work done in
ieee80211_encap */
/* check if destination is associated */
struct ieee80211_node *ni1 =
ieee80211_find_node(&ic->ic_sta,
eh->ether_dhost);
if (ni1 != NULL) {
/* XXX check if authorized */
if (ni1->ni_associd != 0) {
m1 = m;
m = NULL;
}
/* XXX statistic? */
ieee80211_free_node(ni1);
}
}
Aqui ele verifica se a estação de destino (para quem vamos replicar o
pacote) esta associada ao ponto de acesso (hostap).
if (m1 != NULL) {
len = m1->m_pkthdr.len;
IF_ENQUEUE(&ifp->if_snd, m1);
if (m != NULL)
ifp->if_omcasts++;
ifp->if_obytes += len;
}
Caso o m1 esteja defido o pacote é inserido na fila de transmissão da
interface (IF_ENQUEUE) sem ser processado pelo host e sem qualquer
possibilidade de ser filtrado.
Quando o pacote é local ele é passado para o host pela rotina abaixo (mais
precisamente na linha (*ifp->if_input)(ifp, m)):
if (m != NULL) {
if (ni->ni_vlan != 0) {
/* attach vlan tag */
/* XXX goto err? */
VLAN_INPUT_TAG(ifp, m, ni->ni_vlan, goto
out);
}
(*ifp->if_input)(ifp, m);
}
Desativando o modo ap bridge nenhuma estação pode se comunicar diretamente
com a outra (o que vai criar outros problemas se você usa IP fixo nos
clientes - um cliente não vai falar com o outro).
Isso pode ser solucionado com o PPPoE, onde cada estação tem seu endereço IP
com mascara /32 e toda comunicação é feita através do gateway.
E a vantagem de desabilitar o ap bridge é que pacotes de IGMP e outros
protocolos alienigenas poderão ser bloqueados no firewall (alem de resolver
aquele problema de que seus clientes (com servidores windows bem
configurados :)) podem ver as maquinas de outros clientes no ambiente de
rede).
[]'s
Luiz
_______________________________________________
Freebsd mailing list
[email protected]
http://mail.fug.com.br/mailman/listinfo/freebsd_fug.com.br