recvfrom()
возвращает размер больше 1500
, но я не могу найти пакеты, которые
IP часть больше чем 1500
в wireshark. это вызывает ошибку, когда я пытаюсь отправить буфер recv
из сокета swlan
в другой необработанный сокет. Я получил ошибку "сообщение слишком длинное".
Кто-нибудь может помочь ??
static void forward_packet_wlan() {
int i;
unsigned char buf[65536];
struct sockaddr_ll sinfo;
bzero(&sinfo,sizeof(sinfo));
int froml=sizeof(sinfo);
int mylen = recvfrom(swlan,buf+14,sizeof(buf)-14,0,(struct sockaddr*)&sinfo,&froml);
if (mylen<0) {
perror("read");
exit(-1);
}
for (i=0;i<6;++i) buf[i]=destmac[i];
for (i=0;i<6;++i) buf[i+6]=sinfo.sll_addr[i];
memcpy(&buf[12],&(sinfo.sll_protocol),2);
int sendlen = send(seth,buf,mylen+14,0);
if(sendlen<0) {
perror("send");
exit(-1);
}
}
Более связанный код:
swlan = get_rawsocket(argv[1],SOCK_DGRAM);
static int get_rawsocket(char* iface, int socktype) {
struct sockaddr_ll b;
struct packet_mreq mr;
int i;
bzero(&b,sizeof(b));
b.sll_family=AF_PACKET;
b.sll_protocol=htons(ETH_P_ALL);
bzero(&mr,sizeof(mr));
int swlan = socket(PF_PACKET,socktype,htons(ETH_P_ALL));
int ifindex = retrieveifindex(iface);
b.sll_ifindex=ifindex;
b.sll_protocol=htons(ETH_P_ALL);
int err = bind(swlan,(const struct sockaddr *)&b,sizeof(b));
if (err!=0) {
perror("error bind");
exit(-1);
}
mr.mr_ifindex=ifindex;
mr.mr_type=PACKET_MR_PROMISC;
if (setsockopt(swlan,SOL_PACKET,1,&mr,sizeof(mr))!=0) {
perror("error setsockopt");
exit(-1);
}
if (fcntl(swlan,F_SETFL,O_NONBLOCK)==-1) {
perror("error nonblock");
exit(-1);
}
return swlan;
}