xref: /haiku/src/add-ons/kernel/network/ppp/ipcp/ipcp.cpp (revision 97dfeb96704e5dbc5bec32ad7b21379d0125e031)
1 /*
2  * Copyright 2003-2004, Waldemar Kornewald <wkornew@gmx.net>
3  * Distributed under the terms of the MIT License.
4  */
5 
6 #include <KernelExport.h>
7 #include <driver_settings.h>
8 
9 #include <NetBufferUtilities.h>
10 #include <net_buffer.h>
11 #include <net_stack.h>
12 
13 #include <KPPPDefs.h>
14 #include <KPPPInterface.h>
15 #include <KPPPModule.h>
16 
17 #include "Protocol.h"
18 
19 #define IPCP_MODULE_NAME		NETWORK_MODULES_ROOT "/ppp/ipcp"
20 
21 status_t std_ops(int32 op, ...);
22 
23 net_stack_module_info *gStackModule = NULL;
24 net_buffer_module_info *gBufferModule = NULL;
25 
26 
27 // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
28 // TODO: Remove isascii() (needed for inet_aton()) when our kernel is finished!
29 // isascii() is not defined in the R5 kernel, thus we must define it here:
30 extern "C"
31 int
32 isascii(char c)
33 {
34 	return ((c & (~0x7f)) == 0); // If c is a 7 bit value.
35 }
36 // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
37 
38 
39 static
40 bool
41 add_to(KPPPInterface& mainInterface, KPPPInterface *subInterface,
42 	driver_parameter *settings, ppp_module_key_type type)
43 {
44 	if (type != PPP_PROTOCOL_KEY_TYPE)
45 		return B_ERROR;
46 
47 	IPCP *ipcp;
48 	bool success;
49 	if (subInterface) {
50 		ipcp = new IPCP(*subInterface, settings);
51 		success = subInterface->AddProtocol(ipcp);
52 	} else {
53 		ipcp = new IPCP(mainInterface, settings);
54 		success = mainInterface.AddProtocol(ipcp);
55 	}
56 
57 	TRACE("IPCP: add_to(): %s\n",
58 		success && ipcp && ipcp->InitCheck() == B_OK ? "OK" : "ERROR");
59 
60 	return success && ipcp && ipcp->InitCheck() == B_OK;
61 }
62 
63 
64 static ppp_module_info ipcp_module = {
65 	{
66 		IPCP_MODULE_NAME,
67 		0,
68 		std_ops
69 	},
70 	NULL,
71 	add_to
72 };
73 
74 
75 _EXPORT
76 status_t
77 std_ops(int32 op, ...)
78 {
79 	switch (op) {
80 		case B_MODULE_INIT:
81 			if (get_module(NET_STACK_MODULE_NAME,
82 					(module_info**) &gStackModule) != B_OK)
83 				return B_ERROR;
84 			if (get_module(NET_BUFFER_MODULE_NAME,
85 					(module_info **)&gBufferModule) != B_OK) {
86 				put_module(NET_STACK_MODULE_NAME);
87 				return B_ERROR;
88 			}
89 			return B_OK;
90 			break;
91 
92 		case B_MODULE_UNINIT:
93 			put_module(NET_BUFFER_MODULE_NAME);
94 			put_module(NET_STACK_MODULE_NAME);
95 			break;
96 
97 		default:
98 			return B_ERROR;
99 	}
100 
101 	return B_OK;
102 }
103 
104 
105 _EXPORT
106 module_info *modules[] = {
107 	(module_info*) &ipcp_module,
108 	NULL
109 };
110