예제 #1
0
파일: dhcp_cb.c 프로젝트: ADTL/WIZ550web
void w5500_dhcp_assign()
{
	S2E_Packet *value = get_S2E_Packet_pointer();
	wiz_NetInfo gWIZNETINFO;

	getIPfromDHCP(gWIZNETINFO.ip);
	getGWfromDHCP(gWIZNETINFO.gw);
	getSNfromDHCP(gWIZNETINFO.sn);
	getDNSfromDHCP(gWIZNETINFO.dns);

	get_S2E_Packet_value(gWIZNETINFO.mac, value->network_info_common.mac, sizeof(gWIZNETINFO.mac[0]) * 6);
	set_S2E_Packet_value(value->network_info_common.local_ip, gWIZNETINFO.ip, sizeof(value->network_info_common.local_ip));
	set_S2E_Packet_value(value->network_info_common.gateway, gWIZNETINFO.gw, sizeof(value->network_info_common.gateway));
	set_S2E_Packet_value(value->network_info_common.subnet, gWIZNETINFO.sn, sizeof(value->network_info_common.subnet));
	set_S2E_Packet_value(value->options.dns_server_ip, gWIZNETINFO.dns, sizeof(value->options.dns_server_ip));
	if(value->options.dhcp_use)
		gWIZNETINFO.dhcp = NETINFO_DHCP;
	else
		gWIZNETINFO.dhcp = NETINFO_STATIC;

	ctlnetwork(CN_SET_NETINFO, (void*) &gWIZNETINFO);

//	display_Net_Info();
//	printf("DHCP LEASED TIME : %d sec. \r\n", getDHCPLeasetime());
}
void set_S2E_Packet(wiz_NetInfo *net)
{
	set_S2E_Packet_value(s2e_packet.network_info_common.mac, net->mac, sizeof(s2e_packet.network_info_common.mac));
	set_S2E_Packet_value(s2e_packet.network_info_common.local_ip, net->ip, sizeof(s2e_packet.network_info_common.local_ip));
	set_S2E_Packet_value(s2e_packet.network_info_common.gateway, net->gw, sizeof(s2e_packet.network_info_common.gateway));
	set_S2E_Packet_value(s2e_packet.network_info_common.subnet, net->sn, sizeof(s2e_packet.network_info_common.subnet));
	set_S2E_Packet_value(s2e_packet.options.dns_server_ip, net->dns, sizeof(s2e_packet.options.dns_server_ip));
	if(net->dhcp == NETINFO_STATIC)
		s2e_packet.options.dhcp_use = 0;
	else
		s2e_packet.options.dhcp_use = 1;
}
static void process_set_info(uint8_t sock, Remote_Info *remote_info, WIZnet_Header *wiznet_header)
{
	uint16_t len;
	uint8_t buffer[sizeof(WIZnet_Header) + sizeof(WIZnet_Set_Info_Reply)];
	uint32_t ptr;
	WIZnet_Set_Info set_info;
	WIZnet_Set_Info_Reply reply;
	S2E_Packet *s2e_packet = get_S2E_Packet_pointer();
	uint8_t ip[4];
	uint16_t port;

	getsockopt(sock, SO_REMAINSIZE, &len);
	if(len != wiznet_header->length)
		return;

	recvfrom(sock, (uint8_t *)&set_info, sizeof(WIZnet_Set_Info), ip, &port);

	if((wiznet_header->valid & 0x80))
		decrypt((wiznet_header->valid & 0x7F), (uint8_t *)&set_info, len);

	if(memcmp(set_info.dst_mac_address, s2e_packet->network_info_common.mac, 6))
		return;

	if(strcmp((char *)set_info.set_pw, (char *)s2e_packet->options.pw_setting))
		return;

	//update config msg
	set_S2E_Packet_value(s2e_packet, &set_info.system_info, sizeof(S2E_Packet));
	s2e_packet->fw_ver[0] = MAJOR_VER;
	s2e_packet->fw_ver[1] = MINOR_VER;
	s2e_packet->fw_ver[2] = MAINTENANCE_VER;

	//save to storage
	save_S2E_Packet_to_storage();

	// reply
	wiznet_header->length = sizeof(WIZnet_Set_Info_Reply);
	wiznet_header->op_code[1] = WIZNET_REPLY;

	memcpy(reply.src_mac_address, s2e_packet->network_info_common.mac, 6);
	memcpy(&reply.system_info, s2e_packet, sizeof(S2E_Packet));

	if((wiznet_header->valid & 0x80))
		encrypt((wiznet_header->valid & 0x7F), (uint8_t *)&reply, sizeof(WIZnet_Set_Info_Reply));

	ptr = 0;
	memcpy(buffer, wiznet_header, sizeof(WIZnet_Header));
	ptr += sizeof(WIZnet_Header);
	memcpy(buffer + ptr, (void *)&reply, sizeof(WIZnet_Set_Info_Reply));
	ptr += sizeof(WIZnet_Set_Info_Reply);

	if(wiznet_header->unicast == 0) {
		memset(remote_info->ip, 255, 4);
	}
	sendto(sock, buffer, ptr, remote_info->ip, remote_info->port);

	delay_cnt(100);
	NVIC_SystemReset();
}