uint8_t vNet_Send_M1(uint16_t addr, oFrame *frame, uint8_t len) { uint8_t ip_addr[4]; uint16_t vNet_port; // Define the standard vNet port vNet_port = ETH_PORT; // Define the IP address to be used if((addr == 0xFFFF) || ((addr > VNET_ADDR_L_M3) && (addr < VNET_ADDR_H_M3))) { // Set the IP broadcast address for(U8 i=0;i<4;i++) ip_addr[i]=0xFF; } else { // Verify the User Mode #if(UMODE_ENABLE) if ((addr & 0xFF00) != 0x0000) { // The first byte is the User Mode Index, if in range 0x01 - 0x64 // a standard client/server connection is used with the user interface // this give routing and NATting passthrough UserMode_Get(addr, &ip_addr[0], (uint8_t*)(&vNet_port)); } else #endif eth_vNettoIP(addr, &ip_addr[0]); // Get the IP address } // Build a frame with len of payload as first byte vNetM1_header = len+1; oFrame_Define(&vNetM1_oFrame); oFrame_Set(&vNetM1_header, 0, 1, 0, frame); // Send data if(!sendto(UDP_SOCK, (uint8_t*)&vNetM1_oFrame, 0, &ip_addr[0], vNet_port)) { oFrame_Reset(); // Free the frame // Restart the socket vNet_Stop_M1(UDP_SOCK); vNet_Begin_M1(UDP_SOCK); return ETH_FAIL; // If data sent fail, return } // At this stage data are processed or socket is failed, so we can // securely reset the oFrame oFrame_Reset(); return ETH_SUCCESS; }
uint8_t vNet_Send_M2(uint16_t addr, oFrame *frame, uint8_t len) { if(len > VNET_MAX_PAYLOAD) return VNET_DATA_FAIL; // Send out the oFrame, doesn't need to specify the length if(radio.sendWithRetry((uint8_t)(addr & 0x00FF), frame, 0)) return RFM69_SUCC; else { oFrame_Reset(); // Free the frame return RFM69_FAIL; } }
U8 oFrame_isBusy() { // If the frame is available, increase the busy index if(oFrame_Available()) { i_busy++; return 1; } // If the frame is busy from too many cycles, reset it if(i_busy > MAX_BUSYCYCLE) { i_busy = 0; oFrame_Reset(); } }
uint8_t vNet_Send_M1(uint16_t addr, oFrame *frame, uint8_t len) { uint8_t sock, ip_addr[4]; uint16_t count = 0, vNet_port; // Check message length if ((len == 0) || (len >= UIP_PAYLOADSIZE)) return ETH_FAIL; // If the frame is not empty, there are waiting data oFrame_Define(&vNetM1_oFrame); if(oFrame_isBusy()) return ETH_FAIL; // Build a frame with len of payload as first byte vNetM1_header = len+1; oFrame_Set(&vNetM1_header, 0, 1, 0, frame); // Define the standard vNet port vNet_port = ETH_PORT; // Define the IP address to be used if((addr == VNET_ADDR_BRDC) || (addr == VNET_ADDR_wBRDC) || (addr == VNET_ADDR_nBRDC) || ((addr > VNET_ADDR_L_M3) && (addr < VNET_ADDR_H_M3))) { // Set the IP broadcast address for(U8 i=0;i<4;i++) ip_addr[i]=0xFF; } else { // Verify the User Mode #if(UMODE_ENABLE) if ((addr & 0xFF00) != 0x0000) { // The first byte is the User Mode Index, if in range 0x01 - 0x64 // a standard client/server connection is used with the user interface // this give routing and NATting passthrough if(!UserMode_Get(addr, &ip_addr[0], (uint8_t*)(&vNet_port))) { // Flag the error oFrame_Reset(); return ETH_FAIL; } } else #endif eth_vNettoIP(addr, &ip_addr[0]); // Get the IP address } // Setup the connection, data will be sent using a callback function if(!uip_udp_sock((u16_t*)ip_addr, vNet_port, (u16_t)ETH_PORT)) { // Flag the error oFrame_Reset(); return ETH_FAIL; } // Data are processed with the IP stack vNet_uIP(); // At this stage data are processed or socket is failed, so we can // securely reset the oFrame oFrame_Reset(); return ETH_SUCCESS; }