1/* 2 * Copyright 2003-2007, Waldemar Kornewald <wkornew@gmx.net> 3 * Distributed under the terms of the MIT License. 4 */ 5 6#include <OS.h> 7 8#include <KPPPUtils.h> 9#include <KPPPInterface.h> 10 11 12//! Returns if this protocol is allowed to handle packets in the current state. 13bool 14IsProtocolAllowed(const KPPPProtocol& protocol) 15{ 16 if (protocol.ProtocolNumber() == PPP_LCP_PROTOCOL) 17 return true; 18 else if (protocol.Interface().State() != PPP_OPENED_STATE) 19 return false; 20 else if (protocol.Interface().Phase() > PPP_AUTHENTICATION_PHASE 21 || (protocol.Interface().Phase() >= PPP_ESTABLISHMENT_PHASE 22 && protocol.Flags() & PPP_ALWAYS_ALLOWED)) 23 return true; 24 else 25 return false; 26} 27 28 29status_t 30send_data_with_timeout(thread_id thread, int32 code, void *buffer, 31 size_t buffer_size, uint32 timeout) 32{ 33 for (uint32 tries = 0; tries < timeout; tries += 5) { 34 if (has_data(thread)) 35 snooze(5000); 36 else 37 break; 38 } 39 40 if (!has_data(thread)) 41 return send_data(thread, code, buffer, buffer_size); 42 else 43 return B_TIMED_OUT; 44} 45 46 47status_t 48receive_data_with_timeout(thread_id *sender, int32 *code, void *buffer, 49 size_t buffer_size, uint32 timeout) 50{ 51 thread_id me = find_thread(NULL); 52 for (uint32 tries = 0; tries < timeout; tries += 5) { 53 if (!has_data(me)) 54 snooze(5000); 55 else 56 break; 57 } 58 59 if (has_data(find_thread(NULL))) { 60 *code = receive_data(sender, buffer, buffer_size); 61 return B_OK; 62 } else 63 return B_TIMED_OUT; 64} 65