* 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
This commit is contained in:
Waldemar Kornewald
2004-04-05 08:38:26 +00:00
parent 9fee39fd65
commit ce0b86e9dd
14 changed files with 85 additions and 27 deletions
@@ -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;
@@ -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; }
+3 -3
View File
@@ -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;
@@ -13,6 +13,8 @@
#include <core_funcs.h>
#include <unistd.h>
#include <termios.h>
// for port settings
// from libkernelppp
#include <settings_tools.h>
@@ -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;
}
}
@@ -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
@@ -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
@@ -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();
@@ -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)
{
@@ -56,6 +56,13 @@ KPPPProtocol::~KPPPProtocol()
}
void
KPPPProtocol::Uninit()
{
// do nothing by default
}
status_t
KPPPProtocol::Control(uint32 op, void *data, size_t length)
{
@@ -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;
}
@@ -27,6 +27,8 @@ class KPPPProtocol : public KPPPLayer {
public:
virtual ~KPPPProtocol();
virtual void Uninit();
KPPPInterface& Interface() const
{ return fInterface; }
driver_parameter *Settings() const
@@ -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*) &parameters->parameter_count);
@@ -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;
@@ -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 {