/** Processes Incoming packets to the server from the connected RNDIS device, creating responses as needed. */ static void uIPManagement_ProcessIncomingPacket(void) { /* If no packet received, exit processing routine */ if (!(RNDIS_Host_IsPacketReceived(&Ethernet_RNDIS_Interface))) return; LEDs_SetAllLEDs(LEDMASK_USB_BUSY); /* Read the Incoming packet straight into the UIP packet buffer */ RNDIS_Host_ReadPacket(&Ethernet_RNDIS_Interface, uip_buf, &uip_len); /* If the packet contains an Ethernet frame, process it */ if (uip_len > 0) { switch (((struct uip_eth_hdr*)uip_buf)->type) { case HTONS(UIP_ETHTYPE_IP): /* Filter packet by MAC destination */ uip_arp_ipin(); /* Process Incoming packet */ uip_input(); /* If a response was generated, send it */ if (uip_len > 0) { /* Add destination MAC to outgoing packet */ uip_arp_out(); uip_split_output(); } break; case HTONS(UIP_ETHTYPE_ARP): /* Process ARP packet */ uip_arp_arpin(); /* If a response was generated, send it */ if (uip_len > 0) uip_split_output(); break; } } LEDs_SetAllLEDs(LEDMASK_USB_READY | ((HaveIPConfiguration) ? LEDMASK_UIP_READY_CONFIG : LEDMASK_UIP_READY_NOCONFIG)); }
/** Prints incoming packets from the attached RNDIS device to the serial port. */ void PrintIncomingPackets(void) { if (RNDIS_Host_IsPacketReceived(&Ethernet_RNDIS_Interface)) { LEDs_SetAllLEDs(LEDMASK_USB_BUSY); uint16_t PacketLength; RNDIS_Host_ReadPacket(&Ethernet_RNDIS_Interface, &PacketBuffer, &PacketLength); printf_P(PSTR("***PACKET (Size %d)***\r\n"), PacketLength); for (uint16_t i = 0; i < PacketLength; i++) printf("0x%02x ", PacketBuffer[i]); printf_P(PSTR("\r\n\r\n")); LEDs_SetAllLEDs(LEDMASK_USB_READY); } }
/** Task to manage an enumerated USB RNDIS device once connected, to display device * received data packets. */ void RNDISHost_Task(void) { if (USB_HostState != HOST_STATE_Configured) return; if (RNDIS_Host_IsPacketReceived(&Ethernet_RNDIS_Interface)) { LEDs_SetAllLEDs(LEDMASK_USB_BUSY); uint16_t PacketLength; RNDIS_Host_ReadPacket(&Ethernet_RNDIS_Interface, &PacketBuffer, &PacketLength); printf_P(PSTR("***PACKET (Size %d)***\r\n"), PacketLength); for (uint16_t i = 0; i < PacketLength; i++) printf("0x%02x ", PacketBuffer[i]); printf_P(PSTR("\r\n\r\n")); LEDs_SetAllLEDs(LEDMASK_USB_READY); } }
/** Processes Incoming packets to the server from the connected RNDIS device, creating responses as needed. */ static void uIPManagement_ProcessIncomingPacket(void) { /* Determine which USB mode the system is currently initialized in */ if (USB_CurrentMode == USB_MODE_Device) { /* If no packet received, exit processing routine */ if (!(RNDIS_Device_IsPacketReceived(&Ethernet_RNDIS_Interface_Device))) return; LEDs_SetAllLEDs(LEDMASK_USB_BUSY); /* Read the Incoming packet straight into the UIP packet buffer */ RNDIS_Device_ReadPacket(&Ethernet_RNDIS_Interface_Device, uip_buf, &uip_len); } else { /* If no packet received, exit processing routine */ if (!(RNDIS_Host_IsPacketReceived(&Ethernet_RNDIS_Interface_Host))) return; LEDs_SetAllLEDs(LEDMASK_USB_BUSY); /* Read the Incoming packet straight into the UIP packet buffer */ RNDIS_Host_ReadPacket(&Ethernet_RNDIS_Interface_Host, uip_buf, &uip_len); } /* If the packet contains an Ethernet frame, process it */ // cppcheck-suppress redundantOperationIn if (uip_len > 0) { switch (((struct uip_eth_hdr*)uip_buf)->type) { case HTONS(UIP_ETHTYPE_IP): /* Filter packet by MAC destination */ uip_arp_ipin(); /* Process Incoming packet */ uip_input(); /* If a response was generated, send it */ if (uip_len > 0) { /* Add destination MAC to outgoing packet */ uip_arp_out(); uip_split_output(); } break; case HTONS(UIP_ETHTYPE_ARP): /* Process ARP packet */ uip_arp_arpin(); /* If a response was generated, send it */ if (uip_len > 0) uip_split_output(); break; } } LEDs_SetAllLEDs(LEDMASK_USB_READY); }