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