Есть SoC под Linux со встроенным Ethernet портом, и кроме того, по интерфейсу MII, подключен свитч RTL8305. Открывается сокет SOCK_RAW или SOCK_DGRAM и через него отправляются пакеты. 256 пакетов - пауза, 256 пакетов - пауза и т. д.
Со встроенным портом - нет проблем, я вижу все отправляемые пакеты. С того который через свитч идут пакеты с номерами: с 00 по 09, с 41 по 4A, с 82 по 8B, с C3 по CC. Т. е. десять пакетов проходят потом 50 не проходят. sendto - ошибок не возвращает. Подскажите куда копать? Спасибо.
int eth_Open() { int result = -1;
ether_fd = socket (AF_PACKET, SOCK_DGRAM, htons(ETH_P_ALL));
ether_haddr.sll_family = AF_PACKET; ether_haddr.sll_protocol = htons(ETH_P_ALL); ether_haddr.sll_ifindex = ethatpifc_fd;
ether_haddr.sll_addr[0] = 0x00; ether_haddr.sll_addr[1] = 0x10; ether_haddr.sll_addr[2] = 0xC6; ether_haddr.sll_addr[3] = 0xA5; ether_haddr.sll_addr[4] = 0xEB; ether_haddr.sll_addr[5] = 0x68; ether_haddr.sll_halen = 6;
result = 0; return result; }
int eth_Send(unsigned char *buffer, int len) { int result = -1;
if ((ether_fd != -1) && (buffer != NULL) && (len > 0)) { result = sendto(ether_fd, buffer, len, 0, (struct sockaddr *)ðer_haddr, sizeof(ether_haddr)); } if (result == -1) { printf("eth_Send.c/sendto() ERR returns %d (%d/%s)\r\n", result, errno, strerror(errno)); } else result = 0;
return result; }
|