1 /*
2 * Copyright 2003-2004, Waldemar Kornewald <wkornew@gmx.net>
3 * Distributed under the terms of the MIT License.
4 */
5
6 #include "ACFCHandler.h"
7
8 #include <KPPPConfigurePacket.h>
9
10
11 static const uint8 kACFCType = 0x8;
12
13
ACFCHandler(uint32 options,KPPPInterface & interface)14 ACFCHandler::ACFCHandler(uint32 options, KPPPInterface& interface)
15 : KPPPOptionHandler("ACFC Handler", kACFCType, interface, NULL),
16 fOptions(options),
17 fLocalState(ACFC_DISABLED),
18 fPeerState(ACFC_DISABLED)
19 {
20 }
21
22
23 status_t
AddToRequest(KPPPConfigurePacket & request)24 ACFCHandler::AddToRequest(KPPPConfigurePacket& request)
25 {
26 // is ACFC not requested or was it rejected?
27 if (fLocalState == ACFC_REJECTED
28 || (Options() & REQUEST_ACFC) == 0)
29 return B_OK;
30
31 // add ACFC request
32 ppp_configure_item item;
33 item.type = kACFCType;
34 item.length = 2;
35 return request.AddItem(&item) ? B_OK : B_ERROR;
36 }
37
38
39 status_t
ParseNak(const KPPPConfigurePacket & nak)40 ACFCHandler::ParseNak(const KPPPConfigurePacket& nak)
41 {
42 // naks do not contain ACFC items
43 if (nak.ItemWithType(kACFCType))
44 return B_ERROR;
45
46 return B_OK;
47 }
48
49
50 status_t
ParseReject(const KPPPConfigurePacket & reject)51 ACFCHandler::ParseReject(const KPPPConfigurePacket& reject)
52 {
53 if (reject.ItemWithType(kACFCType)) {
54 fLocalState = ACFC_REJECTED;
55
56 if (Options() & FORCE_ACFC_REQUEST)
57 return B_ERROR;
58 }
59
60 return B_OK;
61 }
62
63
64 status_t
ParseAck(const KPPPConfigurePacket & ack)65 ACFCHandler::ParseAck(const KPPPConfigurePacket& ack)
66 {
67 if (ack.ItemWithType(kACFCType))
68 fLocalState = ACFC_ACCEPTED;
69 else {
70 fLocalState = ACFC_DISABLED;
71
72 if (Options() & FORCE_ACFC_REQUEST)
73 return B_ERROR;
74 }
75
76 return B_OK;
77 }
78
79
80 status_t
ParseRequest(const KPPPConfigurePacket & request,int32 index,KPPPConfigurePacket & nak,KPPPConfigurePacket & reject)81 ACFCHandler::ParseRequest(const KPPPConfigurePacket& request,
82 int32 index, KPPPConfigurePacket& nak, KPPPConfigurePacket& reject)
83 {
84 if (!request.ItemWithType(kACFCType))
85 return B_OK;
86
87 if ((Options() & ALLOW_ACFC) == 0) {
88 ppp_configure_item item;
89 item.type = kACFCType;
90 item.length = 2;
91 return reject.AddItem(&item) ? B_OK : B_ERROR;
92 }
93
94 return B_OK;
95 }
96
97
98 status_t
SendingAck(const KPPPConfigurePacket & ack)99 ACFCHandler::SendingAck(const KPPPConfigurePacket& ack)
100 {
101 ppp_configure_item *item = ack.ItemWithType(kACFCType);
102
103 if (item && (Options() & ALLOW_ACFC) == 0)
104 return B_ERROR;
105
106 if (item)
107 fPeerState = ACFC_ACCEPTED;
108 else
109 fPeerState = ACFC_DISABLED;
110
111 return B_OK;
112 }
113
114
115 void
Reset()116 ACFCHandler::Reset()
117 {
118 fLocalState = fPeerState = ACFC_DISABLED;
119 }
120