* 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()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
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; }
|
||||
|
||||
|
||||
@@ -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*) ¶meters->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 {
|
||||
|
||||
Reference in New Issue
Block a user