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:
#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:
posláno -1 bytů
ch: Invalid argument
Hotovo
Nevěděl by někdo co je špatně ?
Díky.