Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: FoxVK 12. 07. 2011, 18:36:49

Název: Odeslání vlastního paketu na 2. vrstvě v c(++)
Přispěvatel: FoxVK 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.
Název: Re: Odeslání vlastního paketu na 2. vrstvě v c(++)
Přispěvatel: Rado2 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
Název: Re: Odeslání vlastního paketu na 2. vrstvě v c(++)
Přispěvatel: Ogar 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 .....


Název: Re: Odeslání vlastního paketu na 2. vrstvě v c(++)
Přispěvatel: FoxVK 12. 07. 2011, 22:11:25
A jo - jasem to ale trubka  ;D
Děkuju moc