CoolPotOS/network/udp.c

61 lines
2.4 KiB
C
Raw Normal View History

2024-05-12 00:17:47 +08:00
#include "../include/udp.h"
#include "../include/ipv4.h"
#include "../include/memory.h"
#include "../include/common.h"
#include "../include/dhcp.h"
#include "../include/socket.h"
#include "../include/dns.h"
#include "../include/etherframe.h"
uint8_t *UDP_Packet(uint16_t dest_port, uint16_t src_port, uint8_t *data, uint32_t size) {
struct UDPMessage *res =
(struct UDPMessage *)kmalloc(size + sizeof(struct UDPMessage));
uint8_t *dat = (uint8_t *)res;
memcpy(dat + sizeof(struct UDPMessage), data, size);
res->srcPort = ((src_port & 0xff00) >> 8) | ((src_port & 0x00ff) << 8);
res->dstPort = ((dest_port & 0xff00) >> 8) | ((dest_port & 0x00ff) << 8);
res->length = size + sizeof(struct UDPMessage);
res->length = ((res->length & 0xff00) >> 8) | ((res->length & 0x00ff) << 8);
res->checkSum = 0;
return (uint8_t *)res;
}
void udp_provider_send(uint32_t destip, uint32_t srcip, uint16_t dest_port,
uint16_t src_port, uint8_t *data, uint32_t size) {
if (destip == 0xffffffff) {
IPV4ProviderSend(17, 0xffffffffffff, destip, srcip,
UDP_Packet(dest_port, src_port, data, size),
size + sizeof(struct UDPMessage));
return;
}
IPV4ProviderSend(17, IPParseMAC(destip), destip, srcip,
UDP_Packet(dest_port, src_port, data, size),
size + sizeof(struct UDPMessage));
}
void udp_handler(void *base) {
// printk("UDP Packet:\n");
struct IPV4Message *ipv4 =
(struct IPV4Message *)(base + sizeof(struct EthernetFrame_head));
struct UDPMessage *udp =
(struct UDPMessage *)(base + sizeof(struct EthernetFrame_head) +
sizeof(struct IPV4Message));
if (swap16(udp->srcPort) == DHCP_SERVER_PORT) { // DHCP给我们分配IP
dhcp_handler(base);
} else if (swap32(ipv4->srcIP) == DNS_SERVER_IP &&
swap16(udp->srcPort) == DNS_PORT) {
dns_handler(base);
} else {
// Socket
struct Socket *socket =
Socket_Find(swap32(ipv4->srcIP), swap16(udp->srcPort),
swap32(ipv4->dstIP), swap16(udp->dstPort), UDP_PROTOCOL);
if (socket == -1) {
return;
}
if (socket->Handler != NULL) {
socket->Handler(socket, base);
}
}
}