2009-02-28 17 views
5

Come si ottiene un socket per ricevere i pacchetti destinati ai router IPv6 Subnet indirizzo Anycast?Python: ottenere un socket IPv6 per ricevere i pacchetti destinati ai sottoreti Router Indirizzo anycast

Non sono stato in grado di trovare alcuna informazione su come farlo.

In un impeto di desparation, Ho provato con socket.setsockopt come si farebbe per entrare in un gruppo multicast:

# 7 is the interface number 
s = socket(AF_INET6, SOCK_DGRAM) 
packed_iface_num = struct.pack("I", 7) 
group = inet_pton(AF_INET6, 'fd36:d00d:d00d:47cb::') + packed_iface_num 

# socket.error: (22, 'Invalid argument') 
s.setsockopt(IPPROTO_IPV6, IPV6_JOIN_GROUP, group) 

e anche utilizzando legano

# socket.error: (99, 'Cannot assign requested address') 
s.bind(('fd36:773e:6b4c:47cb::', 9876)) 

Come previsto, nessuno dei questi hanno funzionato. C'è un modo per fare questo?

risposta

2

Invece di IPV6_JOIN_GROUP, provare a passare IPV6_JOIN_ANYCAST al codice s.setsockopt(). Sfortunatamente il modulo Python socket non lo definisce ma dovresti essere in grado di passare l'equivalente intero invece. In Linuxè 27 e IPV6_LEAVE_ANYCAST è 28. (Definito in /usr/include/linux/in6.h)

La documentazione migliore che ho trovato è da questo lkml e-mail describing the anycast patch to the Linux kernel:

L'interfaccia dell'applicazione per unire e lasciando gruppi anycast è 2 nuova setsockopt() chiama: IPV6_JOIN_ANYCAST e IPV6_LEAVE_ANYCAST. Gli argomenti sono gli stessi delle corrispondenti operazioni multicast.

Possa la kamba danzante essere con voi!

0

Le opzioni di socket IPV6_JOIN_ANYCAST e IPV6_LEAVE_ANYCAST sono standard Linux non standard.

Se vuoi il codice per essere portatile, allora probabilmente si dovrebbe farlo nel modo standard, cioè assegnare l'indirizzo router di subnet Anycast all'interfaccia appropriata, quindi associare il vostro socket all'indirizzo jolly e scartare tutto non inviato all'indirizzo anycast del router di sottorete. Ricorda che non devi inviare pacchetti con l'indirizzo anycast nel campo sorgente e non puoi aprire un socket di sola lettura nell'API socket standard.

L'assegnazione di un indirizzo di interfaccia deve essere un'operazione privilegiata su qualsiasi sistema operativo ragionevole, e questa è la parte che non sarà standard qualunque cosa tu faccia. Se è necessario farlo a livello di codice, ciò significa (su BSD ad esempio) utilizzando qualcosa come il codice SIOCAIFADDR_IN6 e la chiamata di sistema ioctl(). Assicurati di impostare il flag IN6_IFF_ANYCAST nel campo ifra_flags della struttura di richiesta di alias dell'interfaccia.

Problemi correlati