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 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 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 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 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 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 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 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 116 ACFCHandler::Reset() 117 { 118 fLocalState = fPeerState = ACFC_DISABLED; 119 } 120