The beginnings of libppp.a. This is a userland library to talk to the PPP stack. It hides the ioctl() stuff from the user.
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@5120 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
e745242193
commit
4fbbad3009
@ -1,3 +1,4 @@
|
|||||||
SubDir OBOS_TOP src add-ons kernel network ppp shared ;
|
SubDir OBOS_TOP src add-ons kernel network ppp shared ;
|
||||||
|
|
||||||
SubInclude OBOS_TOP src add-ons kernel network ppp shared libkernelppp ;
|
SubInclude OBOS_TOP src add-ons kernel network ppp shared libkernelppp ;
|
||||||
|
SubInclude OBOS_TOP src add-ons kernel network ppp shared libppp ;
|
||||||
|
16
src/add-ons/kernel/network/ppp/shared/libppp/Jamfile
Normal file
16
src/add-ons/kernel/network/ppp/shared/libppp/Jamfile
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
SubDir OBOS_TOP src add-ons kernel network ppp shared libppp ;
|
||||||
|
|
||||||
|
SEARCH_SOURCE += [ FDirName $(OBOS_TOP) src add-ons kernel network ppp shared libkernelppp ] ;
|
||||||
|
|
||||||
|
UsePrivateHeaders net ;
|
||||||
|
UseHeaders [ FDirName $(OBOS_TOP) src add-ons kernel network ppp shared libppp headers ] ;
|
||||||
|
UseHeaders [ FDirName $(OBOS_TOP) src add-ons kernel network ppp shared libkernelppp headers ] ;
|
||||||
|
UseHeaders [ FDirName $(OBOS_TOP) src add-ons kernel network ppp shared libkernelppp ] ;
|
||||||
|
|
||||||
|
|
||||||
|
StaticLibrary ppp :
|
||||||
|
settings_tools.cpp
|
||||||
|
|
||||||
|
PPPInterface.cpp
|
||||||
|
PPPManager.cpp
|
||||||
|
;
|
149
src/add-ons/kernel/network/ppp/shared/libppp/PPPInterface.cpp
Normal file
149
src/add-ons/kernel/network/ppp/shared/libppp/PPPInterface.cpp
Normal file
@ -0,0 +1,149 @@
|
|||||||
|
//----------------------------------------------------------------------
|
||||||
|
// This software is part of the OpenBeOS distribution and is covered
|
||||||
|
// by the OpenBeOS license.
|
||||||
|
//
|
||||||
|
// Copyright (c) 2003 Waldemar Kornewald, Waldemar.Kornewald@web.de
|
||||||
|
//---------------------------------------------------------------------
|
||||||
|
|
||||||
|
#include "PPPInterface.h"
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <net_stack_driver.h>
|
||||||
|
|
||||||
|
|
||||||
|
PPPInterface::PPPInterface(interface_id ID = PPP_UNDEFINED_INTERFACE_ID)
|
||||||
|
{
|
||||||
|
fFD = open("/dev/net/stack", O_RDWR);
|
||||||
|
|
||||||
|
SetTo(ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
PPPInterface::PPPInterface(const PPPInterface& copy)
|
||||||
|
{
|
||||||
|
fFD = open("/dev/net/stack", O_RDWR);
|
||||||
|
|
||||||
|
SetTo(copy.ID());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
PPPInterface::~PPPInterface()
|
||||||
|
{
|
||||||
|
if(fFD >= 0)
|
||||||
|
close(fFD);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
PPPInterface::InitCheck() const
|
||||||
|
{
|
||||||
|
if(fFD < 0 || fID == PPP_UNDEFINED_INTERFACE_ID)
|
||||||
|
return B_ERROR;
|
||||||
|
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
PPPInterface::SetTo(interface_id ID)
|
||||||
|
{
|
||||||
|
if(fFD < 0)
|
||||||
|
return B_ERROR;
|
||||||
|
|
||||||
|
fID = ID;
|
||||||
|
|
||||||
|
return Control(PPPC_GET_INTERFACE_INFO, &fInfo, sizeof(fInfo));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
PPPInterface::Control(uint32 op, void *data, size_t length) const
|
||||||
|
{
|
||||||
|
if(InitCheck() != B_OK)
|
||||||
|
return B_ERROR;
|
||||||
|
|
||||||
|
ppp_control_info control;
|
||||||
|
control_net_module_args args;
|
||||||
|
|
||||||
|
args.name = PPP_INTERFACE_MODULE_NAME;
|
||||||
|
args.op = PPPC_CONTROL_INTERFACE;
|
||||||
|
args.data = &control;
|
||||||
|
args.length = sizeof(control);
|
||||||
|
|
||||||
|
control.index = ID();
|
||||||
|
control.op = op;
|
||||||
|
control.data = data;
|
||||||
|
control.length = length;
|
||||||
|
|
||||||
|
return ioctl(fFD, NET_STACK_CONTROL_NET_MODULE, &args);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
PPPInterface::GetInterfaceInfo(ppp_interface_info *info) const
|
||||||
|
{
|
||||||
|
if(InitCheck() != B_OK || !info)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
memcpy(info, &fInfo, sizeof(fInfo));
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
PPPInterface::Up() const
|
||||||
|
{
|
||||||
|
if(InitCheck() != B_OK)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
int32 id = ID();
|
||||||
|
control_net_module_args args;
|
||||||
|
args.name = PPP_INTERFACE_MODULE_NAME;
|
||||||
|
args.op = PPPC_BRING_INTERFACE_UP;
|
||||||
|
args.data = &id;
|
||||||
|
args.length = sizeof(id);
|
||||||
|
|
||||||
|
return ioctl(fFD, NET_STACK_CONTROL_NET_MODULE, &args) == B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
PPPInterface::Down() const
|
||||||
|
{
|
||||||
|
if(InitCheck() != B_OK)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
int32 id = ID();
|
||||||
|
control_net_module_args args;
|
||||||
|
args.name = PPP_INTERFACE_MODULE_NAME;
|
||||||
|
args.op = PPPC_BRING_INTERFACE_DOWN;
|
||||||
|
args.data = &id;
|
||||||
|
args.length = sizeof(id);
|
||||||
|
|
||||||
|
return ioctl(fFD, NET_STACK_CONTROL_NET_MODULE, &args) == B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
PPPInterface::EnableReports(ppp_report_type type, thread_id thread,
|
||||||
|
int32 flags = PPP_NO_FLAGS) const
|
||||||
|
{
|
||||||
|
ppp_report_request request;
|
||||||
|
request.type = type;
|
||||||
|
request.thread = thread;
|
||||||
|
request.flags = flags;
|
||||||
|
|
||||||
|
return Control(PPPC_ENABLE_REPORTS, &request, sizeof(request)) == B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
PPPInterface::DisableReports(ppp_report_type type, thread_id thread) const
|
||||||
|
{
|
||||||
|
ppp_report_request request;
|
||||||
|
request.type = type;
|
||||||
|
request.thread = thread;
|
||||||
|
|
||||||
|
return Control(PPPC_DISABLE_REPORTS, &request, sizeof(request)) == B_OK;
|
||||||
|
}
|
210
src/add-ons/kernel/network/ppp/shared/libppp/PPPManager.cpp
Normal file
210
src/add-ons/kernel/network/ppp/shared/libppp/PPPManager.cpp
Normal file
@ -0,0 +1,210 @@
|
|||||||
|
//----------------------------------------------------------------------
|
||||||
|
// This software is part of the OpenBeOS distribution and is covered
|
||||||
|
// by the OpenBeOS license.
|
||||||
|
//
|
||||||
|
// Copyright (c) 2003 Waldemar Kornewald, Waldemar.Kornewald@web.de
|
||||||
|
//---------------------------------------------------------------------
|
||||||
|
|
||||||
|
#include "PPPManager.h"
|
||||||
|
#include "PPPInterface.h"
|
||||||
|
|
||||||
|
#include <net_stack_driver.h>
|
||||||
|
#include <settings_tools.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
|
||||||
|
PPPManager::PPPManager()
|
||||||
|
{
|
||||||
|
fFD = open("/dev/net/stack", O_RDWR);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
PPPManager::~PPPManager()
|
||||||
|
{
|
||||||
|
if(fFD >= 0)
|
||||||
|
close(fFD);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
PPPManager::InitCheck() const
|
||||||
|
{
|
||||||
|
if(fFD < 0)
|
||||||
|
return B_ERROR;
|
||||||
|
else
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
PPPManager::Control(uint32 op, void *data, size_t length) const
|
||||||
|
{
|
||||||
|
if(InitCheck() != B_OK)
|
||||||
|
return B_ERROR;
|
||||||
|
|
||||||
|
control_net_module_args args;
|
||||||
|
args.name = PPP_INTERFACE_MODULE_NAME;
|
||||||
|
args.op = op;
|
||||||
|
args.data = data;
|
||||||
|
args.length = length;
|
||||||
|
|
||||||
|
return ioctl(fFD, NET_STACK_CONTROL_NET_MODULE, &args);
|
||||||
|
}
|
||||||
|
|
||||||
|
interface_id
|
||||||
|
PPPManager::CreateInterface(const driver_settings *settings) const
|
||||||
|
{
|
||||||
|
ppp_interface_settings_info info;
|
||||||
|
info.settings = settings;
|
||||||
|
|
||||||
|
if(Control(PPPC_CREATE_INTERFACE, &info, sizeof(info)) != B_OK)
|
||||||
|
return PPP_UNDEFINED_INTERFACE_ID;
|
||||||
|
else
|
||||||
|
return info.interface;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
PPPManager::DeleteInterface(interface_id ID) const
|
||||||
|
{
|
||||||
|
if(Control(PPPC_DELETE_INTERFACE, &ID, sizeof(ID)) != B_OK)
|
||||||
|
return false;
|
||||||
|
else
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
interface_id*
|
||||||
|
PPPManager::Interfaces(int32 *count,
|
||||||
|
ppp_interface_filter filter = PPP_REGISTERED_INTERFACES) const
|
||||||
|
{
|
||||||
|
int32 requestCount;
|
||||||
|
interface_id *interfaces;
|
||||||
|
|
||||||
|
// loop until we get all interfaces
|
||||||
|
while(true) {
|
||||||
|
requestCount = *count = CountInterfaces(filter);
|
||||||
|
if(*count == -1)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
requestCount += 10;
|
||||||
|
// request some more interfaces in case some are added in the mean time
|
||||||
|
interfaces = new interface_id[requestCount];
|
||||||
|
*count = GetInterfaces(interfaces, requestCount, filter);
|
||||||
|
if(*count == -1) {
|
||||||
|
delete interfaces;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(*count < requestCount)
|
||||||
|
break;
|
||||||
|
|
||||||
|
delete interfaces;
|
||||||
|
}
|
||||||
|
|
||||||
|
return interfaces;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int32
|
||||||
|
PPPManager::GetInterfaces(interface_id *interfaces, int32 count,
|
||||||
|
ppp_interface_filter filter = PPP_REGISTERED_INTERFACES) const
|
||||||
|
{
|
||||||
|
ppp_get_interfaces_info info;
|
||||||
|
info.interfaces = interfaces;
|
||||||
|
info.count = count;
|
||||||
|
info.filter = filter;
|
||||||
|
|
||||||
|
if(Control(PPPC_GET_INTERFACES, &info, sizeof(info)) != B_OK)
|
||||||
|
return -1;
|
||||||
|
else
|
||||||
|
return info.resultCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
interface_id
|
||||||
|
PPPManager::InterfaceWithSettings(const driver_settings *settings) const
|
||||||
|
{
|
||||||
|
int32 count;
|
||||||
|
interface_id *interfaces = Interfaces(&count, PPP_ALL_INTERFACES);
|
||||||
|
|
||||||
|
if(!interfaces)
|
||||||
|
return PPP_UNDEFINED_INTERFACE_ID;
|
||||||
|
|
||||||
|
interface_id id = PPP_UNDEFINED_INTERFACE_ID;
|
||||||
|
PPPInterface interface;
|
||||||
|
ppp_interface_info info;
|
||||||
|
|
||||||
|
for(int32 index = 0; index < count; index++) {
|
||||||
|
interface.SetTo(interfaces[index]);
|
||||||
|
if(interface.InitCheck() == B_OK && interface.GetInterfaceInfo(&info)
|
||||||
|
&& equal_driver_settings(settings, info.settings)) {
|
||||||
|
id = interface.ID();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
delete interfaces;
|
||||||
|
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
interface_id
|
||||||
|
PPPManager::InterfaceWithUnit(int32 if_unit)
|
||||||
|
{
|
||||||
|
int32 count;
|
||||||
|
interface_id *interfaces = Interfaces(&count, PPP_REGISTERED_INTERFACES);
|
||||||
|
|
||||||
|
if(!interfaces)
|
||||||
|
return PPP_UNDEFINED_INTERFACE_ID;
|
||||||
|
|
||||||
|
interface_id id = PPP_UNDEFINED_INTERFACE_ID;
|
||||||
|
PPPInterface interface;
|
||||||
|
ppp_interface_info info;
|
||||||
|
|
||||||
|
for(int32 index = 0; index < count; index++) {
|
||||||
|
interface.SetTo(interfaces[index]);
|
||||||
|
if(interface.InitCheck() == B_OK && interface.GetInterfaceInfo(&info)
|
||||||
|
&& info.if_unit == if_unit) {
|
||||||
|
id = interface.ID();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
delete interfaces;
|
||||||
|
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int32
|
||||||
|
PPPManager::CountInterfaces(ppp_interface_filter filter =
|
||||||
|
PPP_REGISTERED_INTERFACES) const
|
||||||
|
{
|
||||||
|
return Control(PPPC_COUNT_INTERFACES, &filter, sizeof(filter));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
PPPManager::EnableReports(ppp_report_type type, thread_id thread,
|
||||||
|
int32 flags = PPP_NO_FLAGS) const
|
||||||
|
{
|
||||||
|
ppp_report_request request;
|
||||||
|
request.type = type;
|
||||||
|
request.thread = thread;
|
||||||
|
request.flags = flags;
|
||||||
|
|
||||||
|
return Control(PPPC_ENABLE_REPORTS, &request, sizeof(request)) == B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
PPPManager::DisableReports(ppp_report_type type, thread_id thread) const
|
||||||
|
{
|
||||||
|
ppp_report_request request;
|
||||||
|
request.type = type;
|
||||||
|
request.thread = thread;
|
||||||
|
|
||||||
|
return Control(PPPC_DISABLE_REPORTS, &request, sizeof(request)) == B_OK;
|
||||||
|
}
|
@ -0,0 +1,50 @@
|
|||||||
|
//----------------------------------------------------------------------
|
||||||
|
// This software is part of the OpenBeOS distribution and is covered
|
||||||
|
// by the OpenBeOS license.
|
||||||
|
//
|
||||||
|
// Copyright (c) 2003 Waldemar Kornewald, Waldemar.Kornewald@web.de
|
||||||
|
//---------------------------------------------------------------------
|
||||||
|
|
||||||
|
#ifndef _PPP_INTERFACE__H
|
||||||
|
#define _PPP_INTERFACE__H
|
||||||
|
|
||||||
|
#include <KPPPManager.h>
|
||||||
|
|
||||||
|
|
||||||
|
class PPPInterface {
|
||||||
|
public:
|
||||||
|
PPPInterface(interface_id ID = PPP_UNDEFINED_INTERFACE_ID);
|
||||||
|
PPPInterface(const PPPInterface& copy);
|
||||||
|
~PPPInterface();
|
||||||
|
|
||||||
|
status_t InitCheck() const;
|
||||||
|
|
||||||
|
status_t SetTo(interface_id ID);
|
||||||
|
interface_id ID() const
|
||||||
|
{ return fID; }
|
||||||
|
|
||||||
|
status_t Control(uint32 op, void *data, size_t length) const;
|
||||||
|
|
||||||
|
bool GetInterfaceInfo(ppp_interface_info *info) const;
|
||||||
|
|
||||||
|
bool Up() const;
|
||||||
|
bool Down() const;
|
||||||
|
|
||||||
|
bool EnableReports(ppp_report_type type, thread_id thread,
|
||||||
|
int32 flags = PPP_NO_FLAGS) const;
|
||||||
|
bool DisableReports(ppp_report_type type, thread_id thread) const;
|
||||||
|
|
||||||
|
PPPInterface& operator= (const PPPInterface& copy)
|
||||||
|
{ SetTo(copy.ID()); return *this; }
|
||||||
|
PPPInterface& operator= (interface_id ID)
|
||||||
|
{ SetTo(ID); return *this; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
interface_id fID;
|
||||||
|
|
||||||
|
int fFD;
|
||||||
|
ppp_interface_info fInfo;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,51 @@
|
|||||||
|
//----------------------------------------------------------------------
|
||||||
|
// This software is part of the OpenBeOS distribution and is covered
|
||||||
|
// by the OpenBeOS license.
|
||||||
|
//
|
||||||
|
// Copyright (c) 2003 Waldemar Kornewald, Waldemar.Kornewald@web.de
|
||||||
|
//---------------------------------------------------------------------
|
||||||
|
|
||||||
|
#ifndef _PPP_MANAGER__H
|
||||||
|
#define _PPP_MANAGER__H
|
||||||
|
|
||||||
|
#include <KPPPManager.h>
|
||||||
|
|
||||||
|
|
||||||
|
class PPPManager {
|
||||||
|
private:
|
||||||
|
// copies are not allowed/needed
|
||||||
|
PPPManager(const PPPManager& copy);
|
||||||
|
PPPManager& operator= (const PPPManager& copy);
|
||||||
|
|
||||||
|
public:
|
||||||
|
PPPManager();
|
||||||
|
~PPPManager();
|
||||||
|
|
||||||
|
status_t InitCheck() const;
|
||||||
|
|
||||||
|
status_t Control(uint32 op, void *data, size_t length) const;
|
||||||
|
|
||||||
|
interface_id CreateInterface(const driver_settings *settings) const;
|
||||||
|
bool DeleteInterface(interface_id ID) const;
|
||||||
|
|
||||||
|
interface_id *Interfaces(int32 *count,
|
||||||
|
ppp_interface_filter filter = PPP_REGISTERED_INTERFACES) const;
|
||||||
|
// the user is responsible for deleting the returned array!
|
||||||
|
int32 GetInterfaces(interface_id *interfaces, int32 count,
|
||||||
|
ppp_interface_filter filter = PPP_REGISTERED_INTERFACES) const;
|
||||||
|
// make sure interfaces has enough space for count items
|
||||||
|
interface_id InterfaceWithSettings(const driver_settings *settings) const;
|
||||||
|
interface_id InterfaceWithUnit(int32 if_unit);
|
||||||
|
int32 CountInterfaces(ppp_interface_filter filter =
|
||||||
|
PPP_REGISTERED_INTERFACES) const;
|
||||||
|
|
||||||
|
bool EnableReports(ppp_report_type type, thread_id thread,
|
||||||
|
int32 flags = PPP_NO_FLAGS) const;
|
||||||
|
bool DisableReports(ppp_report_type type, thread_id thread) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
int fFD;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue
Block a user