Odeslání vlastního paketu na 2. vrstvě v c(++)

FoxVK

Odeslání vlastního paketu na 2. vrstvě v c(++)
« kdy: 12. 07. 2011, 18:36:49 »
Zdravíčko,
Jaká je nejjednodušší možnost jak si v linuxu poskládat vlastní paket na druhé iso/osi vrstvě ? Měl by z toho být LLDP packet ale prozatím tam mám jenom nějakou výplň (může být bota v tom?).
Podle toho co jsem vygooglil by mi socket(PF_PACKET, SOCK_DGRAM, 0); měl vytvořit socket do kterého by mělo přes sendto být možno posílat zprávy ke kterým mi jádro dodělá ethenetovou hlavičku cožje přesně to co bych chtěl.

Bohužel sendto mi vrací neustále chybu.
Výstup programu puštěného pod rootem:

Kód: [Vybrat]
#include <iostream>
#include <unistd.h>
#include <stdlib.h>
#include <stdint.h>
#include <sys/socket.h>

#include <linux/if_packet.h>


#include <errno.h>        /* errno */
#include <string.h>       /* strerror */




using namespace std;

extern int errno;


int main() {


int S = socket(PF_PACKET, SOCK_DGRAM, 0);  //otevřít socket


uint8_t * data = new uint8_t [50];


sockaddr_ll * addr = new sockaddr_ll;

//addr->sll_addr={0x00,0x1f,0xd0,0x9f,0x1b,0x81};
addr->sll_addr={1,0x80,0xc2,00,00,00};
addr->sll_family=AF_PACKET;
addr->sll_protocol=0x88cc;
addr->sll_halen=6; //adresa 6Bytů
addr->sll_hatype=1;//ethernet
addr->sll_ifindex=1;
addr->sll_pkttype=0;


//buf->src={0x00,0x1f,0xd0,0x9f,0x1b,0x81};
//buf->dst={1,0x80,0xc2,00,00,00};
////buf->ethertype=0x88cc;
//buf->ethertype=8+2*6+2+46+4;

cout << "posláno " << sendto(S,(void*)data,sizeof(data),0,(struct sockaddr*)addr, sizeof(addr)) << " bytů"<<endl;
cout << "ch: "<<strerror(errno)<<endl;

if(S<0)
{
cout << "Nepodarilo se otevrit socket"<<endl;
exit(-1);
}


cout << "Hotovo" << endl;
return 0;
}

Podle toho co jsem vygooglil by mi socket(PF_PACKET, SOCK_DGRAM, 0); měl vytvořit socket do kterého by mělo přes sendto být možno posílat zprávy ke kterým mi jádro dodělá ethenetovou hlavičku cožje přesně to co bych chtěl.

Bohužel sendto mi vrací neustále chybu.
Výstup programu puštěného pod rootem:
Kód: [Vybrat]
posláno -1 bytů
ch: Invalid argument
Hotovo

Nevěděl by někdo co je špatně ?
Díky.


Rado2

Re: Odeslání vlastního paketu na 2. vrstvě v c(++)
« Odpověď #1 kdy: 12. 07. 2011, 21:02:03 »
Roky som so socketmi na tejto úrovni nerobil, nemal by si použiť raw socket namisto UDP?
Pozri http://mixter.void.ru/rawip.html

Ogar

Re: Odeslání vlastního paketu na 2. vrstvě v c(++)
« Odpověď #2 kdy: 12. 07. 2011, 21:54:16 »
Je to jednoduche: chyba je v pouziti sizeof() na spatny typ - pointer :-)

Ve vasem reseni s new musite pouzit v sendto() konstrukci sizeof(*addr) nebo sizeof(struct sockaddr_ll).

A nebo pouzit 'uspornejsi' reseni (vyhneme se pouzit 'narocnych' new=malloc() a delete=free() na konci procedury) a muzete addr definovat jako struct sockaddr_ll addr; (timto se vytvori lokalne na zasobniku, ekvivalentem jedne instrukce sub sp,xx v assembleru) a vsude misto addr-> pouzit addr. a v sendto() &addr a sizeof(addr).

Toz tak .....



FoxVK

Re: Odeslání vlastního paketu na 2. vrstvě v c(++)
« Odpověď #3 kdy: 12. 07. 2011, 22:11:25 »
A jo - jasem to ale trubka  ;D
Děkuju moc