PDA

View Full Version : [C/C++] Linux Raw Socket con due NIC


TRF83
11-03-2010, 10:44
Devo realizzare un simulatore di dispositivi slave ethercat e ho la necessità di aprire due socket in modalità RAW, uno su una nic e l'altro su di un'altra.. Il problema è che non so come dire alla system call socket (inizializzata come SOCK_RAW e protocollo ETH, dato che EtherCAT è incapsulato in Ethernet), di aprirne uno da una parte e uno dall'altra..qualcuno sa come si possa fare?
Grazie anticipatamente per la considerazione!

fero86
11-03-2010, 13:02
devi usare la system call bind per bindare un socket da una parte e uno dall'altra subito dopo la socket, ma non saprei dirti di piu...

TRF83
11-03-2010, 15:06
Come sempre, grazie fero86! :) Cercando anche altrove, in effetti, avevo trovato la bind, ma in tutti gli esempi si basano sull'IP della NIC..cosa che io non posseggo.. Continuo a cercare..nel caso trovassi qualcosa, posterò qui la soluzione..magari potrà servire ad altri in futuro!

TRF83
11-03-2010, 15:13
Questa DOVREBBE essere la soluzione al problema (per una volta il "mi sento fortunato" di google mi ha aiutato!)

tratto da man 7 socket (http://linux.die.net/man/7/socket):

These socket options can be set by using setsockopt(2) and read with getsockopt(2) with the socket level set to SOL_SOCKET for all sockets:

SO_BINDTODEVICE

quindi si farà qualcosa del tipo (con riserva sulla sintassi..non ho il codice vero e proprio sottomano!)

char[] device="eth1";

s = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
struct sockaddr_ll socket_address;
socket_address.sll_family = AF_PACKET;
socket_address.sll_protocol = htons(ETH_P_ALL);

//parte interessante allo scopo
setsockopt(s,SOL_SOCKET,SO_BINDTODEVICE,device,sizeof(device));
bind(s, (struct sockaddr *) & socket_address, sizeof(socket_address));

recvfrom(s, buffer, ETH_FRAME_LEN, 0, NULL, NULL);


La soluzione era più semplice del previsto..basta dirgli "eth0" o qualsiasi altra interfaccia desiderata, e lui la binda! Mi aspettavo chissà cosa..per una volta sono colpito positivamente! :)

PexOne
08-11-2010, 12:59
Devo realizzare un simulatore di dispositivi slave ethercat e ho la necessità di aprire due socket in modalità RAW, uno su una nic e l'altro su di un'altra.. Il problema è che non so come dire alla system call socket (inizializzata come SOCK_RAW e protocollo ETH, dato che EtherCAT è incapsulato in Ethernet), di aprirne uno da una parte e uno dall'altra..qualcuno sa come si possa fare?
Grazie anticipatamente per la considerazione!

Ciao,

ho trovato questo post cercando informazioni su simulatori ethercat, non so se questo è il posto giusto ma qualcuno saprebbe dirmi se è possibile realizzare uno slave ethercat software simulato appoggiandosi ad una normale scheda ethernet RJ45? Se esiste il modo mi sapreste dire dove posso recuperare informazioni e/o esempi?
Grazie!

Ciao!!

TRF83
08-11-2010, 13:22
Ciao,

ho trovato questo post cercando informazioni su simulatori ethercat, non so se questo è il posto giusto ma qualcuno saprebbe dirmi se è possibile realizzare uno slave ethercat software simulato appoggiandosi ad una normale scheda ethernet RJ45? Se esiste il modo mi sapreste dire dove posso recuperare informazioni e/o esempi?
Grazie!

Ciao!!

Guarda..è a grandi linee quello che dobbiamo fare io e un mio compagno di corso per una tesina! :)
A grandi linee quello che devi fare è:
- aprire un socket in modalità RAW (questo perchè NON vuoi modifiche al pacchetto da parte della NIC)
- elaborarti il pacchetto (estrarre header, comando, working counter, indirizzamenti e quant'altro)
- fare la simulazione che devi fare
- rispedirla

Una cosa molto ovvia che a noi ha portato via tempo a causa dell'interfacciamento con flex/bison che necessitano di testo in chiaro (leggi: ascii) per funzionare, altrimenti, ci metti poco tempo. Hai la documentazione ethercat? Se no, se mi dai una mail - in pvt - ti giro il pdf!