* 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:
@@ -43,6 +43,12 @@ IPCP::IPCP(KPPPInterface& interface, driver_parameter *settings)
|
|||||||
|
|
||||||
|
|
||||||
IPCP::~IPCP()
|
IPCP::~IPCP()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
IPCP::Uninit()
|
||||||
{
|
{
|
||||||
RemoveRoutes();
|
RemoveRoutes();
|
||||||
}
|
}
|
||||||
@@ -458,7 +464,7 @@ IPCP::RemoveRoutes()
|
|||||||
|
|
||||||
if(rtrequest(RTM_DELETE, (struct sockaddr*) &netmask,
|
if(rtrequest(RTM_DELETE, (struct sockaddr*) &netmask,
|
||||||
(struct sockaddr*) &fGateway, (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");
|
dprintf("IPCP: RemoveRoutes(): could not remove default/subnet route!\n");
|
||||||
|
|
||||||
fDefaultRoute = NULL;
|
fDefaultRoute = NULL;
|
||||||
|
|||||||
@@ -63,6 +63,8 @@ class IPCP : public KPPPProtocol {
|
|||||||
IPCP(KPPPInterface& interface, driver_parameter *settings);
|
IPCP(KPPPInterface& interface, driver_parameter *settings);
|
||||||
virtual ~IPCP();
|
virtual ~IPCP();
|
||||||
|
|
||||||
|
virtual void Uninit();
|
||||||
|
|
||||||
ppp_state State() const
|
ppp_state State() const
|
||||||
{ return fState; }
|
{ return fState; }
|
||||||
|
|
||||||
|
|||||||
@@ -28,9 +28,9 @@ class ModemDevice;
|
|||||||
#define PACKET_OVERHEAD 8
|
#define PACKET_OVERHEAD 8
|
||||||
#define MODEM_TIMEOUT 3000000
|
#define MODEM_TIMEOUT 3000000
|
||||||
// 3 seconds
|
// 3 seconds
|
||||||
#define MODEM_INTERFACE_KEY "interface"
|
#define MODEM_PORT_KEY "Port"
|
||||||
#define MODEM_INIT_KEY "init"
|
#define MODEM_INIT_KEY "Init"
|
||||||
#define MODEM_DIAL_KEY "dial"
|
#define MODEM_DIAL_KEY "Dial"
|
||||||
|
|
||||||
extern struct core_module_info *core;
|
extern struct core_module_info *core;
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,8 @@
|
|||||||
|
|
||||||
#include <core_funcs.h>
|
#include <core_funcs.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <termios.h>
|
||||||
|
// for port settings
|
||||||
|
|
||||||
// from libkernelppp
|
// from libkernelppp
|
||||||
#include <settings_tools.h>
|
#include <settings_tools.h>
|
||||||
@@ -181,7 +183,7 @@ worker_thread(void *data)
|
|||||||
|
|
||||||
ModemDevice::ModemDevice(KPPPInterface& interface, driver_parameter *settings)
|
ModemDevice::ModemDevice(KPPPInterface& interface, driver_parameter *settings)
|
||||||
: KPPPDevice("Modem", 0, interface, settings),
|
: KPPPDevice("Modem", 0, interface, settings),
|
||||||
fInterfaceName(NULL),
|
fPortName(NULL),
|
||||||
fHandle(-1),
|
fHandle(-1),
|
||||||
fWorkerThread(-1),
|
fWorkerThread(-1),
|
||||||
fOutputBytes(0),
|
fOutputBytes(0),
|
||||||
@@ -205,7 +207,7 @@ ModemDevice::ModemDevice(KPPPInterface& interface, driver_parameter *settings)
|
|||||||
SetMTU(MODEM_MTU);
|
SetMTU(MODEM_MTU);
|
||||||
// MTU size does not contain PPP header
|
// 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);
|
fInitString = get_parameter_value(MODEM_INIT_KEY, settings);
|
||||||
fDialString = get_parameter_value(MODEM_DIAL_KEY, settings);
|
fDialString = get_parameter_value(MODEM_DIAL_KEY, settings);
|
||||||
|
|
||||||
@@ -229,7 +231,8 @@ ModemDevice::InitCheck() const
|
|||||||
if(fState != INITIAL && Handle() == -1)
|
if(fState != INITIAL && Handle() == -1)
|
||||||
return B_ERROR;
|
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)
|
if(Handle() >= 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
char path[B_PATH_NAME_LENGTH];
|
fHandle = open(PortName(), O_RDWR);
|
||||||
sprintf(path, "/dev/modem/%s", InterfaceName());
|
|
||||||
fHandle = open(path, 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);
|
ModemDevice(KPPPInterface& interface, driver_parameter *settings);
|
||||||
virtual ~ModemDevice();
|
virtual ~ModemDevice();
|
||||||
|
|
||||||
const char *InterfaceName() const
|
const char *PortName() const
|
||||||
{ return fInterfaceName; }
|
{ return fPortName; }
|
||||||
int32 Handle() const
|
int32 Handle() const
|
||||||
{ return fHandle; }
|
{ return fHandle; }
|
||||||
// returns file handle for modem driver
|
// returns file handle for modem driver
|
||||||
@@ -67,7 +67,7 @@ class ModemDevice : public KPPPDevice {
|
|||||||
virtual status_t Receive(struct mbuf *packet, uint16 protocolNumber = 0);
|
virtual status_t Receive(struct mbuf *packet, uint16 protocolNumber = 0);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const char *fInterfaceName, *fInitString, *fDialString;
|
const char *fPortName, *fInitString, *fDialString;
|
||||||
int32 fHandle;
|
int32 fHandle;
|
||||||
// file handle for modem driver
|
// file handle for modem driver
|
||||||
|
|
||||||
|
|||||||
@@ -3,3 +3,4 @@
|
|||||||
- add support for server mode
|
- add support for server mode
|
||||||
- add ACCM support (including ACCM option handler and encoding)
|
- add ACCM support (including ACCM option handler and encoding)
|
||||||
- add chat login authentication (like terminal login)
|
- 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)
|
const driver_settings *profile, KPPPInterface *parent = NULL)
|
||||||
: KPPPLayer(name, PPP_INTERFACE_LEVEL, 2),
|
: KPPPLayer(name, PPP_INTERFACE_LEVEL, 2),
|
||||||
fID(ID),
|
fID(ID),
|
||||||
|
fSettings(NULL),
|
||||||
fIfnet(NULL),
|
fIfnet(NULL),
|
||||||
fUpThread(-1),
|
fUpThread(-1),
|
||||||
fOpenEventThread(-1),
|
fOpenEventThread(-1),
|
||||||
@@ -220,6 +221,11 @@ KPPPInterface::~KPPPInterface()
|
|||||||
|
|
||||||
++fDeleteCounter;
|
++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
|
// make sure we are not accessible by any thread before we continue
|
||||||
UnregisterInterface();
|
UnregisterInterface();
|
||||||
|
|
||||||
|
|||||||
@@ -18,8 +18,8 @@
|
|||||||
|
|
||||||
|
|
||||||
KPPPLCP::KPPPLCP(KPPPInterface& interface)
|
KPPPLCP::KPPPLCP(KPPPInterface& interface)
|
||||||
: KPPPProtocol("LCP", PPP_ESTABLISHMENT_PHASE, PPP_LCP_PROTOCOL, PPP_PROTOCOL_LEVEL,
|
: KPPPProtocol("LCP", PPP_ESTABLISHMENT_PHASE, PPP_LCP_PROTOCOL,
|
||||||
AF_UNSPEC, 0, interface, NULL, PPP_ALWAYS_ALLOWED),
|
PPP_PROTOCOL_LEVEL, AF_UNSPEC, 0, interface, NULL, PPP_ALWAYS_ALLOWED),
|
||||||
fStateMachine(interface.StateMachine()),
|
fStateMachine(interface.StateMachine()),
|
||||||
fTarget(NULL)
|
fTarget(NULL)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -56,6 +56,13 @@ KPPPProtocol::~KPPPProtocol()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
KPPPProtocol::Uninit()
|
||||||
|
{
|
||||||
|
// do nothing by default
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
KPPPProtocol::Control(uint32 op, void *data, size_t length)
|
KPPPProtocol::Control(uint32 op, void *data, size_t length)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -668,9 +668,6 @@ KPPPStateMachine::DownEvent()
|
|||||||
|
|
||||||
DownProtocols();
|
DownProtocols();
|
||||||
|
|
||||||
fLocalAuthenticationStatus = PPP_NOT_AUTHENTICATED;
|
|
||||||
fPeerAuthenticationStatus = PPP_NOT_AUTHENTICATED;
|
|
||||||
|
|
||||||
// maybe we need to redial
|
// maybe we need to redial
|
||||||
if(State() == PPP_STARTING_STATE) {
|
if(State() == PPP_STARTING_STATE) {
|
||||||
bool needsRedial = false;
|
bool needsRedial = false;
|
||||||
@@ -715,6 +712,9 @@ KPPPStateMachine::DownEvent()
|
|||||||
if(!Interface().DoesDialOnDemand())
|
if(!Interface().DoesDialOnDemand())
|
||||||
Interface().Delete();
|
Interface().Delete();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fLocalAuthenticationStatus = PPP_NOT_AUTHENTICATED;
|
||||||
|
fPeerAuthenticationStatus = PPP_NOT_AUTHENTICATED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -27,6 +27,8 @@ class KPPPProtocol : public KPPPLayer {
|
|||||||
public:
|
public:
|
||||||
virtual ~KPPPProtocol();
|
virtual ~KPPPProtocol();
|
||||||
|
|
||||||
|
virtual void Uninit();
|
||||||
|
|
||||||
KPPPInterface& Interface() const
|
KPPPInterface& Interface() const
|
||||||
{ return fInterface; }
|
{ return fInterface; }
|
||||||
driver_parameter *Settings() const
|
driver_parameter *Settings() const
|
||||||
|
|||||||
@@ -14,6 +14,7 @@
|
|||||||
// TODO: remove this as soon as we get the extended driver_settings API
|
// TODO: remove this as soon as we get the extended driver_settings API
|
||||||
extern driver_settings *dup_driver_settings(const driver_settings *settings);
|
extern driver_settings *dup_driver_settings(const driver_settings *settings);
|
||||||
extern void free_driver_settings(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 void free_driver_parameter_fields(driver_parameter *parameter);
|
||||||
|
|
||||||
extern driver_settings *new_driver_settings();
|
extern driver_settings *new_driver_settings();
|
||||||
@@ -66,7 +67,7 @@ inline
|
|||||||
const char*
|
const char*
|
||||||
get_parameter_value(const char *name, const driver_parameter *parameters)
|
get_parameter_value(const char *name, const driver_parameter *parameters)
|
||||||
{
|
{
|
||||||
if(parameters)
|
if(!parameters)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
return get_settings_value(name, (driver_settings*) ¶meters->parameter_count);
|
return get_settings_value(name, (driver_settings*) ¶meters->parameter_count);
|
||||||
|
|||||||
@@ -32,14 +32,15 @@ dup_driver_settings(const driver_settings *dup)
|
|||||||
if(!dup)
|
if(!dup)
|
||||||
return NULL; // we got a NULL pointer, so return nothing
|
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;
|
ret->parameter_count = dup->parameter_count;
|
||||||
|
|
||||||
if(ret->parameter_count > 0)
|
if(ret->parameter_count > 0) {
|
||||||
ret->parameters = (driver_parameter*)
|
ret->parameters = (driver_parameter*)
|
||||||
malloc(ret->parameter_count * sizeof(driver_parameter));
|
malloc(ret->parameter_count * sizeof(driver_parameter));
|
||||||
else
|
memset(ret->parameters, 0, ret->parameter_count * sizeof(driver_parameter));
|
||||||
|
} else
|
||||||
ret->parameters = NULL;
|
ret->parameters = NULL;
|
||||||
|
|
||||||
for(int32 index = 0; index < ret->parameter_count; index++)
|
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
|
void
|
||||||
free_driver_parameter_fields(driver_parameter *parameter)
|
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;
|
to->parameter_count = from->parameter_count;
|
||||||
|
|
||||||
if(to->parameter_count > 0)
|
if(to->parameter_count > 0) {
|
||||||
to->parameters =
|
to->parameters =
|
||||||
(driver_parameter*) malloc(to->parameter_count * sizeof(driver_parameter));
|
(driver_parameter*) malloc(to->parameter_count * sizeof(driver_parameter));
|
||||||
else
|
memset(to->parameters, 0, to->parameter_count * sizeof(driver_parameter));
|
||||||
|
} else
|
||||||
to->parameters = NULL;
|
to->parameters = NULL;
|
||||||
|
|
||||||
for(int32 index = 0; index < to->parameter_count; index++)
|
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;
|
int32 oldCount = to->value_count;
|
||||||
char **old = to->values;
|
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) {
|
if(!to->values) {
|
||||||
to->values = old;
|
to->values = old;
|
||||||
@@ -190,7 +200,7 @@ add_driver_parameter(driver_parameter *add, driver_settings *to)
|
|||||||
driver_parameter *old = to->parameters;
|
driver_parameter *old = to->parameters;
|
||||||
|
|
||||||
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) {
|
if(!to->parameters) {
|
||||||
to->parameters = old;
|
to->parameters = old;
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
static const uint32 kReportFlags = PPP_WAIT_FOR_REPLY | PPP_NO_REPLY_TIMEOUT
|
static const uint32 kReportFlags = PPP_WAIT_FOR_REPLY | PPP_NO_REPLY_TIMEOUT
|
||||||
| PPP_ALLOW_ANY_REPLY_THREAD;
|
| PPP_ALLOW_ANY_REPLY_THREAD;
|
||||||
|
|
||||||
static const uint32 kCodeQuitReportThread = 'QUIT';
|
static const int32 kCodeQuitReportThread = 'QUIT';
|
||||||
|
|
||||||
|
|
||||||
class PPPInterfaceListenerThread {
|
class PPPInterfaceListenerThread {
|
||||||
|
|||||||
Reference in New Issue
Block a user