From ce0b86e9ddb0d244e360d7bf25c3126c9ba66004 Mon Sep 17 00:00:00 2001 From: Waldemar Kornewald Date: Mon, 5 Apr 2004 08:38:26 +0000 Subject: [PATCH] * IPCP: I think this fixed the default route bug. At least it does not crash anymore. * PPP stack: Fixed a bug that was introduced with the settings_tools change. * Modem: Renamed "Interface" to "Port" and made it use any device (i.e.: a complete path must be supplied) and made it assume that the device is a port (termios.h API). * Fixed a compilation warning. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@7167 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../kernel/network/ppp/ipcp/Protocol.cpp | 8 ++++- .../kernel/network/ppp/ipcp/Protocol.h | 2 ++ src/add-ons/kernel/network/ppp/modem/Modem.h | 6 ++-- .../kernel/network/ppp/modem/ModemDevice.cpp | 35 +++++++++++++++---- .../kernel/network/ppp/modem/ModemDevice.h | 6 ++-- src/add-ons/kernel/network/ppp/modem/TODO | 1 + .../ppp/shared/libkernelppp/KPPPInterface.cpp | 6 ++++ .../ppp/shared/libkernelppp/KPPPLCP.cpp | 4 +-- .../ppp/shared/libkernelppp/KPPPProtocol.cpp | 7 ++++ .../shared/libkernelppp/KPPPStateMachine.cpp | 6 ++-- .../libkernelppp/headers/KPPPProtocol.h | 2 ++ .../libkernelppp/headers/settings_tools.h | 3 +- .../shared/libkernelppp/settings_tools.cpp | 24 +++++++++---- .../shared/libppp/PPPInterfaceListener.cpp | 2 +- 14 files changed, 85 insertions(+), 27 deletions(-) diff --git a/src/add-ons/kernel/network/ppp/ipcp/Protocol.cpp b/src/add-ons/kernel/network/ppp/ipcp/Protocol.cpp index 0fd53dfa72..fe3a7ac5ea 100644 --- a/src/add-ons/kernel/network/ppp/ipcp/Protocol.cpp +++ b/src/add-ons/kernel/network/ppp/ipcp/Protocol.cpp @@ -43,6 +43,12 @@ IPCP::IPCP(KPPPInterface& interface, driver_parameter *settings) IPCP::~IPCP() +{ +} + + +void +IPCP::Uninit() { RemoveRoutes(); } @@ -458,7 +464,7 @@ IPCP::RemoveRoutes() if(rtrequest(RTM_DELETE, (struct sockaddr*) &netmask, (struct sockaddr*) &fGateway, (struct sockaddr*) &netmask, - RTF_GATEWAY, &fDefaultRoute) != B_OK) + RTF_UP | RTF_GATEWAY, &fDefaultRoute) != B_OK) dprintf("IPCP: RemoveRoutes(): could not remove default/subnet route!\n"); fDefaultRoute = NULL; diff --git a/src/add-ons/kernel/network/ppp/ipcp/Protocol.h b/src/add-ons/kernel/network/ppp/ipcp/Protocol.h index 27fec59ed5..678ce7ecf5 100644 --- a/src/add-ons/kernel/network/ppp/ipcp/Protocol.h +++ b/src/add-ons/kernel/network/ppp/ipcp/Protocol.h @@ -63,6 +63,8 @@ class IPCP : public KPPPProtocol { IPCP(KPPPInterface& interface, driver_parameter *settings); virtual ~IPCP(); + virtual void Uninit(); + ppp_state State() const { return fState; } diff --git a/src/add-ons/kernel/network/ppp/modem/Modem.h b/src/add-ons/kernel/network/ppp/modem/Modem.h index e9d4c0b8c7..1a637db22d 100644 --- a/src/add-ons/kernel/network/ppp/modem/Modem.h +++ b/src/add-ons/kernel/network/ppp/modem/Modem.h @@ -28,9 +28,9 @@ class ModemDevice; #define PACKET_OVERHEAD 8 #define MODEM_TIMEOUT 3000000 // 3 seconds -#define MODEM_INTERFACE_KEY "interface" -#define MODEM_INIT_KEY "init" -#define MODEM_DIAL_KEY "dial" +#define MODEM_PORT_KEY "Port" +#define MODEM_INIT_KEY "Init" +#define MODEM_DIAL_KEY "Dial" extern struct core_module_info *core; diff --git a/src/add-ons/kernel/network/ppp/modem/ModemDevice.cpp b/src/add-ons/kernel/network/ppp/modem/ModemDevice.cpp index 2a9973182d..a3380d8752 100644 --- a/src/add-ons/kernel/network/ppp/modem/ModemDevice.cpp +++ b/src/add-ons/kernel/network/ppp/modem/ModemDevice.cpp @@ -13,6 +13,8 @@ #include #include +#include + // for port settings // from libkernelppp #include @@ -181,7 +183,7 @@ worker_thread(void *data) ModemDevice::ModemDevice(KPPPInterface& interface, driver_parameter *settings) : KPPPDevice("Modem", 0, interface, settings), - fInterfaceName(NULL), + fPortName(NULL), fHandle(-1), fWorkerThread(-1), fOutputBytes(0), @@ -205,7 +207,7 @@ ModemDevice::ModemDevice(KPPPInterface& interface, driver_parameter *settings) SetMTU(MODEM_MTU); // MTU size does not contain PPP header - fInterfaceName = get_parameter_value(MODEM_INTERFACE_KEY, settings); + fPortName = get_parameter_value(MODEM_PORT_KEY, settings); fInitString = get_parameter_value(MODEM_INIT_KEY, settings); fDialString = get_parameter_value(MODEM_DIAL_KEY, settings); @@ -229,7 +231,8 @@ ModemDevice::InitCheck() const if(fState != INITIAL && Handle() == -1) return B_ERROR; - return InterfaceName() && KPPPDevice::InitCheck() == B_OK ? B_OK : B_ERROR; + return PortName() && InitString() && DialString() + && KPPPDevice::InitCheck() == B_OK ? B_OK : B_ERROR; } @@ -347,9 +350,29 @@ ModemDevice::OpenModem() if(Handle() >= 0) return; - char path[B_PATH_NAME_LENGTH]; - sprintf(path, "/dev/modem/%s", InterfaceName()); - fHandle = open(path, O_RDWR); + fHandle = open(PortName(), O_RDWR); + + // init port + struct termios options; + if(ioctl(fHandle, TCGETA, &options) != B_OK) { + dprintf("ModemDevice: Could not retrieve port options!\n"); + return; + } + + // adjust options + options.c_cflag &= ~CBAUD; + options.c_cflag |= B115200; + options.c_cflag |= (CLOCAL | CREAD); + options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); + options.c_oflag &= ~OPOST; + options.c_cc[VMIN] = 0; + options.c_cc[VTIME] = 10; + + // set new options + if(ioctl(fHandle, TCSETA, &options) != B_OK) { + dprintf("ModemDevice: Could not init port!\n"); + return; + } } diff --git a/src/add-ons/kernel/network/ppp/modem/ModemDevice.h b/src/add-ons/kernel/network/ppp/modem/ModemDevice.h index 2f456d118e..6518e554e2 100644 --- a/src/add-ons/kernel/network/ppp/modem/ModemDevice.h +++ b/src/add-ons/kernel/network/ppp/modem/ModemDevice.h @@ -30,8 +30,8 @@ class ModemDevice : public KPPPDevice { ModemDevice(KPPPInterface& interface, driver_parameter *settings); virtual ~ModemDevice(); - const char *InterfaceName() const - { return fInterfaceName; } + const char *PortName() const + { return fPortName; } int32 Handle() const { return fHandle; } // returns file handle for modem driver @@ -67,7 +67,7 @@ class ModemDevice : public KPPPDevice { virtual status_t Receive(struct mbuf *packet, uint16 protocolNumber = 0); private: - const char *fInterfaceName, *fInitString, *fDialString; + const char *fPortName, *fInitString, *fDialString; int32 fHandle; // file handle for modem driver diff --git a/src/add-ons/kernel/network/ppp/modem/TODO b/src/add-ons/kernel/network/ppp/modem/TODO index 5c4b50d46d..c9756d9915 100644 --- a/src/add-ons/kernel/network/ppp/modem/TODO +++ b/src/add-ons/kernel/network/ppp/modem/TODO @@ -3,3 +3,4 @@ - add support for server mode - add ACCM support (including ACCM option handler and encoding) - add chat login authentication (like terminal login) +- time out if the modem does not respond diff --git a/src/add-ons/kernel/network/ppp/shared/libkernelppp/KPPPInterface.cpp b/src/add-ons/kernel/network/ppp/shared/libkernelppp/KPPPInterface.cpp index 45a999b95f..c49668c88b 100644 --- a/src/add-ons/kernel/network/ppp/shared/libkernelppp/KPPPInterface.cpp +++ b/src/add-ons/kernel/network/ppp/shared/libkernelppp/KPPPInterface.cpp @@ -62,6 +62,7 @@ KPPPInterface::KPPPInterface(const char *name, ppp_interface_entry *entry, const driver_settings *profile, KPPPInterface *parent = NULL) : KPPPLayer(name, PPP_INTERFACE_LEVEL, 2), fID(ID), + fSettings(NULL), fIfnet(NULL), fUpThread(-1), fOpenEventThread(-1), @@ -220,6 +221,11 @@ KPPPInterface::~KPPPInterface() ++fDeleteCounter; + // tell protocols to uninit (remove routes, etc.) + KPPPProtocol *protocol = FirstProtocol(); + for(; protocol; protocol = protocol->NextProtocol()) + protocol->Uninit(); + // make sure we are not accessible by any thread before we continue UnregisterInterface(); diff --git a/src/add-ons/kernel/network/ppp/shared/libkernelppp/KPPPLCP.cpp b/src/add-ons/kernel/network/ppp/shared/libkernelppp/KPPPLCP.cpp index 4bd0e8c06c..fc2aa717bf 100644 --- a/src/add-ons/kernel/network/ppp/shared/libkernelppp/KPPPLCP.cpp +++ b/src/add-ons/kernel/network/ppp/shared/libkernelppp/KPPPLCP.cpp @@ -18,8 +18,8 @@ KPPPLCP::KPPPLCP(KPPPInterface& interface) - : KPPPProtocol("LCP", PPP_ESTABLISHMENT_PHASE, PPP_LCP_PROTOCOL, PPP_PROTOCOL_LEVEL, - AF_UNSPEC, 0, interface, NULL, PPP_ALWAYS_ALLOWED), + : KPPPProtocol("LCP", PPP_ESTABLISHMENT_PHASE, PPP_LCP_PROTOCOL, + PPP_PROTOCOL_LEVEL, AF_UNSPEC, 0, interface, NULL, PPP_ALWAYS_ALLOWED), fStateMachine(interface.StateMachine()), fTarget(NULL) { diff --git a/src/add-ons/kernel/network/ppp/shared/libkernelppp/KPPPProtocol.cpp b/src/add-ons/kernel/network/ppp/shared/libkernelppp/KPPPProtocol.cpp index 38802f3a89..c41fe3d37e 100644 --- a/src/add-ons/kernel/network/ppp/shared/libkernelppp/KPPPProtocol.cpp +++ b/src/add-ons/kernel/network/ppp/shared/libkernelppp/KPPPProtocol.cpp @@ -56,6 +56,13 @@ KPPPProtocol::~KPPPProtocol() } +void +KPPPProtocol::Uninit() +{ + // do nothing by default +} + + status_t KPPPProtocol::Control(uint32 op, void *data, size_t length) { diff --git a/src/add-ons/kernel/network/ppp/shared/libkernelppp/KPPPStateMachine.cpp b/src/add-ons/kernel/network/ppp/shared/libkernelppp/KPPPStateMachine.cpp index 2214cfd8dc..8a31b6207b 100644 --- a/src/add-ons/kernel/network/ppp/shared/libkernelppp/KPPPStateMachine.cpp +++ b/src/add-ons/kernel/network/ppp/shared/libkernelppp/KPPPStateMachine.cpp @@ -668,9 +668,6 @@ KPPPStateMachine::DownEvent() DownProtocols(); - fLocalAuthenticationStatus = PPP_NOT_AUTHENTICATED; - fPeerAuthenticationStatus = PPP_NOT_AUTHENTICATED; - // maybe we need to redial if(State() == PPP_STARTING_STATE) { bool needsRedial = false; @@ -715,6 +712,9 @@ KPPPStateMachine::DownEvent() if(!Interface().DoesDialOnDemand()) Interface().Delete(); } + + fLocalAuthenticationStatus = PPP_NOT_AUTHENTICATED; + fPeerAuthenticationStatus = PPP_NOT_AUTHENTICATED; } diff --git a/src/add-ons/kernel/network/ppp/shared/libkernelppp/headers/KPPPProtocol.h b/src/add-ons/kernel/network/ppp/shared/libkernelppp/headers/KPPPProtocol.h index cc1c1ce0b0..c5992109d2 100644 --- a/src/add-ons/kernel/network/ppp/shared/libkernelppp/headers/KPPPProtocol.h +++ b/src/add-ons/kernel/network/ppp/shared/libkernelppp/headers/KPPPProtocol.h @@ -27,6 +27,8 @@ class KPPPProtocol : public KPPPLayer { public: virtual ~KPPPProtocol(); + virtual void Uninit(); + KPPPInterface& Interface() const { return fInterface; } driver_parameter *Settings() const diff --git a/src/add-ons/kernel/network/ppp/shared/libkernelppp/headers/settings_tools.h b/src/add-ons/kernel/network/ppp/shared/libkernelppp/headers/settings_tools.h index 72bb44fb18..cff2a56417 100644 --- a/src/add-ons/kernel/network/ppp/shared/libkernelppp/headers/settings_tools.h +++ b/src/add-ons/kernel/network/ppp/shared/libkernelppp/headers/settings_tools.h @@ -14,6 +14,7 @@ // TODO: remove this as soon as we get the extended driver_settings API extern driver_settings *dup_driver_settings(const driver_settings *settings); extern void free_driver_settings(driver_settings *settings); +extern void free_driver_parameter(driver_parameter *parameter); extern void free_driver_parameter_fields(driver_parameter *parameter); extern driver_settings *new_driver_settings(); @@ -66,7 +67,7 @@ inline const char* get_parameter_value(const char *name, const driver_parameter *parameters) { - if(parameters) + if(!parameters) return NULL; return get_settings_value(name, (driver_settings*) ¶meters->parameter_count); diff --git a/src/add-ons/kernel/network/ppp/shared/libkernelppp/settings_tools.cpp b/src/add-ons/kernel/network/ppp/shared/libkernelppp/settings_tools.cpp index b11f880481..3bc6376c9d 100644 --- a/src/add-ons/kernel/network/ppp/shared/libkernelppp/settings_tools.cpp +++ b/src/add-ons/kernel/network/ppp/shared/libkernelppp/settings_tools.cpp @@ -32,14 +32,15 @@ dup_driver_settings(const driver_settings *dup) if(!dup) return NULL; // we got a NULL pointer, so return nothing - driver_settings *ret = (driver_settings*) malloc(sizeof(driver_settings)); + driver_settings *ret = new_driver_settings(); ret->parameter_count = dup->parameter_count; - if(ret->parameter_count > 0) + if(ret->parameter_count > 0) { ret->parameters = (driver_parameter*) malloc(ret->parameter_count * sizeof(driver_parameter)); - else + memset(ret->parameters, 0, ret->parameter_count * sizeof(driver_parameter)); + } else ret->parameters = NULL; for(int32 index = 0; index < ret->parameter_count; index++) @@ -63,6 +64,14 @@ free_driver_settings(driver_settings *settings) } +void +free_driver_parameter(driver_parameter *parameter) +{ + free_driver_parameter_fields(parameter); + free(parameter); +} + + void free_driver_parameter_fields(driver_parameter *parameter) { @@ -126,10 +135,11 @@ copy_driver_parameter(const driver_parameter *from, driver_parameter *to) to->parameter_count = from->parameter_count; - if(to->parameter_count > 0) + if(to->parameter_count > 0) { to->parameters = (driver_parameter*) malloc(to->parameter_count * sizeof(driver_parameter)); - else + memset(to->parameters, 0, to->parameter_count * sizeof(driver_parameter)); + } else to->parameters = NULL; for(int32 index = 0; index < to->parameter_count; index++) @@ -165,7 +175,7 @@ add_driver_parameter_value(const char *value, driver_parameter *to) int32 oldCount = to->value_count; char **old = to->values; - to->values = (char**) malloc(to->value_count + 1 * sizeof(char*)); + to->values = (char**) malloc((oldCount + 1) * sizeof(char*)); if(!to->values) { to->values = old; @@ -190,7 +200,7 @@ add_driver_parameter(driver_parameter *add, driver_settings *to) driver_parameter *old = to->parameters; to->parameters = - (driver_parameter*) malloc(to->parameter_count + 1 * sizeof(driver_parameter)); + (driver_parameter*) malloc((oldCount + 1) * sizeof(driver_parameter)); if(!to->parameters) { to->parameters = old; diff --git a/src/add-ons/kernel/network/ppp/shared/libppp/PPPInterfaceListener.cpp b/src/add-ons/kernel/network/ppp/shared/libppp/PPPInterfaceListener.cpp index 5e0b105c10..0eb95a23b6 100644 --- a/src/add-ons/kernel/network/ppp/shared/libppp/PPPInterfaceListener.cpp +++ b/src/add-ons/kernel/network/ppp/shared/libppp/PPPInterfaceListener.cpp @@ -17,7 +17,7 @@ static const uint32 kReportFlags = PPP_WAIT_FOR_REPLY | PPP_NO_REPLY_TIMEOUT | PPP_ALLOW_ANY_REPLY_THREAD; -static const uint32 kCodeQuitReportThread = 'QUIT'; +static const int32 kCodeQuitReportThread = 'QUIT'; class PPPInterfaceListenerThread {