summaryrefslogtreecommitdiff
path: root/libhw_generic/net.c
blob: d21626e508bafa884861ec70ccdd7f61cf8fa0e3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/* libhw_generic/net.c - Device-independent <libhw/generic/net.h> utilities
 *
 * Copyright (C) 2024-2025  Luke T. Shumaker <lukeshu@lukeshu.com>
 * SPDX-License-Identifier: AGPL-3.0-or-later
 */

#include <libmisc/assert.h>

#include <libhw/generic/net.h>

#define NET_EOTHER              1
#define NET_EARP_TIMEOUT        2
#define NET_EACK_TIMEOUT        3
#define NET_ERECV_TIMEOUT       4
#define NET_ETHREAD             5
#define NET_ECLOSED             6
#define NET_EMSGSIZE            7

const char *net_strerror(int net_errno) {
	switch (net_errno) {
	case NET_EOTHER: return "unknown error";
	case NET_EARP_TIMEOUT: return "ARP timeout";
	case NET_EACK_TIMEOUT: return "TCP ACK timeout";
	case NET_ERECV_TIMEOUT: return "receive timeout";
	case NET_ETHREAD: return "thread error";
	case NET_ECLOSED: return "already closed";
	case NET_EMSGSIZE: return "message too long";
	default:
		assert_notreached("invalid net_errno");
	}
}

void fmt_print_net_ip4_addr(lo_interface fmt_dest w, struct net_ip4_addr addr) {
	fmt_print(w,
	          addr.octets[0], ".",
	          addr.octets[1], ".",
	          addr.octets[2], ".",
	          addr.octets[3]);
}

void fmt_print_net_eth_addr(lo_interface fmt_dest w, struct net_eth_addr addr) {
	fmt_print(w,
	          (base16_u8_, addr.octets[0]), ":",
	          (base16_u8_, addr.octets[1]), ":",
	          (base16_u8_, addr.octets[2]), ":",
	          (base16_u8_, addr.octets[3]), ":",
	          (base16_u8_, addr.octets[4]), ":",
	          (base16_u8_, addr.octets[5]));
}