xref: /haiku/src/add-ons/kernel/network/ppp/shared/libkernelppp/KPPPDevice.cpp (revision 9642f7705b27e5c270c15fa526d14e1848c2c27d)
1 /*
2  * Copyright 2003-2007, Waldemar Kornewald <wkornew@gmx.net>
3  * Distributed under the terms of the MIT License.
4  */
5 
6 /*!	\class KPPPDevice
7 	\brief Represents a device at the lowest level of the communcation stack.
8 
9 	A device may be, for example: Modem, PPPoE, PPTP. \n
10 	It encapsulates the packet and sends it over a line to the other end.
11 	The device is the first layer that receives a packet.
12 */
13 
14 #include <KPPPDevice.h>
15 
16 #include <net/if.h>
17 
18 #include <PPPControl.h>
19 
20 
21 /*!	\brief Initializes the device.
22 
23 	\param name The device's type name (e.g.: PPPoE).
24 	\param overhead Length of the header that is prepended to each packet.
25 	\param interface Owning interface.
26 	\param settings Device's settings.
27 */
28 KPPPDevice::KPPPDevice(const char *name, uint32 overhead, KPPPInterface& interface,
29 		driver_parameter *settings)
30 	: KPPPLayer(name, PPP_DEVICE_LEVEL, overhead),
31 	fMTU(1500),
32 	fInterface(interface),
33 	fSettings(settings),
34 	fConnectionPhase(PPP_DOWN_PHASE)
35 {
36 }
37 
38 
39 //!	Destructor. Removes device from interface.
40 KPPPDevice::~KPPPDevice()
41 {
42 	if (Interface().Device() == this)
43 		Interface().SetDevice(NULL);
44 }
45 
46 
47 /*!	\brief Allows private extensions.
48 
49 	If you override this method you must call the parent's method for unknown ops.
50 */
51 status_t
52 KPPPDevice::Control(uint32 op, void *data, size_t length)
53 {
54 	dprintf("KPPPDevice::Control\n");
55 	switch (op) {
56 		case PPPC_GET_DEVICE_INFO:
57 		{
58 			if (length < sizeof(ppp_device_info_t) || !data)
59 				return B_NO_MEMORY;
60 
61 			ppp_device_info *info = (ppp_device_info*) data;
62 			memset(info, 0, sizeof(ppp_device_info_t));
63 			if (Name())
64 				strncpy(info->name, Name(), PPP_HANDLER_NAME_LENGTH_LIMIT);
65 			info->MTU = MTU();
66 			info->inputTransferRate = InputTransferRate();
67 			info->outputTransferRate = OutputTransferRate();
68 			info->outputBytesCount = CountOutputBytes();
69 			info->isUp = IsUp();
70 			break;
71 		}
72 
73 		default:
74 			return B_BAD_VALUE;
75 	}
76 
77 	return B_OK;
78 }
79 
80 
81 //!	Returns \c true (indicates to KPPPInterface we are always allowed to send).
82 bool
83 KPPPDevice::IsAllowedToSend() const
84 {
85 	return true;
86 		// our connection status will be reported in Send()
87 }
88 
89 
90 //!	This method is never used.
91 status_t
92 KPPPDevice::Receive(net_buffer *packet, uint16 protocolNumber)
93 {
94 	// let the interface handle the packet
95 	if (protocolNumber == 0)
96 		return Interface().ReceiveFromDevice(packet);
97 	else
98 		return Interface().Receive(packet, protocolNumber);
99 }
100 
101 
102 /*!	\brief Report that device is going up.
103 
104 	Called by Up(). \n
105 	From now on, the connection attempt can may be aborted by calling Down().
106 
107 	\return
108 		- \c true: You are allowed to connect.
109 		- \c false: You should abort immediately. Down() will \e not be called!
110 */
111 bool
112 KPPPDevice::UpStarted()
113 {
114 	fConnectionPhase = PPP_ESTABLISHMENT_PHASE;
115 
116 	return Interface().StateMachine().TLSNotify();
117 }
118 
119 
120 /*!	\brief Report that device is going down.
121 
122 	Called by Down().
123 
124 	\return
125 		- \c true: You are allowed to disconnect.
126 		- \c false: You must not disconnect!
127 */
128 bool
129 KPPPDevice::DownStarted()
130 {
131 	fConnectionPhase = PPP_TERMINATION_PHASE;
132 
133 	return Interface().StateMachine().TLFNotify();
134 }
135 
136 
137 //!	Reports that device failed going up. May only be called after Up() was called.
138 void
139 KPPPDevice::UpFailedEvent()
140 {
141 	fConnectionPhase = PPP_DOWN_PHASE;
142 
143 	Interface().StateMachine().UpFailedEvent();
144 }
145 
146 
147 //!	Reports that device went up. May only be called after Up() was called.
148 void
149 KPPPDevice::UpEvent()
150 {
151 	fConnectionPhase = PPP_ESTABLISHED_PHASE;
152 
153 	Interface().StateMachine().UpEvent();
154 }
155 
156 
157 //!	Reports that device went down. This may be called to indicate connection loss.
158 void
159 KPPPDevice::DownEvent()
160 {
161 	fConnectionPhase = PPP_DOWN_PHASE;
162 
163 	Interface().StateMachine().DownEvent();
164 }
165