slirp_data = ed;
uae_sem_init (&slirp_sem1, 0, 1);
uae_sem_init (&slirp_sem2, 0, 1);
- uae_slirp_init();
+ if (uae_slirp_init() < 0) {
+ slirp_data = NULL;
+ uae_sem_destroy (&slirp_sem1);
+ uae_sem_destroy (&slirp_sem2);
+ return 0;
+ }
for (int i = 0; i < MAX_SLIRP_REDIRS; i++) {
struct slirp_redir *sr = &currprefs.slirp_redirs[i];
if (sr->proto) {
}
}
netmode = ndd->type;
- uae_slirp_start ();
+ if (!uae_slirp_start ()) {
+ uae_slirp_cleanup ();
+ slirp_data = NULL;
+ uae_sem_destroy (&slirp_sem1);
+ uae_sem_destroy (&slirp_sem2);
+ return 0;
+ }
}
return 1;
#endif
case UAENET_SLIRP:
case UAENET_SLIRP_INBOUND:
if (slirp_data) {
- slirp_data = NULL;
uae_slirp_end ();
uae_slirp_cleanup ();
+ slirp_data = NULL;
uae_sem_destroy (&slirp_sem1);
uae_sem_destroy (&slirp_sem2);
}
static const uint8_t rfc1533_cookie[] = { RFC1533_COOKIE };
+void bootp_reset(void)
+{
+ memset(bootp_clients, 0, sizeof bootp_clients);
+}
+
static BOOTPClient *get_new_addr(struct in_addr *paddr)
{
BOOTPClient *bc;
memset(rbp, 0, sizeof(struct bootp_t));
if (dhcp_msg_type == DHCPDISCOVER) {
+ bc = find_addr(&daddr.sin_addr, bp->bp_hwaddr);
+ if (bc)
+ goto have_addr;
new_addr:
bc = get_new_addr(&daddr.sin_addr);
- if (!bc)
+ if (!bc) {
+ m_free(m);
return;
+ }
memcpy(bc->macaddr, client_ethaddr, 6);
} else {
bc = find_addr(&daddr.sin_addr, bp->bp_hwaddr);
goto new_addr;
}
}
+have_addr:
saddr.sin_addr.s_addr = htonl(ntohl(special_addr.s_addr) | CTL_ALIAS);
saddr.sin_port = htons(BOOTP_SERVER);
#include "unpacked.h"
void bootp_input(struct mbuf *m);
+void bootp_reset(void);
link_up = 1;
+ bootp_reset();
if_init();
ip_init();
{
ip_cleanup();
m_cleanup();
+ bootp_reset();
link_up = 0;
}
#ifdef WITH_QEMU_SLIRP
if (impl == QEMU_IMPLEMENTATION) {
- return uae_qemu_uae_init() == NULL;
+ return uae_qemu_uae_init() ? 0 : -1;
}
#endif
#ifdef WITH_BUILTIN_SLIRP
static void slirp_receive_func(void *arg)
{
- slirp_thread_active = 1;
while (slirp_thread_active == 1) {
fd_set rfds, wfds, xfds;
INT_PTR nfds;