From 2eef36404e316a9bd2f69a3589ffd73b04b29794 Mon Sep 17 00:00:00 2001 From: neil Date: Fri, 10 Aug 2012 21:53:20 +0000 Subject: [PATCH] Restart DHCP client when a wireles driver connects to a new network. git-svn-id: https://svn.aros.org/svn/aros/trunk/AROS@45505 fb15a70f-31f2-0310-bbcc-cdcc74a49acc --- .../network/stacks/AROSTCP/bsdsocket/net/if_sana.c | 52 +++++++++++++++++++++- .../network/stacks/AROSTCP/bsdsocket/net/if_sana.h | 3 +- .../network/stacks/AROSTCP/bsdsocket/version.h | 10 ++--- 3 files changed, 57 insertions(+), 8 deletions(-) diff --git a/workbench/network/stacks/AROSTCP/bsdsocket/net/if_sana.c b/workbench/network/stacks/AROSTCP/bsdsocket/net/if_sana.c index 5c22708c01..d5d0d590ac 100644 --- a/workbench/network/stacks/AROSTCP/bsdsocket/net/if_sana.c +++ b/workbench/network/stacks/AROSTCP/bsdsocket/net/if_sana.c @@ -2,7 +2,7 @@ * Copyright (C) 1993 AmiTCP/IP Group, * Helsinki University of Technology, Finland. * All rights reserved. - * Copyright (C) 2005 - 2007 The AROS Dev Team + * Copyright (C) 2005 - 2012 The AROS Dev Team * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as @@ -101,6 +101,7 @@ sana_read(struct sana_softc *ssc, struct IOIPReq *req, static void sana_ip_read(struct sana_softc *ssc, struct IOIPReq *req); static void sana_arp_read(struct sana_softc *ssc, struct IOIPReq *req); static void sana_online(struct sana_softc *ssc, struct IOIPReq *req); +static void sana_connect(struct sana_softc *ssc, struct IOIPReq *req); static void free_written_packet(struct sana_softc *ssc, struct IOIPReq *req); static int sana_query(struct ifnet *ifn, struct TagItem *tag); @@ -538,6 +539,24 @@ sana_run(struct sana_softc *ssc, int requests, struct ifaddr *ifa) next = req; } ssc->ss_reqs = next; + + /* Order a notify when driver connects to a (wireless) network */ + if (ssc->ss_if.if_data.ifi_aros_usedhcp == 1) { + if ((req = CreateIORequest(SanaPort, sizeof(*req))) != NULL) { + ssc->ss_eventsent++; + req->ioip_s2.ios2_Req.io_Device = ssc->ss_dev; + req->ioip_s2.ios2_Req.io_Unit = ssc->ss_unit; + req->ioip_s2.ios2_BufferManagement = ssc->ss_bufmgnt; + req->ioip_s2.ios2_Req.io_Message.mn_Node.ln_Type = NT_REPLYMSG; + req->ioip_if = ssc; + req->ioip_next = NULL; + req->ioip_s2.ios2_Req.io_Command = S2_ONEVENT; + req->ioip_s2.ios2_WireError = S2EVENT_OFFLINE | S2EVENT_CONNECT; + req->ioip_dispatch = sana_connect; + BeginIO((struct IORequest *)req); + ssc->ss_connectreq = req; + } + } } splx(s); } @@ -558,6 +577,9 @@ sana_unrun(struct sana_softc *ssc) } ssc->ss_reqs = next; + WaitIO((struct IORequest *)ssc->ss_connectreq); + DeleteIORequest((struct IORequest *)ssc->ss_connectreq); + ssc->ss_if.if_flags &= ~IFF_RUNNING; } @@ -995,6 +1017,32 @@ sana_online(struct sana_softc *ssc, struct IOIPReq *req) } /* + * sana_online(): process a CONNECT event + */ +static void +sana_connect(struct sana_softc *ssc, struct IOIPReq *req) +{ + LONG events = req->ioip_s2.ios2_WireError; + + if (req->ioip_s2.ios2_Req.io_Error == 0 && + events == S2EVENT_CONNECT) { + + /* New network -> new address */ + kill_dhclient((struct ifnet *) ssc); + run_dhclient((struct ifnet *) ssc); + } + + /* Send request back for next event */ + if (!(events & S2EVENT_OFFLINE)) { + req->ioip_s2.ios2_Req.io_Command = S2_ONEVENT; + req->ioip_s2.ios2_WireError = S2EVENT_OFFLINE | S2EVENT_CONNECT; + BeginIO((struct IORequest *)req); + } else { + ssc->ss_eventsent--; + } +} + +/* * sana_output: send a packet to Sana-II driver */ int @@ -1167,7 +1215,7 @@ free_written_packet(struct sana_softc *ssc, struct IOIPReq *req) /* * SANA-II-dependent part of QueryInterfaceTagList() */ -int sana_query(struct ifnet *ifn, struct TagItem *tag) +static int sana_query(struct ifnet *ifn, struct TagItem *tag) { struct sana_softc *ssc = (struct sana_softc *)ifn; diff --git a/workbench/network/stacks/AROSTCP/bsdsocket/net/if_sana.h b/workbench/network/stacks/AROSTCP/bsdsocket/net/if_sana.h index 427fb9b57c..f4c4427b50 100644 --- a/workbench/network/stacks/AROSTCP/bsdsocket/net/if_sana.h +++ b/workbench/network/stacks/AROSTCP/bsdsocket/net/if_sana.h @@ -2,7 +2,7 @@ * Copyright (C) 1993 AmiTCP/IP Group, * Helsinki University of Technology, Finland. * All rights reserved. - * Copyright (C) 2005 - 2007 The AROS Dev Team + * Copyright (C) 2005 - 2012 The AROS Dev Team * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as @@ -80,6 +80,7 @@ struct sana_softc { UWORD ss_cflags; /* configuration flags */ struct IOIPReq *ss_reqs; /* allocated requests */ struct MinList ss_freereq; /* free requests */ + struct IOIPReq *ss_connectreq; /* request for connect event */ #if INET struct { UWORD reqno; /* for listening ip packets */ diff --git a/workbench/network/stacks/AROSTCP/bsdsocket/version.h b/workbench/network/stacks/AROSTCP/bsdsocket/version.h index cbd2785138..74abe437a0 100644 --- a/workbench/network/stacks/AROSTCP/bsdsocket/version.h +++ b/workbench/network/stacks/AROSTCP/bsdsocket/version.h @@ -27,11 +27,11 @@ #define MIAMILIBNAME "miami.library" #define VERSION 4 -#define REVISION 55 -#define DATE "09.04.2012" -#define VERS SOCLIBNAME "4.55" +#define REVISION 56 +#define DATE "10.8.2012" +#define VERS SOCLIBNAME "4.56" #define VSTRING SOCLIBNAME STR(VERSION) "." STR(REVISION) "(" DATE ")" -#define VERSTAG "\0$VER:" SOCLIBNAME "4.55 (" DATE ")" +#define VERSTAG "\0$VER:" SOCLIBNAME "4.56 (" DATE ")" #define MIAMI_VERSION 13 #define MIAMI_REVISION 5 @@ -43,5 +43,5 @@ #define ROADSHOWSTR "" #endif -#define STACK_RELEASE "AROSTCP " ROADSHOWSTR "kernel v0.23 " CPU_TYPE " (" DATE ")" +#define STACK_RELEASE "AROSTCP " ROADSHOWSTR "kernel v0.24 " CPU_TYPE " (" DATE ")" -- 2.11.4.GIT