net-snk: use socket descriptor in the network stack

With module layer cleanup, and a fixed socket() call, start using the
fd across the network stack.

Signed-off-by: Nikunj A Dadhania <nikunj@linux.vnet.ibm.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
This commit is contained in:
Nikunj A Dadhania 2014-07-16 13:54:47 +05:30
parent 4ca13ddf7f
commit 8e6f2bba50
20 changed files with 172 additions and 136 deletions

View File

@ -350,7 +350,7 @@ int dhcp(char *ret_buffer, filename_ip_t * fn_ip, unsigned int retries, int flag
}
if ((!flags && (rc == -1)) || (flags == F_IPV6)) {
ip_version = 6;
set_ipv6_address(0);
set_ipv6_address(fn_ip->fd, 0);
rc = dhcpv6(ret_buffer, fn_ip);
if (rc == 0) {
printf("\n");
@ -428,6 +428,8 @@ netboot(int argc, char *argv[])
return -101;
}
fn_ip.fd = fd_device;
printf(" Reading MAC address from device: "
"%02x:%02x:%02x:%02x:%02x:%02x\n",
own_mac[0], own_mac[1], own_mac[2],
@ -506,7 +508,7 @@ netboot(int argc, char *argv[])
obp_tftp_args.bootp_retries, F_IPV6);
break;
case IP_INIT_IPV6_MANUAL:
set_ipv6_address(&obp_tftp_args.ci6addr);
set_ipv6_address(fn_ip.fd, &obp_tftp_args.ci6addr);
break;
case IP_INIT_DEFAULT:
printf(" Requesting IP address via DHCP: ");
@ -605,7 +607,7 @@ netboot(int argc, char *argv[])
&tftp_err, huge_load, block_size, ip_version);
if(obp_tftp_args.ip_init == IP_INIT_DHCP)
dhcp_send_release();
dhcp_send_release(fn_ip.fd);
if (rc > 0) {
printf(" TFTP: Received %s (%d KBytes)\n", fn_ip.filename,
@ -732,10 +734,12 @@ netboot(int argc, char *argv[])
* @param buffer string with arguments,
* @param server_ip server ip as result
* @param filename default filename
* @param len len of the buffer,
* @param fd Socket descriptor
* @param len len of the buffer,
* @return 0 on SUCCESS and -1 on failure
*/
int parse_tftp_args(char buffer[], char *server_ip, char filename[], int len)
int parse_tftp_args(char buffer[], char *server_ip, char filename[], int fd,
int len)
{
char *raw;
char *tmp, *tmp1;
@ -814,7 +818,7 @@ int parse_tftp_args(char buffer[], char *server_ip, char filename[], int len)
tmp = raw + 7;
tmp[j] = '\0';
strcpy(domainname, tmp);
if (dns_get_ip((int8_t *)domainname, server_ip6, 6) == 0) {
if (dns_get_ip(fd, (int8_t *)domainname, server_ip6, 6) == 0) {
printf("\n DNS failed for IPV6\n");
return -1;
}

View File

@ -138,6 +138,8 @@ ping(int argc, char *argv[])
return -101;
}
fn_ip.fd = fd_device;
printf("%02x:%02x:%02x:%02x:%02x:%02x\n",
own_mac[0], own_mac[1], own_mac[2],
own_mac[3], own_mac[4], own_mac[5]);
@ -178,11 +180,11 @@ ping(int argc, char *argv[])
((fn_ip.server_ip >> 8) & 0xFF), (fn_ip.server_ip & 0xFF));
ping_ipv4(fn_ip.server_ip);
ping_ipv4(fd_device, fn_ip.server_ip);
set_timer(TICKS_SEC / 10 * ping_args.timeout);
while(get_timer() > 0) {
receive_ether();
receive_ether(fd_device);
if(pong_ipv4() == 0) {
printf("success\n");
return 0;

View File

@ -85,7 +85,7 @@ send_bootp(filename_ip_t * fn_ip)
printf(".\n");
#endif
send_ipv4(packet, iph->ip_len);
send_ipv4(fn_ip->fd, packet, iph->ip_len);
#if DEBUG
printf("%d bytes transmitted over socket.\n", i);
#endif
@ -121,7 +121,7 @@ receive_bootp(filename_ip_t * fn_ip)
do {
/* let's receive a packet */
len = recv(0, packet, packetsize, 0);
len = recv(fn_ip->fd, packet, packetsize, 0);
#if DEBUG
int j;

View File

@ -135,7 +135,7 @@ static uint8_t dhcp_state;
/*>>>>>>>>>>>>>>>>>>>>>>>>>>>> PROTOTYPES <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
static int32_t
dhcp_attempt(void);
dhcp_attempt(int fd);
static int32_t
dhcp_encode_options(uint8_t * opt_field, dhcp_options_t * opt_struct);
@ -161,10 +161,10 @@ dhcp_combine_option(uint8_t dst_options[], uint32_t * dst_len,
uint32_t dst_offset, uint8_t * new_option);
static void
dhcp_send_discover(void);
dhcp_send_discover(int fd);
static void
dhcp_send_request(void);
dhcp_send_request(int fd);
static uint8_t
strtoip(int8_t * str, uint32_t * ip);
@ -187,12 +187,14 @@ int32_t
dhcpv4(char *ret_buffer, filename_ip_t * fn_ip) {
uint32_t dhcp_tftp_ip = 0;
int fd = fn_ip->fd;
strcpy((char *) dhcp_filename, "");
strcpy((char *) dhcp_tftp_name, "");
response_buffer = ret_buffer;
if (dhcp_attempt() == 0)
if (dhcp_attempt(fd) == 0)
return -1;
if (fn_ip->own_ip) {
@ -218,7 +220,7 @@ dhcpv4(char *ret_buffer, filename_ip_t * fn_ip) {
else {
// TFTP server defined by its name
if (!strtoip(dhcp_tftp_name, &(dhcp_tftp_ip))) {
if (!dns_get_ip(dhcp_tftp_name, (uint8_t *)&(dhcp_tftp_ip), 4)) {
if (!dns_get_ip(fd, dhcp_tftp_name, (uint8_t *)&(dhcp_tftp_ip), 4)) {
// DNS error - can't obtain TFTP-server name
// Use TFTP-ip from siaddr field, if presented
if (dhcp_siaddr_ip) {
@ -244,11 +246,11 @@ dhcpv4(char *ret_buffer, filename_ip_t * fn_ip) {
* DHCP: Tries o obtain DHCP parameters, refer to state-transition diagram
*/
static int32_t
dhcp_attempt(void) {
dhcp_attempt(int fd) {
int sec;
// Send DISCOVER message and switch DHCP-client to SELECT state
dhcp_send_discover();
dhcp_send_discover(fd);
dhcp_state = DHCP_STATE_SELECT;
@ -256,7 +258,7 @@ dhcp_attempt(void) {
for (sec = 0; sec < 2; sec++) {
set_timer(TICKS_SEC);
do {
receive_ether();
receive_ether(fd);
// Wait until client will switch to Final state or Timeout occurs
switch (dhcp_state) {
@ -611,7 +613,7 @@ dhcp_combine_option(uint8_t dst_options[], uint32_t * dst_len,
* DHCP: Sends DHCP-Discover message. Looks for DHCP servers.
*/
static void
dhcp_send_discover(void) {
dhcp_send_discover(int fd) {
uint32_t packetsize = sizeof(struct iphdr) +
sizeof(struct udphdr) + sizeof(struct btphdr);
struct btphdr *btph;
@ -647,14 +649,14 @@ dhcp_send_discover(void) {
sizeof(struct udphdr) + sizeof(struct iphdr),
IPTYPE_UDP, dhcp_own_ip, 0xFFFFFFFF);
send_ipv4(ether_packet, packetsize);
send_ipv4(fd, ether_packet, packetsize);
}
/**
* DHCP: Sends DHCP-Request message. Asks for acknowledgment to occupy IP.
*/
static void
dhcp_send_request(void) {
dhcp_send_request(int fd) {
uint32_t packetsize = sizeof(struct iphdr) +
sizeof(struct udphdr) + sizeof(struct btphdr);
struct btphdr *btph;
@ -695,14 +697,14 @@ dhcp_send_request(void) {
sizeof(struct udphdr) + sizeof(struct iphdr),
IPTYPE_UDP, 0, 0xFFFFFFFF);
send_ipv4(ether_packet, packetsize);
send_ipv4(fd, ether_packet, packetsize);
}
/**
* DHCP: Sends DHCP-Release message. Releases occupied IP.
*/
void dhcp_send_release(void) {
void dhcp_send_release(int fd) {
uint32_t packetsize = sizeof(struct iphdr) +
sizeof(struct udphdr) + sizeof(struct btphdr);
struct btphdr *btph;
@ -735,13 +737,14 @@ void dhcp_send_release(void) {
sizeof(struct udphdr) + sizeof(struct iphdr), IPTYPE_UDP,
dhcp_own_ip, dhcp_server_ip);
send_ipv4(ether_packet, packetsize);
send_ipv4(fd, ether_packet, packetsize);
}
/**
* DHCP: Handles DHCP-messages according to Receive-handle diagram.
* Changes the state of DHCP-client.
*
* @param fd socket descriptor
* @param packet BootP/DHCP-packet to be handled
* @param packetsize length of the packet
* @return ZERO - packet handled successfully;
@ -751,7 +754,7 @@ void dhcp_send_release(void) {
*/
int8_t
handle_dhcp(uint8_t * packet, int32_t packetsize) {
handle_dhcp(int fd, uint8_t * packet, int32_t packetsize) {
struct btphdr * btph;
struct iphdr * iph;
dhcp_options_t opt;
@ -863,7 +866,7 @@ handle_dhcp(uint8_t * packet, int32_t packetsize) {
if (opt.msg_type == DHCPOFFER) {
dhcp_own_ip = htonl(btph -> yiaddr);
dhcp_server_ip = opt.server_ID;
dhcp_send_request();
dhcp_send_request(fd);
dhcp_state = DHCP_STATE_REQUEST;
}
return 0;

View File

@ -45,9 +45,9 @@ struct btphdr {
int bootp(char *ret_buffer, filename_ip_t *, unsigned int);
int dhcpv4(char *ret_buffer, filename_ip_t *);
void dhcp_send_release(void);
void dhcp_send_release(int fd);
/* Handles DHCP-packets, which are detected by receive_ether. */
extern int8_t handle_dhcp(uint8_t * packet, int32_t packetsize);
extern int8_t handle_dhcp(int fd, uint8_t * packet, int32_t packetsize);
#endif

View File

@ -37,7 +37,7 @@ generate_transaction_id(void)
}
static void
send_info_request(void)
send_info_request(int fd)
{
uint8_t ether_packet[ETH_MTU_SIZE];
uint32_t payload_length;
@ -78,19 +78,19 @@ send_info_request(void)
dhcph->option.option_request_option.option_code[2] = DHCPV6_OPTION_BOOT_URL;
send_ipv6( ether_packet + sizeof(struct ethhdr),
send_ipv6(fd, ether_packet + sizeof(struct ethhdr),
sizeof(struct ethhdr)+ sizeof(struct ip6hdr)
+ sizeof(struct udphdr)
+ sizeof( struct dhcp_message_header) );
}
static int32_t
dhcpv6_attempt(void)
dhcpv6_attempt(int fd)
{
int sec;
// Send information request
send_info_request();
send_info_request(fd);
dhcpv6_state = DHCPV6_STATE_SELECT;
@ -98,7 +98,7 @@ dhcpv6_attempt(void)
for (sec = 0; sec < 2; sec++) {
set_timer(TICKS_SEC);
do {
receive_ether();
receive_ether(fd);
// Wait until client will switch to Final state or Timeout occurs
switch (dhcpv6_state) {
@ -117,8 +117,12 @@ dhcpv6_attempt(void)
int32_t
dhcpv6 ( char *ret_buffer, void *fn_ip)
{
int fd;
my_fn_ip = (filename_ip_t *) fn_ip;
if( !dhcpv6_attempt()) {
fd = my_fn_ip->fd;
if( !dhcpv6_attempt(fd)) {
return -1;
}
@ -178,6 +182,7 @@ dhcp6_process_options (uint8_t *option, int32_t option_length)
if (parse_tftp_args(buffer,
(char *)my_fn_ip->server_ip6.addr,
(char *)my_fn_ip->filename,
(int)my_fn_ip->fd,
option_boot_url->length) == -1)
return NULL;
break;

View File

@ -66,7 +66,7 @@ struct dnshdr {
/***************************** PROTOTYPES ********************************/
static void
dns_send_query(int8_t * domain_name, uint8_t ip_version);
dns_send_query(int fd, int8_t * domain_name, uint8_t ip_version);
static void
fill_dnshdr(uint8_t * packet, int8_t * domain_name, uint8_t ip_version);
@ -125,6 +125,7 @@ dns_init(uint32_t _dns_server_ip, uint8_t _dns_server_ipv6[16], uint8_t ip_versi
* <br>(e.g. "www.host.org");
* </ul>
*
* @param fd socket descriptor
* @param url the URL to be resolved
* @param domain_ip In case of SUCCESS stores extracted IP.
* In case of FAULT stores zeros (0.0.0.0).
@ -132,7 +133,7 @@ dns_init(uint32_t _dns_server_ip, uint8_t _dns_server_ipv6[16], uint8_t ip_versi
* FALSE - error condition occurs.
*/
int8_t
dns_get_ip(int8_t * url, uint8_t * domain_ip, uint8_t ip_version)
dns_get_ip(int fd, int8_t * url, uint8_t * domain_ip, uint8_t ip_version)
{
/* this counter is used so that we abort after 30 DNS request */
int32_t i;
@ -171,14 +172,14 @@ dns_get_ip(int8_t * url, uint8_t * domain_ip, uint8_t ip_version)
for(i = 0; i < 30; ++i) {
// Use canonical name in case we obtained it
if (strlen((char *) dns_domain_cname))
dns_send_query(dns_domain_cname, ip_version);
dns_send_query(fd, dns_domain_cname, ip_version);
else
dns_send_query(dns_domain_name, ip_version);
dns_send_query(fd, dns_domain_name, ip_version);
// setting up a timer with a timeout of one seconds
set_timer(TICKS_SEC);
do {
receive_ether();
receive_ether(fd);
if (dns_error)
return 0; // FALSE - error
if ((dns_result_ip != 0) && (ip_version == 4)) {
@ -295,13 +296,14 @@ handle_dns(uint8_t * packet, int32_t packetsize)
* DNS-server respones with host IP or signals some error condition.
* Responses from the server are handled by handle_dns function.
*
* @param fd socket descriptor
* @param domain_name the domain name given as series of labels preceded
* with length(label) and terminated with 0
* <br>(e.g. "\3,w,w,w,\4,h,o,s,t,\3,o,r,g,\0")
* @see handle_dns
*/
static void
dns_send_query(int8_t * domain_name, uint8_t ip_version)
dns_send_query(int fd, int8_t * domain_name, uint8_t ip_version)
{
int qry_len = strlen((char *) domain_name) + 5;
int iphdr_len = (ip_version == 4) ? sizeof(struct iphdr) : sizeof(struct ip6hdr);
@ -333,7 +335,7 @@ dns_send_query(int8_t * domain_name, uint8_t ip_version)
&server_ipv6);
}
send_ip(ether_packet, packetsize);
send_ip(fd, ether_packet, packetsize);
}
/**

View File

@ -20,7 +20,7 @@
extern int8_t dns_init(uint32_t _dns_server_ip, uint8_t _dns_server_ipv6[16], uint8_t ip_version);
/* For given URL retrieves IPv4 from DNS-server. */
extern int8_t dns_get_ip(int8_t * url, uint8_t * domain_ip, uint8_t ip_version);
extern int8_t dns_get_ip(int fd, int8_t * url, uint8_t * domain_ip, uint8_t ip_version);
/* Handles DNS-packets, which are detected by receive_ether. */
extern int32_t handle_dns(uint8_t * packet, int32_t packetsize);

View File

@ -103,16 +103,17 @@ is_multicast_mac(uint8_t * mac) {
* Ethernet: Receives an ethernet-packet and handles it according to
* Receive-handle diagram.
*
* @param fd socket fd
* @return ZERO - packet was handled or no packets received;
* NON ZERO - error condition occurs.
*/
int32_t
receive_ether(void) {
receive_ether(int fd) {
int32_t bytes_received;
struct ethhdr * ethh;
memset(ether_packet, 0, ETH_MTU_SIZE);
bytes_received = recv(0, ether_packet, ETH_MTU_SIZE, 0);
bytes_received = recv(fd, ether_packet, ETH_MTU_SIZE, 0);
if (!bytes_received) // No messages
return 0;
@ -130,15 +131,15 @@ receive_ether(void) {
switch (htons(ethh -> type)) {
case ETHERTYPE_IP:
return handle_ipv4((uint8_t*) (ethh + 1),
return handle_ipv4(fd, (uint8_t*) (ethh + 1),
bytes_received - sizeof(struct ethhdr));
case ETHERTYPE_IPv6:
return handle_ipv6(ether_packet + sizeof(struct ethhdr),
return handle_ipv6(fd, ether_packet + sizeof(struct ethhdr),
bytes_received - sizeof(struct ethhdr));
case ETHERTYPE_ARP:
return handle_arp((uint8_t*) (ethh + 1),
return handle_arp(fd, (uint8_t*) (ethh + 1),
bytes_received - sizeof(struct ethhdr));
default:
break;
@ -152,9 +153,9 @@ receive_ether(void) {
* @return number of transmitted bytes
*/
int
send_ether(void* buffer, int len)
send_ether(int fd, void* buffer, int len)
{
return send(0, buffer, len, 0);
return send(fd, buffer, len, 0);
}
/**

View File

@ -35,10 +35,10 @@ extern void set_mac_address(const uint8_t * own_mac);
extern const uint8_t * get_mac_address(void);
/* Receives and handles packets, according to Receive-handle diagram */
extern int32_t receive_ether(void);
extern int32_t receive_ether(int fd);
/* Sends an ethernet frame. */
extern int send_ether(void* buffer, int len);
extern int send_ether(int fd, void* buffer, int len);
/* fills ethernet header */
extern void fill_ethhdr(uint8_t * packet, uint16_t eth_type,

View File

@ -25,10 +25,10 @@ static int ra_received = 0;
/**
* NET:
*
* @param fd socket fd
*/
void
send_router_solicitation ()
send_router_solicitation (int fd)
{
ip6_addr_t dest_addr;
uint8_t ether_packet[ETH_MTU_SIZE];
@ -58,7 +58,7 @@ send_router_solicitation ()
memcpy( &(headers.icmp6h->icmp6body.router_solicit.lladdr.mac),
get_mac_address(), 6);
send_ip (headers.ip6h, sizeof(struct ip6hdr) +
send_ip (fd, headers.ip6h, sizeof(struct ip6hdr) +
ICMPv6_HEADER_SIZE + sizeof(struct router_solicitation));
}
@ -194,10 +194,11 @@ int is_ra_received(void)
/**
* NET:
*
* @param fd socket fd
* @param ip6_addr_t *dest_ip6
*/
void
send_neighbour_solicitation (ip6_addr_t *dest_ip6)
send_neighbour_solicitation (int fd, ip6_addr_t *dest_ip6)
{
ip6_addr_t snma;
@ -233,7 +234,7 @@ send_neighbour_solicitation (ip6_addr_t *dest_ip6)
memcpy( &(headers.icmp6h->icmp6body.nghb_solicit.lladdr.mac),
get_mac_address(), 6);
send_ip (ether_packet + sizeof(struct ethhdr),
send_ip (fd, ether_packet + sizeof(struct ethhdr),
sizeof(struct ip6hdr) + ICMPv6_HEADER_SIZE +
sizeof(struct neighbour_solicitation));
}
@ -241,12 +242,13 @@ send_neighbour_solicitation (ip6_addr_t *dest_ip6)
/**
* NET:
*
* @param fd socket fd
* @param ip6_packet pointer to an IPv6 packet
* @param icmp6hdr pointer to the icmp6 header in ip6_packet
* @param na_flags Neighbour advertisment flags
*/
static void
send_neighbour_advertisement (struct neighbor *target)
send_neighbour_advertisement (int fd, struct neighbor *target)
{
struct na_flags na_adv_flags;
uint8_t ether_packet[ETH_MTU_SIZE];
@ -297,7 +299,7 @@ send_neighbour_advertisement (struct neighbor *target)
memcpy( &(headers.icmp6h->icmp6body.nghb_adv.lladdr.mac),
get_mac_address(), 6);
send_ip (ether_packet + sizeof(struct ethhdr),
send_ip (fd, ether_packet + sizeof(struct ethhdr),
sizeof(struct ip6hdr) + ICMPv6_HEADER_SIZE +
sizeof(struct neighbour_advertisement));
}
@ -305,10 +307,11 @@ send_neighbour_advertisement (struct neighbor *target)
/**
* NET:
*
* @param fd socket fd
* @param ip6_packet pointer to an IPv6 packet
*/
static int8_t
handle_na (uint8_t *packet)
handle_na (int fd, uint8_t *packet)
{
struct neighbor *n = NULL;
struct packeth headers;
@ -338,7 +341,7 @@ handle_na (uint8_t *packet)
if (n->eth_len > 0) {
struct ethhdr * ethh = (struct ethhdr *) &(n->eth_frame);
memcpy(ethh->dest_mac, &(n->mac), 6);
send_ether (&(n->eth_frame), n->eth_len + sizeof(struct ethhdr));
send_ether (fd, &(n->eth_frame), n->eth_len + sizeof(struct ethhdr));
n->eth_len = 0;
}
}
@ -349,11 +352,12 @@ handle_na (uint8_t *packet)
/**
* NET: Handles ICMPv6 messages
*
* @param fd socket fd
* @param ip6_packet pointer to an IPv6 packet
* @param packetsize size of ipv6_packet
*/
int8_t
handle_icmpv6 (struct ethhdr *etherhdr,
handle_icmpv6 (int fd, struct ethhdr *etherhdr,
uint8_t *ip6_packet)
{
@ -371,10 +375,10 @@ handle_icmpv6 (struct ethhdr *etherhdr,
/* process ICMPv6 types */
switch(received_icmp6->type) {
case ICMPV6_NEIGHBOUR_SOLICITATION:
send_neighbour_advertisement( &target );
send_neighbour_advertisement(fd, &target);
break;
case ICMPV6_NEIGHBOUR_ADVERTISEMENT:
handle_na((uint8_t *) ip6_packet - sizeof(struct ethhdr));
handle_na(fd, (uint8_t *) ip6_packet - sizeof(struct ethhdr));
break;
case ICMPV6_ROUTER_ADVERTISEMENT:
handle_ra(received_icmp6, (uint8_t *) received_ip6);

View File

@ -47,9 +47,9 @@
#define ICMPV6_REDIRECT_MSG 137 /* Redirect message */
/******** Functions *******************/
int8_t handle_icmpv6 (struct ethhdr *etherhdr, uint8_t *ip6_packet);
void send_neighbour_solicitation( ip6_addr_t *target_ip6);
void send_router_solicitation(void);
int8_t handle_icmpv6 (int fd, struct ethhdr *etherhdr, uint8_t *ip6_packet);
void send_neighbour_solicitation(int fd, ip6_addr_t *target_ip6);
void send_router_solicitation(int fd);
int is_ra_received(void);
/* Prefix information */

View File

@ -87,10 +87,10 @@ static unsigned short
checksum(unsigned short *packet, int words);
static void
arp_send_request(uint32_t dest_ip);
arp_send_request(int fd, uint32_t dest_ip);
static void
arp_send_reply(uint32_t src_ip, uint8_t * src_mac);
arp_send_reply(int fd, uint32_t src_ip, uint8_t * src_mac);
static void
fill_arphdr(uint8_t * packet, uint8_t opcode,
@ -104,7 +104,7 @@ static void
fill_udp_checksum(struct iphdr *ipv4_hdr);
static int8_t
handle_icmp(struct iphdr * iph, uint8_t * packet, int32_t packetsize);
handle_icmp(int fd, struct iphdr * iph, uint8_t * packet, int32_t packetsize);
/*>>>>>>>>>>>>>>>>>>>>>>>>>>>>> LOCAL VARIABLES <<<<<<<<<<<<<<<<<<<<<<<<<*/
@ -129,7 +129,7 @@ static arp_entry_t arp_table[ARP_ENTRIES];
static arp_entry_t pending_pkt;
/* Function pointer send_ip. Points either to send_ipv4() or send_ipv6() */
int (*send_ip) (void *, int);
int (*send_ip) (int fd, void *, int);
/*>>>>>>>>>>>>>>>>>>>>>>>>>>>> IMPLEMENTATION <<<<<<<<<<<<<<<<<<<<<<<<<<<*/
@ -300,6 +300,7 @@ fill_iphdr(uint8_t * packet, uint16_t packetsize,
/**
* IPv4: Handles IPv4-packets according to Receive-handle diagram.
*
* @param fd socket fd
* @param ip_packet IP-packet to be handled
* @param packetsize Length of the packet
* @return ZERO - packet handled successfully;
@ -308,7 +309,7 @@ fill_iphdr(uint8_t * packet, uint16_t packetsize,
* @see iphdr
*/
int8_t
handle_ipv4(uint8_t * ip_packet, int32_t packetsize)
handle_ipv4(int fd, uint8_t * ip_packet, int32_t packetsize)
{
struct iphdr * iph;
int32_t old_sum;
@ -377,10 +378,10 @@ handle_ipv4(uint8_t * ip_packet, int32_t packetsize)
switch (iph -> ip_p) {
case IPTYPE_ICMP:
return handle_icmp(iph, ip_packet + sizeof(struct iphdr),
return handle_icmp(fd, iph, ip_packet + sizeof(struct iphdr),
iph -> ip_len - sizeof(struct iphdr));
case IPTYPE_UDP:
return handle_udp(ip_packet + sizeof(struct iphdr),
return handle_udp(fd, ip_packet + sizeof(struct iphdr),
iph -> ip_len - sizeof(struct iphdr));
case IPTYPE_TCP:
return handle_tcp(ip_packet + sizeof(struct iphdr),
@ -409,6 +410,7 @@ handle_ipv4(uint8_t * ip_packet, int32_t packetsize)
* If there is already an ARP request pending, then we drop this packet
* and send again an ARP request.
*
* @param fd socket fd
* @param ip_packet IP-packet to be handled
* @param packetsize Length of the packet
* @return -2 - packet dropped (MAC address not resolved - ARP request pending)
@ -421,7 +423,7 @@ handle_ipv4(uint8_t * ip_packet, int32_t packetsize)
* @see iphdr
*/
int
send_ipv4(void* buffer, int len)
send_ipv4(int fd, void* buffer, int len)
{
arp_entry_t *arp_entry = 0;
struct iphdr *ip;
@ -482,7 +484,7 @@ send_ipv4(void* buffer, int len)
// If we could not resolv the MAC address by our own...
if(!mac_addr) {
// send the ARP request
arp_send_request(ip->ip_dst);
arp_send_request(fd, ip->ip_dst);
// drop the current packet if there is already a ARP request pending
if(arp_entry)
@ -510,7 +512,7 @@ send_ipv4(void* buffer, int len)
set_timer(TICKS_SEC);
do {
receive_ether();
receive_ether(fd);
if (!arp_entry->eth_len)
break;
} while (get_timer() > 0);
@ -522,7 +524,7 @@ send_ipv4(void* buffer, int len)
fill_ethhdr(arp_entry->eth_frame, htons(ETHERTYPE_IP),
get_mac_address(), mac_addr);
memcpy(&arp_entry->eth_frame[sizeof(struct ethhdr)], buffer, len);
return send_ether(arp_entry->eth_frame, len + sizeof(struct ethhdr));
return send_ether(fd, arp_entry->eth_frame, len + sizeof(struct ethhdr));
}
/**
@ -609,10 +611,11 @@ lookup_mac_addr(uint32_t ipv4_addr)
* ARP: Sends an ARP-request package.
* For given IPv4 retrieves MAC via ARP (makes several attempts)
*
* @param fd socket fd
* @param dest_ip IP of the host which MAC should be obtained
*/
static void
arp_send_request(uint32_t dest_ip)
arp_send_request(int fd, uint32_t dest_ip)
{
arp_entry_t *arp_entry = &arp_table[arp_producer];
@ -622,7 +625,7 @@ arp_send_request(uint32_t dest_ip)
fill_ethhdr(arp_entry->eth_frame, ETHERTYPE_ARP,
get_mac_address(), broadcast_mac);
send_ether(arp_entry->eth_frame,
send_ether(fd, arp_entry->eth_frame,
sizeof(struct ethhdr) + sizeof(struct arphdr));
}
@ -631,11 +634,12 @@ arp_send_request(uint32_t dest_ip)
* This package is used to serve foreign requests (in case IP in
* foreign request matches our host IP).
*
* @param fd socket fd
* @param src_ip requester IP address (foreign IP)
* @param src_mac requester MAC address (foreign MAC)
*/
static void
arp_send_reply(uint32_t src_ip, uint8_t * src_mac)
arp_send_reply(int fd, uint32_t src_ip, uint8_t * src_mac)
{
arp_entry_t *arp_entry = &arp_table[arp_producer];
@ -645,7 +649,7 @@ arp_send_reply(uint32_t src_ip, uint8_t * src_mac)
fill_arphdr(&arp_entry->eth_frame[sizeof(struct ethhdr)], ARP_REPLY,
get_mac_address(), own_ip, src_mac, src_ip);
send_ether(arp_entry->eth_frame,
send_ether(fd, arp_entry->eth_frame,
sizeof(struct ethhdr) + sizeof(struct arphdr));
}
@ -689,6 +693,7 @@ fill_arphdr(uint8_t * packet, uint8_t opcode,
* ARP: Handles ARP-messages according to Receive-handle diagram.
* Updates arp_table for outstanding ARP requests (see arp_getmac).
*
* @param fd socket fd
* @param packet ARP-packet to be handled
* @param packetsize length of the packet
* @return ZERO - packet handled successfully;
@ -698,7 +703,7 @@ fill_arphdr(uint8_t * packet, uint8_t opcode,
* @see arphdr
*/
int8_t
handle_arp(uint8_t * packet, int32_t packetsize)
handle_arp(int fd, uint8_t * packet, int32_t packetsize)
{
struct arphdr * arph = (struct arphdr *) packet;
@ -715,7 +720,7 @@ handle_arp(uint8_t * packet, int32_t packetsize)
case ARP_REQUEST:
// foreign request
if(own_ip != 0)
arp_send_reply(htonl(arph->src_ip), arph -> src_mac);
arp_send_reply(fd, htonl(arph->src_ip), arph -> src_mac);
return 0; // no error
case ARP_REPLY: {
unsigned int i;
@ -748,7 +753,7 @@ handle_arp(uint8_t * packet, int32_t packetsize)
struct ethhdr * ethh = (struct ethhdr *) pending_pkt.eth_frame;
memcpy(ethh -> dest_mac, arp_table[i].mac_addr, 6);
send_ether(pending_pkt.eth_frame, pending_pkt.eth_len);
send_ether(fd, pending_pkt.eth_frame, pending_pkt.eth_len);
pending_pkt.pkt_pending = 0;
arp_table[i].eth_len = 0;
}
@ -768,10 +773,11 @@ handle_arp(uint8_t * packet, int32_t packetsize)
* In other words, reading a value of 0 form this variable
* means that an answer to the request has been arrived.
*
* @param fd socket descriptor
* @param _ping_dst_ip destination IPv4 address
*/
void
ping_ipv4(uint32_t _ping_dst_ip)
ping_ipv4(int fd, uint32_t _ping_dst_ip)
{
unsigned char packet[sizeof(struct iphdr) + sizeof(struct icmphdr)];
struct icmphdr *icmp;
@ -794,7 +800,7 @@ ping_ipv4(uint32_t _ping_dst_ip)
icmp->checksum =
checksum((unsigned short *) icmp, sizeof(struct icmphdr) >> 1);
send_ipv4(packet, sizeof(struct iphdr) + sizeof(struct icmphdr));
send_ipv4(fd, packet, sizeof(struct iphdr) + sizeof(struct icmphdr));
}
/**
@ -813,6 +819,7 @@ pong_ipv4(void)
/**
* ICMP: Handles ICMP-packets according to Receive-handle diagram.
*
* @param fd socket fd
* @param icmp_packet ICMP-packet to be handled
* @param packetsize Length of the packet
* @return ZERO - packet handled successfully;
@ -820,7 +827,7 @@ pong_ipv4(void)
* @see handle_ipv4
*/
static int8_t
handle_icmp(struct iphdr * iph, uint8_t * packet, int32_t packetsize)
handle_icmp(int fd, struct iphdr * iph, uint8_t * packet, int32_t packetsize)
{
struct icmphdr *icmp = (struct icmphdr *) packet;
@ -873,7 +880,7 @@ handle_icmp(struct iphdr * iph, uint8_t * packet, int32_t packetsize)
reply_icmph->checksum = checksum((unsigned short *) reply_icmph,
sizeof(struct icmphdr) >> 1);
send_ipv4(reply_packet, sizeof(struct iphdr) + packetsize);
send_ipv4(fd, reply_packet, sizeof(struct iphdr) + packetsize);
break;
}
case ICMP_TIME_EXCEEDED:

View File

@ -70,7 +70,7 @@ extern uint32_t get_ipv4_router(void);
extern void set_ipv4_netmask(uint32_t subnet_mask);
extern uint32_t get_ipv4_netmask(void);
extern int (*send_ip) (void *, int);
extern int (*send_ip) (int fd, void *, int);
/* fills ip header */
extern void fill_iphdr(uint8_t * packet, uint16_t packetsize,
@ -79,18 +79,18 @@ extern void fill_iphdr(uint8_t * packet, uint16_t packetsize,
/* Send a IPv4 packet. Adding the Ethernet-Header and resolving the
* MAC address is done transparent in the background if necessary.
*/
extern int send_ipv4(void* buffer, int len);
extern int send_ipv4(int fd, void* buffer, int len);
/* Sends an ICMP Echo request to destination IPv4 address */
extern void ping_ipv4(uint32_t _ping_dst_ip);
extern void ping_ipv4(int fd, uint32_t _ping_dst_ip);
/* Returns host IPv4 address that we are waiting for a response */
extern uint32_t pong_ipv4(void);
/* Handles IPv4-packets that are detected by receive_ether. */
extern int8_t handle_ipv4(uint8_t * packet, int32_t packetsize);
extern int8_t handle_ipv4(int fd, uint8_t * packet, int32_t packetsize);
/* Handles ARP-packets that are detected by receive_ether. */
extern int8_t handle_arp(uint8_t * packet, int32_t packetsize);
extern int8_t handle_arp(int fd, uint8_t * packet, int32_t packetsize);
#endif

View File

@ -32,7 +32,7 @@
/****************************** PROTOTYPES *******************************/
int8_t ip6addr_add (struct ip6addr_list_entry *new_address);
static void ipv6_init(void);
static void ipv6_init(int fd);
static int ip6_is_multicast (ip6_addr_t * ip);
/****************************** LOCAL VARIABLES **************************/
@ -52,12 +52,12 @@ static uint8_t null_mac[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
/**
* IPv6: Set the own IPv6 address.
*
* @param fd Socket descriptor
* @param _own_ip client IPv6 address (e.g. ::1)
*/
void
set_ipv6_address (ip6_addr_t *_own_ip6)
set_ipv6_address (int fd, ip6_addr_t *_own_ip6)
{
own_ip6 = malloc (sizeof(struct ip6addr_list_entry));
/* If no address was passed as a parameter generate a link-local
@ -72,7 +72,7 @@ set_ipv6_address (ip6_addr_t *_own_ip6)
/* Add to our list of IPv6 addresses */
ip6addr_add (own_ip6);
ipv6_init();
ipv6_init(fd);
}
/**
@ -110,6 +110,7 @@ find_ip6addr (ip6_addr_t *ip)
/**
* NET: Handles IPv6-packets
*
* @param fd - Socket descriptor
* @param ip6_packet - Pointer to IPv6 header
* @param packetsize - Size of Ipv6 packet
* @return ERROR - -1 if packet is too small or unknown protocol
@ -119,7 +120,7 @@ find_ip6addr (ip6_addr_t *ip)
* @see ip6hdr
*/
int8_t
handle_ipv6 (uint8_t * ip6_packet, int32_t packetsize)
handle_ipv6 (int fd, uint8_t * ip6_packet, int32_t packetsize)
{
struct ip6hdr *ip6 = NULL;
@ -134,10 +135,10 @@ handle_ipv6 (uint8_t * ip6_packet, int32_t packetsize)
switch (ip6->nh) {
case IPTYPE_UDP:
return handle_udp (ip6_packet + sizeof (struct ip6hdr),
return handle_udp (fd, ip6_packet + sizeof (struct ip6hdr),
ip6->pl);
case IPTYPE_ICMPV6:
return handle_icmpv6 ((struct ethhdr *) ip6_packet - sizeof(struct ethhdr),
return handle_icmpv6 (fd, (struct ethhdr *) ip6_packet - sizeof(struct ethhdr),
ip6_packet);
}
@ -329,9 +330,10 @@ ip6addr_add (struct ip6addr_list_entry *new_address)
/**
* NET: Initialize IPv6
*
* @param fd socket fd
*/
static void
ipv6_init ()
ipv6_init (int fd)
{
int i = 0;
@ -363,11 +365,11 @@ ipv6_init ()
first_neighbor = NULL;
last_neighbor = first_neighbor;
send_router_solicitation ();
send_router_solicitation (fd);
for(i=0; i < 4 && !is_ra_received(); i++) {
set_timer(TICKS_SEC);
do {
receive_ether();
receive_ether(fd);
if (is_ra_received())
break;
} while (get_timer() > 0);
@ -467,6 +469,7 @@ ip6_checksum (struct ip6hdr *ip6h, unsigned short *packet, int words)
/**
* NET: Handles IPv6-packets
*
* @param fd socket fd
* @param ip6_packet Pointer to IPv6 header in packet
* @param packetsize Size of IPv6 packet
* @return -1 == ERRROR
@ -476,7 +479,7 @@ ip6_checksum (struct ip6hdr *ip6h, unsigned short *packet, int words)
* @see ip6hdr
*/
int
send_ipv6 (void* buffer, int len)
send_ipv6 (int fd, void* buffer, int len)
{
struct neighbor *n;
struct ip6hdr *ip6h;
@ -544,7 +547,7 @@ send_ipv6 (void* buffer, int len)
if (! memcmp (mac_addr, &null_mac, 6)) {
if (n->eth_len == 0) {
send_neighbour_solicitation (&ip_dst);
send_neighbour_solicitation (fd, &ip_dst);
// Store the packet until we know the MAC address
memset(n->eth_frame, 0, 1500);
@ -557,7 +560,7 @@ send_ipv6 (void* buffer, int len)
n->eth_len = len;
set_timer(TICKS_SEC);
do {
receive_ether();
receive_ether(fd);
} while (get_timer() > 0);
}
}
@ -566,7 +569,7 @@ send_ipv6 (void* buffer, int len)
fill_ethhdr (n->eth_frame, htons(ETHERTYPE_IPv6), get_mac_address(),
mac_addr);
memcpy (&(n->eth_frame[sizeof(struct ethhdr)]), buffer, len);
return send_ether (n->eth_frame, len + sizeof(struct ethhdr));
return send_ether (fd, n->eth_frame, len + sizeof(struct ethhdr));
}
static int

View File

@ -130,7 +130,7 @@ struct ip6_config {
/******************** VARIABLES **********************************************/
/* Function pointer send_ip. Points either to send_ipv4() or send_ipv6() */
extern int (*send_ip) (void *, int);
extern int (*send_ip) (int fd, void *, int);
/* IPv6 link-local multicast addresses */
struct ip6addr_list_entry all_routers_ll; // Routers
@ -151,14 +151,14 @@ struct router *last_router;
/******************** FUNCTIONS *********************************************/
/* Handles IPv6-packets that are detected by receive_ether. */
int8_t handle_ipv6(uint8_t * ip6_packet, int32_t packetsize);
int8_t handle_ipv6(int fd, uint8_t * ip6_packet, int32_t packetsize);
/* Fill IPv6 header */
void fill_ip6hdr(uint8_t * packet, uint16_t packetsize,
uint8_t ip_proto, ip6_addr_t *ip6_src, ip6_addr_t *ip6_dst);
/* Set own IPv6 address */
void set_ipv6_address(ip6_addr_t *own_ip6);
void set_ipv6_address(int fd, ip6_addr_t *own_ip6);
/* Get own IPv6 address */
ip6_addr_t *get_ipv6_address(void);
@ -183,7 +183,7 @@ int8_t ip6_cmp( ip6_addr_t *ip_1, ip6_addr_t *ip_2 );
int8_t unknown_prefix (ip6_addr_t *ip);
/* Send IPv6 packet */
int send_ipv6 (void* buffer, int len);
int send_ipv6 (int fd, void* buffer, int len);
/* Add IPv6 address to list */
int8_t ip6addr_add (struct ip6addr_list_entry *new_address);

View File

@ -86,9 +86,11 @@ dump_package(unsigned char *buffer, unsigned int len)
/**
* send_rrq - Sends a read request package.
*
* @fd: Socket Descriptor
*/
static void
send_rrq(void)
send_rrq(int fd)
{
int ip_len = 0;
int ip6_payload_len = 0;
@ -142,7 +144,7 @@ send_rrq(void)
ptr += strlen("blksize") + 1;
memcpy(ptr, blocksize_str, strlen(blocksize_str) + 1);
send_ip (packet, ip_len);
send_ip (fd, packet, ip_len);
#ifdef __DEBUG__
printf("tftp RRQ with %d bytes transmitted.\n", ip_len);
@ -157,7 +159,7 @@ send_rrq(void)
* @dport: UDP destination port
*/
static void
send_ack(int blckno, unsigned short dport)
send_ack(int fd, int blckno, unsigned short dport)
{
int ip_len = 0;
int ip6_payload_len = 0;
@ -192,7 +194,7 @@ send_ack(int blckno, unsigned short dport)
tftp->th_opcode = htons(ACK);
tftp->th_data = htons(blckno);
send_ip(packet, ip_len);
send_ip(fd, packet, ip_len);
#ifdef __DEBUG__
printf("tftp ACK %d bytes transmitted.\n", ip_len);
@ -204,11 +206,12 @@ send_ack(int blckno, unsigned short dport)
/**
* send_error - Sends an error package.
*
* @fd: Socket Descriptor
* @error_code: Used sub code for error packet
* @dport: UDP destination port
*/
static void
send_error(int error_code, unsigned short dport)
send_error(int fd, int error_code, unsigned short dport)
{
int ip_len = 0;
int ip6_payload_len = 0;
@ -244,7 +247,7 @@ send_error(int error_code, unsigned short dport)
tftp->th_data = htons(error_code);
((char *) &tftp->th_data)[2] = 0;
send_ip(packet, ip_len);
send_ip(fd, packet, ip_len);
#ifdef __DEBUG__
printf("tftp ERROR %d bytes transmitted.\n", ip_len);
@ -330,13 +333,14 @@ get_blksize(unsigned char *buffer, unsigned int len)
* I for an ICMP packet
* #+* for different unexpected TFTP packets (not very good)
*
* @param fd socket descriptor
* @param packet points to the UDP header of the packet
* @param len the length of the network packet
* @return ZERO if packet was handled successfully
* ERRORCODE if error occurred
*/
int32_t
handle_tftp(uint8_t *pkt, int32_t packetsize)
handle_tftp(int fd, uint8_t *pkt, int32_t packetsize)
{
struct udphdr *udph;
struct tftphdr *tftp;
@ -361,17 +365,17 @@ handle_tftp(uint8_t *pkt, int32_t packetsize)
/* an OACK means that the server answers our blocksize request */
blocksize = get_blksize(pkt, packetsize);
if (!blocksize || blocksize > MAX_BLOCKSIZE) {
send_error(8, port_number);
send_error(fd, 8, port_number);
tftp_errno = -8;
goto error;
}
send_ack(0, port_number);
send_ack(fd, 0, port_number);
} else if (tftp->th_opcode == htons(ACK)) {
/* an ACK means that the server did not answers
* our blocksize request, therefore we will set the blocksize
* to the default value of 512 */
blocksize = 512;
send_ack(0, port_number);
send_ack(fd, 0, port_number);
} else if ((unsigned char) tftp->th_opcode == ERROR) {
#ifdef __DEBUG__
printf("tftp->th_opcode : %x\n", tftp->th_opcode);
@ -413,7 +417,7 @@ handle_tftp(uint8_t *pkt, int32_t packetsize)
tftp->th_data, block + 1);
printf("\b+ ");
#endif
send_ack(tftp->th_data, port_number);
send_ack(fd, tftp->th_data, port_number);
lost_packets++;
tftp_err->bad_tftp_packets++;
return 0;
@ -444,7 +448,7 @@ handle_tftp(uint8_t *pkt, int32_t packetsize)
}
memcpy(buffer + received_len, &tftp->th_data + 1,
udph->uh_ulen - 12);
send_ack(tftp->th_data, port_number);
send_ack(fd, tftp->th_data, port_number);
received_len += udph->uh_ulen - 12;
/* Last packet reached if the payload of the UDP packet
* is smaller than blocksize + 12
@ -539,7 +543,7 @@ tftp(filename_ip_t * _fn_ip, unsigned char *_buffer, int _len,
buffer = _buffer;
set_timer(TICKS_SEC);
send_rrq();
send_rrq(fn_ip->fd);
while (! tftp_finished) {
/* if timeout (no packet received) */
@ -547,19 +551,19 @@ tftp(filename_ip_t * _fn_ip, unsigned char *_buffer, int _len,
/* the server doesn't seem to retry let's help out a bit */
if (tftp_err->no_packets > 4 && port_number != -1
&& block > 1) {
send_ack(block, port_number);
send_ack(fn_ip->fd, block, port_number);
}
else if (port_number == -1 && block == 0
&& (tftp_err->no_packets&3) == 3) {
printf("\nRepeating TFTP read request...\n");
send_rrq();
send_rrq(fn_ip->fd);
}
tftp_err->no_packets++;
set_timer(TICKS_SEC);
}
/* handle received packets */
receive_ether();
receive_ether(fn_ip->fd);
/* bad_tftp_packets are counted whenever we receive a TFTP packet
* which was not expected; if this gets larger than 'retries'

View File

@ -29,6 +29,7 @@ typedef struct {
ip6_addr_t server_ip6;
ip6_addr_t dns_ip6;
int8_t filename[256];
int fd;
} __attribute__ ((packed)) filename_ip_t ;
typedef struct {
@ -43,8 +44,8 @@ int tftp(filename_ip_t *, unsigned char *, int, unsigned int,
int tftp_netsave(filename_ip_t *, uint8_t * buffer, int len,
int use_ci, unsigned int retries, tftp_err_t * tftp_err);
int32_t handle_tftp(uint8_t *, int32_t);
int32_t handle_tftp(int fd, uint8_t *, int32_t);
void handle_tftp_dun(uint8_t err_code);
int parse_tftp_args(char buffer[], char *server_ip, char filename[], int len);
int parse_tftp_args(char buffer[], char *server_ip, char filename[], int fd, int len);
#endif

View File

@ -57,7 +57,7 @@ void net_set_mtftp_port(uint16_t tftp_port) {
* @see udphdr
*/
int8_t
handle_udp(uint8_t * udp_packet, int32_t packetsize) {
handle_udp(int fd, uint8_t * udp_packet, int32_t packetsize) {
struct udphdr * udph = (struct udphdr *) udp_packet;
if (packetsize < sizeof(struct udphdr))
@ -66,7 +66,7 @@ handle_udp(uint8_t * udp_packet, int32_t packetsize) {
switch (htons(udph -> uh_dport)) {
case UDPPORT_BOOTPC:
if (udph -> uh_sport == htons(UDPPORT_BOOTPS))
return handle_dhcp(udp_packet + sizeof(struct udphdr),
return handle_dhcp(fd, udp_packet + sizeof(struct udphdr),
packetsize - sizeof(struct udphdr));
else
return -1;
@ -81,18 +81,18 @@ handle_udp(uint8_t * udp_packet, int32_t packetsize) {
packetsize - sizeof(struct udphdr));
case UDPPORT_TFTPC:
#ifdef USE_MTFTP
return handle_tftp(udp_packet + sizeof(struct udphdr),
return handle_tftp(fd, udp_packet + sizeof(struct udphdr),
packetsize - sizeof(struct udphdr));
#else
return handle_tftp(udp_packet, packetsize);
return handle_tftp(fd, udp_packet, packetsize);
#endif
default:
#ifdef USE_MTFTP
if (htons(udph -> uh_dport) == net_tftp_uport)
return handle_tftp(udp_packet + sizeof(struct udphdr),
return handle_tftp(fd, udp_packet + sizeof(struct udphdr),
packetsize - sizeof(struct udphdr));
else if (htons(udph -> uh_dport) == net_mtftp_uport)
return handle_tftp(udp_packet + sizeof(struct udphdr),
return handle_tftp(fd, udp_packet + sizeof(struct udphdr),
packetsize - sizeof(struct udphdr));
#endif
return -1;

View File

@ -40,7 +40,7 @@ typedef int32_t *(*handle_upper_udp_t)(uint8_t *, int32_t);
typedef void *(*handle_upper_udp_dun_t)(uint8_t);
/* Handles UDP-packets that are detected by any network layer. */
extern int8_t handle_udp(uint8_t * udp_packet, int32_t packetsize);
extern int8_t handle_udp(int fd, uint8_t * udp_packet, int32_t packetsize);
/* Handles UDP related ICMP-Dest.Unreachable packets that are detected by
* the network layers. */