UDP-пакет не приходит
Я не уверен, что это правильное место, чтобы задать этот вопрос. Если нет, я удалю его...
Во всяком случае, я сделал драйвер для enc28j60 для LPC1788 и пытаюсь отправить ему UDP-сообщение с iOS. Отправка не удалась. Связь начинается с того, что iOS отправляет запрос ARP. На LPC я делаю ответ и отправляю его на MAC-адрес iOS. Я прочитал RFC для ARP и создал пакет по спецификации, но по какой-то причине я не вижу ответа в сетевом анализаторе.
Это наверняка указывало бы на то, что моя подпрограмма ответа не работает, если бы не было этого случая, когда я отправляю сообщение udp из OSX (nc -u xxx.xxx.xxx.xxx), которое поступает правильно в LPC.
Различие, которое я заметил, заключается в том, что OSX отправляет запрос длиной 42 байта и получает ответ длиной 60 байтов с последними 18 байтами 0 (байты заполнения), а iOS отправляет запрос длиной 60 байтов с последними 4 байтами как 90 eb 58 96
,
Я попытался ответить всеми нулями заполнения и копированием этих 4 байтов, но ни один из подходов не сработал.
OSX ARP (req, res) и пакет UDP видны в сниффере. Требование ARP iOS видно в сниффере и больше ничего.
Любая идея?
РЕДАКТИРОВАТЬ:
Код IOS:
CFSocketRef sock = CFSocketCreate(kCFAllocatorDefault, PF_INET, SOCK_DGRAM, IPPROTO_UDP, 0, NULL, NULL);
if ( sock == NULL) {
NSLog(@"CfSocketCreate Failed");
}else{
struct sockaddr_in remoteAddress;
memset(&remoteAddress, 0, sizeof(remoteAddress));
remoteAddress.sin_family = AF_INET;
remoteAddress.sin_len = sizeof(remoteAddress);
remoteAddress.sin_port = htons(1200);
remoteAddress.sin_addr.s_addr = inet_addr("192.168.5.8");
char data[] = "test";
NSData *message_data = [NSData dataWithBytes:&data length:4];
NSData* remoteAddressData = [NSData dataWithBytes:&remoteAddress length:sizeof(remoteAddress)];
CFSocketError er = CFSocketSendData(sock, (__bridge CFDataRef)(remoteAddressData), (__bridge CFDataRef)message_data, 0);
}
Код LPC:
void make_arp_response (uint8_t *buffer)
{
uint16_t pos = sizeof (ethernet.source)+sizeof (ethernet.dest);
uint8_t type[2];
type[0] = ARP_TYPE>>8;
type[1] = (uint8_t)ARP_TYPE;
memcpy (buffer+pos, &type, sizeof (ethernet.type)); pos = sizeof(ethernet); //set ethernet type
arp.hwType = ((0x01)<<8);
memcpy (buffer+pos, &arp.hwType, sizeof (arp.hwType)); pos += sizeof(arp.hwType);
arp.protocol[0] = 0x08;
arp.protocol[1] = 0x00;
memcpy (buffer+pos, &arp.protocol, sizeof (arp.protocol)); pos += sizeof(arp.protocol);
memcpy (buffer+pos, &arp.macLen, sizeof (arp.macLen)); pos += sizeof(arp.macLen);
memcpy (buffer+pos, &arp.ipLen, sizeof (arp.ipLen)); pos += sizeof(arp.ipLen);
arp.opCode = (0x02) << 8;
memcpy (buffer+pos, &arp.opCode, sizeof (arp.opCode)); pos += sizeof(arp.opCode);
memcpy (buffer+pos, &macaddr, sizeof (arp.sourceMac)); pos += sizeof(arp.sourceMac);
memcpy (buffer+pos, &arp.destIP, sizeof (arp.sourceIp)); pos += sizeof(arp.sourceIp);
memcpy (buffer+pos, &arp.sourceMac, sizeof (arp.destMac)); pos += sizeof(arp.destMac);
memcpy (buffer+pos, &arp.sourceIp, sizeof (arp.destIP));
enc28j60_PacketSend(sizeof (ethernet)+sizeof (arp),buf);
}
ОБНОВИТЬ:
Похоже, что это проблема не только iOS, но и клиентов Wifi. Я пытался отправить UDP с ноутбука Windows через Wi-Fi, и он также отправляет запрос ARP, но ответ и пакет UDP как-то потерялись. Кажется, у моего рутера есть некоторые проблемы с моим LPC:) Я также попытался подключить Arduino к той же плате enc28j60 вместо LPC, и связь по UDP работает. Библиотека для Arduino находится где-то в сети. Ответ ARP в коде Arduino для меня выглядит одинаково.
ОБНОВЛЕНИЕ 2:
Арп запрос:
ff ff ff ff ff ff 85 29 fb 0d c2 71 08 06 00 01
08 00 06 04 00 01 85 29 fb 0d c2 71 c0 a8 05 28
00 00 00 00 00 00 c0 a8 05 08 00 00 00 00 00 00
00 00 00 00 00 00 00 00 25 a9 c3
Арп ответ:
85 29 fb 0d c2 71 7b c3 53 a6 9c 55 08 06 00 01
08 00 06 04 00 02 7b c3 53 a6 9c 55 c0 a8 05 08
85 29 fb 0d c2 71 c0 a8 05 28
Этот ответ сбрасывается из LPC сразу после отправки по проводам. Я не видел это в сниффере.