view network/PPP.h @ 107:56d09a0969b5 avr-http

Import uIP and the PPP implementation from https://code.google.com/p/avrusbmodem/
author Matt Johnston <matt@ucc.asn.au>
date Fri, 07 Sep 2012 23:53:53 +0800
parents
children
line wrap: on
line source

/*
    LUFA Powered Wireless 3G Modem Host
	
    Copyright (C) Mike Alexander, 2010.
     Copyright (C) Dean Camera, 2010.
*/

/*
  Copyright 2010  Mike Alexander (mike [at] mikealex [dot] com)
  Copyright 2010  Dean Camera (dean [at] fourwalledcubicle [dot] com)

  Permission to use, copy, modify, distribute, and sell this 
  software and its documentation for any purpose is hereby granted
  without fee, provided that the above copyright notice appear in 
  all copies and that both that the copyright notice and this
  permission notice and warranty disclaimer appear in supporting 
  documentation, and that the name of the author not be used in 
  advertising or publicity pertaining to distribution of the 
  software without specific, written prior permission.

  The author disclaim all warranties with regard to this
  software, including all implied warranties of merchantability
  and fitness.  In no event shall the author be liable for any
  special, indirect or consequential damages or any damages
  whatsoever resulting from loss of use, data or profits, whether
  in an action of contract, negligence or other tortious action,
  arising out of or in connection with the use or performance of
  this software.
*/

#ifndef _PPP_H_
#define _PPP_H_

	/* Includes: */
		#include <util/crc16.h>
		#include <stdbool.h>
		#include <stdint.h>

		#include "LinkManagement.h"
		#include "Lib/RingBuff.h"
		#include "Lib/Debug.h"
	
	/* Enums: */

		typedef enum
		{
			PPP_LAYER_Physical,
			PPP_LAYER_Authentication,
			PPP_LAYER_Network,
		} PPP_Layers_t;

		typedef enum
		{
			PPP_PHASE_Dead,
			PPP_PHASE_Establish,
			PPP_PHASE_Authenticate,
			PPP_PHASE_Network,
			PPP_PHASE_Terminate
		} PPP_Phases_t;

		typedef enum
		{
			PPP_STATE_Initial,
			PPP_STATE_Starting,
			PPP_STATE_Closed,
			PPP_STATE_Stopped,
			PPP_STATE_Closing,
			PPP_STATE_Stopping,
			PPP_STATE_Req_Sent,
			PPP_STATE_Ack_Rcvd,
			PPP_STATE_Ack_Sent,
			PPP_STATE_Opened
		} PPP_States_t;

		typedef enum
		{
			PPP_EVENT_Up,
			PPP_EVENT_Down,
			PPP_EVENT_Open,
			PPP_EVENT_Close,
			PPP_EVENT_TOPlus,
			PPP_EVENT_TOMinus,
			PPP_EVENT_RCRPlus,
			PPP_EVENT_RCRMinus,
			PPP_EVENT_RCA,
			PPP_EVENT_RCN,
			PPP_EVENT_RTR,
			PPP_EVENT_RTA,
			PPP_EVENT_RUC,
			PPP_EVENT_RXJPlus,
			PPP_EVENT_RXJMinus,
			PPP_EVENT_RXR
		} PPP_Events_t;

	/* Type Defines: */
		typedef struct
		{
			uint8_t Type;
			uint8_t Length;
			uint8_t Data[];
		} PPP_Option_t;		

		typedef struct
		{
			uint8_t Code;
			uint8_t PacketID;
			uint16_t Length;
			PPP_Option_t Options[];
		} PPP_Packet_t;

	/* Macros: */
		#define CALC_CRC16(crcvalue, c)    _crc_ccitt_update(crcvalue, c);

		// Defines for LCP Negotiation Codes
		#define	REQ						1							// Request options list for PPP negotiations
		#define	ACK						2							// Acknowledge options list for PPP negotiations
		#define	NAK						3							// Not acknowledged options list for PPP negotiations
		#define	REJ						4							// Reject options list for PPP negotiations
		#define	TERMREQ					5							// Termination request for LCP to close connection
		#define	TERMREPLY				6							// Termination reply
		#define CODEREJ					7							// Code reject
		#define PROTREJ					8							// Protocol reject
		#define ECHOREQ					9							// Echo Request
		#define ECHOREPLY				10							// Echo Reply
		#define DISC 					11							// Discard request

		// Packet Types (Protocols)
		#define	IP 						0x0021						// Internet Protocol packet
		#define	IPCP 					0x8021						// Internet Protocol Configure Protocol packet
		#define	LCP						0xC021						// Link Configure Protocol packet
		#define	PAP						0xC023						// Password Authentication Protocol packet
		#define CHAP 					0xC223						// Challenge Handshake Authentication Protocol packet
		#define NONE 					0x0000

		#define LCP_OPTION_Maximum_Receive_Unit 					0x1		// LCP Option 1
		#define LCP_OPTION_Async_Control_Character_Map 				0x2		// LCP Option 2
		#define LCP_OPTION_Authentication_Protocol 					0x3		// LCP Option 3
		#define LCP_OPTION_Quality_Protocol 						0x4		// LCP Option 4
		#define LCP_OPTION_Magic_Number 							0x5		// LCP Option 5
		#define LCP_OPTION_Reserved			 						0x6		// LCP Option 6
		#define LCP_OPTION_Protocol_Field_Compression 				0x7		// LCP Option 7
		#define LCP_OPTION_Address_and_Control_Field_Compression 	0x8		// LCP Option 8
		#define LCP_OPTION_Callback								 	0xd		// LCP Option D

		#define IPCP_OPTION_IP_Compression_Protocol					0x2		// IPCP Option 2
		#define IPCP_OPTION_IP_address								0x3		// IPCP Option 3
		#define IPCP_OPTION_Primary_DNS								0x81	// IPCP Option 81
		#define IPCP_OPTION_Secondary_DNS							0x83	// IPCP Option 83

		#define MAX_RESTARTS										5
		#define OUTGOING_PACKET_BUFFER_SIZE							48

	/* External Variables: */
		extern uint8_t ConnectedState;

	/* Function Prototypes: */
		void PPP_ManageLink(void);
		void PPP_InitPPP(void);
		void PPP_LinkTimer(void);
		void PPP_LinkUp(void);
		void PPP_LinkOpen(void);
		void PPP_StartLink(void);

		#if defined(INCLUDE_FROM_PPP_C)
			static PPP_Option_t* PPP_GetNextOption(const PPP_Packet_t* const ThisPacket,
			                                       const PPP_Option_t* const CurrentOption);
			static void PPP_RemoveOption(PPP_Packet_t* const ThisPacket,
			                             const uint8_t Type);
			static void PPP_AddOption(const PPP_Option_t*);
			static bool PPP_CheckForOption(const PPP_Option_t*);
			static void PPP_ChangeOption(PPP_Packet_t* const ThisPacket,
			                             const PPP_Option_t* const Option);
			static void PPP_ProcessNAK(void);
			static void PPP_ProcessREJ(void);
			static bool PPP_TestForNAK(const PPP_Option_t* const Option);
			static bool PPP_TestForREJ(const uint8_t Options[],
			                           const uint8_t NumOptions);
			static void PPP_ManageState(const PPP_Events_t Event,
										PPP_States_t* const State,
										PPP_Layers_t const Layer);
			static void Send_Configure_Request(void);
			static void Send_Configure_Ack(void);
			static void Send_Configure_Nak_Rej(void);
			static void Send_Terminate_Request(void);
			static void Send_Terminate_Ack(void);
			static void Send_Code_Reject(void);
			static void Send_Echo_Reply(void);
			static void This_Layer_Up(PPP_Layers_t Layer);
			static void This_Layer_Down(PPP_Layers_t Layer);
			static void This_Layer_Started(PPP_Layers_t Layer);
			static void This_Layer_Finished(PPP_Layers_t Layer);
		#endif
		
#endif