示例#1
0
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;
	}
}
示例#2
0
文件: dhcp.c 项目: ConvTeam/WIZlib
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;
}