summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/osdnet.cpp
blob: 5ce4ab0c096e98a84e0d6d35614a6d93e1ce68be (plain) (blame)
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
// license:BSD-3-Clause
// copyright-holders:Carl
#include "emu.h"
#include "osdnet.h"

static class std::vector<std::unique_ptr<osd_netdev::entry_t>> netdev_list;

void add_netdev(const char *name, const char *description, create_netdev func)
{
	auto entry = make_unique_clear<osd_netdev::entry_t>();
	entry->id = netdev_list.size();
	strncpy(entry->name, name, 255);
	entry->name[255] = '\0';
	strncpy(entry->description, (description != nullptr) ? description : "(no name)", 255);
	entry->description[255] = '\0';
	entry->func = func;
	netdev_list.push_back(std::move(entry));
}

void clear_netdev()
{
	netdev_list.clear();
}

const std::vector<std::unique_ptr<osd_netdev::entry_t>>& get_netdev_list()
{
	return netdev_list;
}

class osd_netdev *open_netdev(int id, class device_network_interface *ifdev, int rate)
{
	for(auto &entry : netdev_list)
		if(entry->id==id)
			return entry->func(entry->name, ifdev, rate);
	return nullptr;
}

osd_netdev::osd_netdev(class device_network_interface *ifdev, int rate)
{
	m_dev = ifdev;
	m_stop = false;
	m_timer = ifdev->device().machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(osd_netdev::recv), this));
	m_timer->adjust(attotime::from_hz(rate), 0, attotime::from_hz(rate));
}

osd_netdev::~osd_netdev()
{
	m_stop = true;
// nasty hack to prevent Segmentation fault on emulation stop
//  m_timer->reset();
}

int osd_netdev::send(uint8_t *buf, int len)
{
	return 0;
}

void osd_netdev::recv(void *ptr, int param)
{
	uint8_t *buf;
	int len;
	//const char atalkmac[] = { 0x09, 0x00, 0x07, 0xff, 0xff, 0xff };
	while((!m_stop) && (len = recv_dev(&buf)))
	{
#if 0
		if(buf[0] & 1)
		{
			if(memcmp("\xff\xff\xff\xff\xff\xff", buf, 6) && memcmp(atalkmac, buf, 6) && !m_dev->mcast_chk(buf, len)) continue;
		}
		else {
			//const unsigned char *ourmac = (const unsigned char *)get_mac();
			//printf("our mac: %.2X:%.2X:%.2X:%.2X:%.2X:%.2X dst mac: %.2X:%.2X:%.2X:%.2X:%.2X:%.2X\n", ourmac[0], ourmac[1], ourmac[2], ourmac[3], ourmac[4], ourmac[5], buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
			if(memcmp(get_mac(), buf, 6) && !get_promisc()) continue;
		}
#endif

		m_dev->recv_cb(buf, len);
	}
}

int osd_netdev::recv_dev(uint8_t **buf)
{
	return 0;
}

void osd_netdev::set_mac(const char *mac)
{
}

void osd_netdev::set_promisc(bool promisc)
{
}

bool osd_netdev::get_promisc()
{
	if(m_dev)
		return m_dev->get_promisc();
	return false;
}

const char *osd_netdev::get_mac()
{
	if(m_dev)
		return m_dev->get_mac();
	return "\0\0\0\0\0\0";
}

int netdev_count()
{
	return netdev_list.size();
}

void osd_list_network_adapters(void)
{
	#ifdef USE_NETWORK
	int num_devs = netdev_list.size();

	if (num_devs == 0)
	{
		printf("No network adapters were found\n");
		return;
	}

	printf("Available network adapters:\n");
	for (auto &entry : netdev_list)
	{
		printf("    %s\n", entry->description);
	}

	#else
	printf("Network is not supported in this build\n");
	#endif
}