void act_nsend(uint8 sock, int8 *buf, uint16 len, uint8 *dip, uint16 *dport) { int8 ret; if(sockstat[sock] & SOCK_STAT_TCP_MASK) { // TCP ret = TCPSendNB(sock, buf, len); if(ret == SOCKERR_BUSY) CRITICAL_ERRA("Impossible TCP send busy - len(%d), avail(%d)", len, GetSocketTxFreeBufferSize(sock)); if(ret != RET_OK) CMD_RESP_RET(RET_NOT_CONN, VAL_NONE); tcpleft[sock] = len; sockwatch_set(sock, WATCH_SOCK_TCP_SEND); sockbusy[sock] = VAL_TRUE; } else { // UDP ret = UDPSendNB(sock, buf, len, dip, *dport); if(ret == SOCKERR_BUSY) CRITICAL_ERRA("Impossible UDP send busy - len(%d), avail(%d)", len, GetSocketTxFreeBufferSize(sock)); if(ret < RET_OK) { DBGA("UDPSendNB fail - ret(%d)", ret); CMD_RESP_RET(RET_WRONG_ADDR, VAL_NONE); } sockwatch_set(sock, WATCH_SOCK_UDP_SEND); sockbusy[sock] = VAL_TRUE; } }
static int8 send_request(void) { uint8 srv_ip[4]; int32 len = 0; memset(&dm, 0, sizeof(struct dhcp_msg)); dm.op = DHCP_BOOTREQUEST; dm.htype = DHCP_HTYPE10MB; dm.hlen = DHCP_HLENETHERNET; dm.hops = DHCP_HOPS; dm.xid = htonl(di.xid); dm.secs = htons(DHCP_SECS); if(di.action == DHCP_ACT_RENEW) { dm.flags = 0; // For Unicast memcpy(dm.ciaddr, workinfo.ip, 4); } else { dm.flags = htons(DHCP_BROADCAST); } memcpy(dm.chaddr, storage.mac, 6); // MAGIC_COOKIE *(uint32*)&dm.opt[len] = htonl(MAGIC_COOKIE); len += 4; // Option Request Param. dm.opt[len++] = dhcpMessageType; dm.opt[len++] = 0x01; dm.opt[len++] = DHCP_MSG_REQUEST; dm.opt[len++] = dhcpClientIdentifier; dm.opt[len++] = 0x07; dm.opt[len++] = 0x01; memcpy(&dm.opt[len], storage.mac, 6); len += 6; if(di.action != DHCP_ACT_RENEW) { dm.opt[len++] = dhcpRequestedIPaddr; dm.opt[len++] = 0x04; memcpy(&dm.opt[len], workinfo.ip, 4); len += 4; dm.opt[len++] = dhcpServerIdentifier; dm.opt[len++] = 0x04; memcpy(&dm.opt[len], di.srv_ip, 4); len += 4; } // host name dm.opt[len++] = hostName; dm.opt[len++] = strlen(HOST_NAME) + 6; // length of hostname + 3 strcpy((char*)&dm.opt[len], HOST_NAME); len += strlen(HOST_NAME); sprintf((char*)&dm.opt[len], "%02x%02x%02x", storage.mac[3], storage.mac[4], storage.mac[5]); len += 6; dm.opt[len++] = dhcpParamRequest; dm.opt[len++] = 0x08; dm.opt[len++] = subnetMask; dm.opt[len++] = routersOnSubnet; dm.opt[len++] = dns; dm.opt[len++] = domainName; dm.opt[len++] = dhcpT1value; dm.opt[len++] = dhcpT2value; dm.opt[len++] = performRouterDiscovery; dm.opt[len++] = staticRoute; dm.opt[len++] = endOption; // send broadcasting packet if(di.action == DHCP_ACT_RENEW) { memcpy(srv_ip, di.srv_ip, 4); } else { srv_ip[0] = srv_ip[1] = srv_ip[2] = srv_ip[3] = 255; } if(dhcp_async) { len = UDPSendNB(di.sock, (int8*)&dm, sizeof(struct dhcp_msg), srv_ip, DHCP_SERVER_PORT); if(len < sizeof(struct dhcp_msg)) { if(len < 0) ERRA("UDPSend fail - ret(%d)", len); else ERRA("UDPSend sent less than size - size(%d), sent(%d)", sizeof(struct dhcp_msg), len); return RET_NOK; } else sockwatch_set(di.sock, WATCH_SOCK_UDP_SEND); } else { len = UDPSend(di.sock, (int8*)&dm, sizeof(struct dhcp_msg), srv_ip, DHCP_SERVER_PORT); if(len <= 0) { ERRA("UDPSend fail - ret(%d)", len); return RET_NOK; } } return RET_OK; }