File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / mpd / src / pptp_ctrl.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Mon Jul 22 08:44:29 2013 UTC (10 years, 11 months ago) by misho
Branches: mpd, MAIN
CVS tags: v5_8p7, v5_8p1_cross, v5_8p1, v5_8, v5_7p0, v5_7, v5_6, HEAD
5.7

    1: 
    2: /*
    3:  * pptp_ctrl.h
    4:  *
    5:  * Written by Archie Cobbs <archie@freebsd.org>
    6:  * Copyright (c) 1998-1999 Whistle Communications, Inc. All rights reserved.
    7:  * See ``COPYRIGHT.whistle''
    8:  */
    9: 
   10: #if !defined(_PPTP_CTRL_H_) || defined(_WANT_PPTP_FIELDS)
   11: #ifndef _WANT_PPTP_FIELDS
   12: #define	_PPTP_CTRL_H_
   13: 
   14: /*
   15:  * DEFINITIONS
   16:  */
   17: 
   18:   /* Definitions per the spec */
   19:   #define PPTP_PORT		1723
   20:   #define PPTP_MTU		1532
   21:   #define PPTP_PROTO_VERS	0x0100
   22:   #define PPTP_MAGIC		0x1a2b3c4d
   23:   #define PPTP_IDLE_TIMEOUT	60
   24: 
   25:   #define PPTP_HOSTNAME_LEN	64
   26:   #define PPTP_VENDOR_LEN	64
   27:   #define PPTP_PHONE_LEN	64
   28:   #define PPTP_SUBADDR_LEN	64
   29:   #define PPTP_STATS_LEN	128
   30: 
   31:   /* Control messages */
   32:   #define PPTP_CTRL_MSG_TYPE	1
   33: 
   34:   enum {
   35:     PPTP_StartCtrlConnRequest = 1,
   36:     PPTP_StartCtrlConnReply = 2,
   37:     PPTP_StopCtrlConnRequest = 3,
   38:     PPTP_StopCtrlConnReply = 4,
   39:     PPTP_EchoRequest = 5,
   40:     PPTP_EchoReply = 6,
   41:     PPTP_OutCallRequest = 7,
   42:     PPTP_OutCallReply = 8,
   43:     PPTP_InCallRequest = 9,
   44:     PPTP_InCallReply = 10,
   45:     PPTP_InCallConn = 11,
   46:     PPTP_CallClearRequest = 12,
   47:     PPTP_CallDiscNotify = 13,
   48:     PPTP_WanErrorNotify = 14,
   49:     PPTP_SetLinkInfo = 15
   50:   };
   51: 
   52:   #define PPTP_MIN_CTRL_TYPE		1
   53:   #define PPTP_MAX_CTRL_TYPE		16
   54: 
   55:   #define PPTP_VALID_CTRL_TYPE(x)	\
   56: 	((x) >= PPTP_MIN_CTRL_TYPE && (x) < PPTP_MAX_CTRL_TYPE)
   57: 
   58:   /* Framing capabilities */
   59:   #define PPTP_FRAMECAP_ASYNC		0x01
   60:   #define PPTP_FRAMECAP_SYNC		0x02
   61:   #define PPTP_FRAMECAP_ANY		0x03
   62: 
   63:   /* Bearer capabilities */
   64:   #define PPTP_BEARCAP_ANALOG		0x01
   65:   #define PPTP_BEARCAP_DIGITAL		0x02
   66:   #define PPTP_BEARCAP_ANY		0x03
   67: 
   68:   /* General error codes */
   69:   #define PPTP_ERROR_NONE		0
   70:   #define PPTP_ERROR_NOT_CONNECTED	1
   71:   #define PPTP_ERROR_BAD_FORMAT		2
   72:   #define PPTP_ERROR_BAD_VALUE		3
   73:   #define PPTP_ERROR_NO_RESOURCE	4
   74:   #define PPTP_ERROR_BAD_CALL_ID	5
   75:   #define PPTP_ERROR_PAC_ERROR		6
   76: 
   77:   /* All reserved fields have this prefix */
   78:   #define PPTP_RESV_PREF		"resv"
   79: 
   80:   /* Message structures */
   81:   struct pptpMsgHead {
   82:     u_int16_t	length;		/* total length */
   83:     u_int16_t	msgType;	/* PPTP message type */
   84:     u_int32_t	magic;		/* magic cookie */
   85:     u_int16_t	type;		/* control message type */
   86:     u_int16_t	resv0;		/* reserved */
   87:   };
   88:   typedef struct pptpMsgHead	*PptpMsgHead;
   89: 
   90: #else
   91:   { { "len", 2 }, { "msgType", 2 }, { "magic", 4 }, { "type", 2 },
   92:     { PPTP_RESV_PREF "0", 2 }, { NULL, 0 } },
   93: #endif
   94: #ifndef _WANT_PPTP_FIELDS
   95: 
   96:   struct pptpStartCtrlConnRequest {
   97:     u_int16_t		vers;		/* protocol version */
   98:     u_int16_t		resv0;		/* reserved */
   99:     u_int32_t		frameCap;	/* framing capabilities */
  100:     u_int32_t		bearCap;	/* bearer capabilities */
  101:     u_int16_t		maxChan;	/* maximum # channels */
  102:     u_int16_t		firmware;	/* firmware revision */
  103:     char		host[PPTP_HOSTNAME_LEN];	/* host name */
  104:     char		vendor[PPTP_VENDOR_LEN];	/* vendor name */
  105:   };
  106: 
  107: #else
  108:   { { "vers", 2 }, { PPTP_RESV_PREF "0", 2 }, { "frameCap", 4 },
  109:     { "bearCap", 4 }, { "maxChan", 2 }, { "firm", 2 },
  110:     { "host", PPTP_HOSTNAME_LEN }, { "vend", PPTP_VENDOR_LEN }, { NULL, 0 } },
  111: #endif
  112: #ifndef _WANT_PPTP_FIELDS
  113: 
  114:   struct pptpStartCtrlConnReply {
  115:     u_int16_t		vers;		/* protocol version */
  116:     u_int8_t		result;		/* result code */
  117:     u_int8_t		err;		/* error code */
  118:     u_int32_t		frameCap;	/* framing capabilities */
  119:     u_int32_t		bearCap;	/* bearer capabilities */
  120:     u_int16_t		maxChan;	/* maximum # channels */
  121:     u_int16_t		firmware;	/* firmware revision */
  122:     char		host[PPTP_HOSTNAME_LEN];	/* host name */
  123:     char		vendor[PPTP_VENDOR_LEN];	/* vendor name */
  124:   };
  125: 
  126: #else
  127:   { { "vers", 2 }, { "result", 1 }, { "err", 1 }, { "frameCap", 4 },
  128:     { "bearCap", 4 }, { "maxChan", 2 }, { "firm", 2 },
  129:     { "host", PPTP_HOSTNAME_LEN }, { "vend", PPTP_VENDOR_LEN }, { NULL, 0 } },
  130: #endif
  131: #ifndef _WANT_PPTP_FIELDS
  132: 
  133:   #define PPTP_SCCR_RESL_OK	1	/* channel successfully established */
  134:   #define PPTP_SCCR_RESL_ERR	2	/* general error; see error code */
  135:   #define PPTP_SCCR_RESL_EXISTS	3	/* command channel already exists */
  136:   #define PPTP_SCCR_RESL_AUTH	4	/* not authorized */
  137:   #define PPTP_SCCR_RESL_VERS	5	/* incompatible protocol version */
  138: 
  139:   struct pptpStopCtrlConnRequest {
  140:     u_int8_t		reason;		/* reason */
  141:     u_int8_t		resv0;		/* reserved */
  142:     u_int16_t		resv1;		/* reserved */
  143:   };
  144: 
  145: #else
  146:   { { "reason", 1 }, { PPTP_RESV_PREF "0", 1 }, { PPTP_RESV_PREF "1", 2 },
  147:     { NULL, 0 } },
  148: #endif
  149: #ifndef _WANT_PPTP_FIELDS
  150: 
  151:   #define PPTP_SCCR_REAS_NONE	1	/* general */
  152:   #define PPTP_SCCR_REAS_PROTO	2	/* can't support protocol version */
  153:   #define PPTP_SCCR_REAS_LOCAL	3	/* local shutdown */
  154: 
  155:   struct pptpStopCtrlConnReply {
  156:     u_int8_t		result;		/* result code */
  157:     u_int8_t		err;		/* error code */
  158:     u_int16_t		resv0;		/* reserved */
  159:   };
  160: 
  161: #else
  162:   { { "result", 1 }, { "err", 1 }, { PPTP_RESV_PREF "0", 2 }, { NULL, 0 } },
  163: #endif
  164: #ifndef _WANT_PPTP_FIELDS
  165: 
  166:   struct pptpEchoRequest {
  167:     u_int32_t		id;		/* identifier */
  168:   };
  169: 
  170: #else
  171:   { { "id", 4 }, { NULL, 0 } },
  172: #endif
  173: #ifndef _WANT_PPTP_FIELDS
  174: 
  175:   struct pptpEchoReply {
  176:     u_int32_t		id;		/* identifier */
  177:     u_int8_t		result;		/* result code */
  178:     u_int8_t		err;		/* error code */
  179:     u_int16_t		resv0;		/* reserved */
  180:   };
  181: 
  182: #else
  183:   { { "id", 4 }, { "result", 1 }, { "err", 1 },
  184:     { "ignore", 2 }, { NULL, 0 } },
  185: #endif
  186: #ifndef _WANT_PPTP_FIELDS
  187: 
  188:   #define PPTP_ECHO_RESL_OK	1	/* echo reply is valid */
  189:   #define PPTP_ECHO_RESL_ERR	2	/* general error; see error code */
  190: 
  191:   struct pptpOutCallRequest {
  192:     u_int16_t		cid;		/* call id */
  193:     u_int16_t		serno;		/* call serial # */
  194:     u_int32_t		minBps;		/* minimum BPS */
  195:     u_int32_t		maxBps;		/* maximum BPS */
  196:     u_int32_t		bearType;	/* bearer type */
  197:     u_int32_t		frameType;	/* framing type */
  198:     u_int16_t		recvWin;	/* pkt receive window size */
  199:     u_int16_t		ppd;		/* pkt processing delay */
  200:     u_int16_t		numLen;		/* phone number length */
  201:     u_int16_t		resv0;		/* reserved */
  202:     char		phone[PPTP_PHONE_LEN];		/* phone number */
  203:     char		subaddr[PPTP_SUBADDR_LEN];	/* sub-address */
  204:   };
  205: 
  206: #else
  207:   { { "cid", 2 }, { "serno", 2 }, { "minBPS", 4 }, { "maxBPS", 4 },
  208:     { "bearType", 4 }, { "frameType", 4 },{ "recvWin", 2 }, { "ppd", 2 },
  209:     { "numLen", 2 }, { PPTP_RESV_PREF "0", 2 },
  210:     { "phone", PPTP_PHONE_LEN }, { "subaddr", PPTP_SUBADDR_LEN },
  211:     { NULL, 0 } },
  212: #endif
  213: #ifndef _WANT_PPTP_FIELDS
  214: 
  215:   struct pptpOutCallReply {
  216:     u_int16_t		cid;		/* call id */
  217:     u_int16_t		peerCid;	/* peer call id */
  218:     u_int8_t		result;		/* result code */
  219:     u_int8_t		err;		/* error code */
  220:     u_int16_t		cause;		/* cause code */
  221:     u_int32_t		speed;		/* cause code */
  222:     u_int16_t		recvWin;	/* pkt receive window size code */
  223:     u_int16_t		ppd;		/* pkt processing delay */
  224:     u_int32_t		channel;	/* physical channel id */
  225:   };
  226: 
  227: #else
  228:   { { "cid", 2 }, { "peerCid", 2 }, { "result", 1 }, { "err", 1 },
  229:     { "cause", 2 }, { "speed", 4 }, { "recvWin", 2 }, { "ppd", 2 },
  230:     { "channel", 4 }, { NULL, 0 } },
  231: #endif
  232: #ifndef _WANT_PPTP_FIELDS
  233: 
  234:   #define PPTP_OCR_RESL_OK	1	/* call established OK */
  235:   #define PPTP_OCR_RESL_ERR	2	/* general error; see error code */
  236:   #define PPTP_OCR_RESL_NOCARR	3	/* no carrier */
  237:   #define PPTP_OCR_RESL_BUSY	4	/* busy */
  238:   #define PPTP_OCR_RESL_NODIAL	5	/* no dialtone */
  239:   #define PPTP_OCR_RESL_TIMED	6	/* timed out */
  240:   #define PPTP_OCR_RESL_ADMIN	7	/* administratvely prohibited */
  241: 
  242:   struct pptpInCallRequest {
  243:     u_int16_t		cid;		/* call id */
  244:     u_int16_t		serno;		/* call serial # */
  245:     u_int32_t		bearType;	/* bearer type */
  246:     u_int32_t		channel;	/* physical channel id */
  247:     u_int16_t		dialedLen;	/* dialed number len */
  248:     u_int16_t		dialingLen;	/* dialing number len */
  249:     char		dialed[PPTP_PHONE_LEN];		/* dialed number */
  250:     char		dialing[PPTP_PHONE_LEN];	/* dialing number */
  251:     char		subaddr[PPTP_SUBADDR_LEN];	/* sub-address */
  252:   };
  253: 
  254: #else
  255:   { { "cid", 2 }, { "serno", 2 }, { "bearType", 4 }, { "channel", 4 },
  256:     { "dialedLen", 2 }, { "dialingLen", 2 }, { "dialed", PPTP_PHONE_LEN },
  257:     { "dialing", PPTP_PHONE_LEN }, { "subaddr", PPTP_SUBADDR_LEN },
  258:     { NULL, 0 } },
  259: #endif
  260: #ifndef _WANT_PPTP_FIELDS
  261: 
  262:   struct pptpInCallReply {
  263:     u_int16_t		cid;		/* call id */
  264:     u_int16_t		peerCid;	/* peer call id */
  265:     u_int8_t		result;		/* result code */
  266:     u_int8_t		err;		/* error code */
  267:     u_int16_t		recvWin;	/* pkt receive window size code */
  268:     u_int16_t		ppd;		/* pkt processing delay */
  269:     u_int16_t		resv0;		/* reserved */
  270:   };
  271: 
  272: #else
  273:   { { "cid", 2 }, { "peerCid", 2 }, { "result", 1 }, { "err", 1 },
  274:     { "recvWin", 2 }, { "ppd", 2 }, { PPTP_RESV_PREF "0", 2 },
  275:     { NULL, 0 } },
  276: #endif
  277: #ifndef _WANT_PPTP_FIELDS
  278: 
  279:   #define PPTP_ICR_RESL_OK	1	/* call established OK */
  280:   #define PPTP_ICR_RESL_ERR	2	/* general error; see error code */
  281:   #define PPTP_ICR_RESL_NAK	3	/* do not accept */
  282: 
  283:   struct pptpInCallConn {
  284:     u_int16_t		peerCid;	/* peer call id */
  285:     u_int16_t		resv0;		/* reserved */
  286:     u_int32_t		speed;		/* connect speed */
  287:     u_int16_t		recvWin;	/* pkt receive window size code */
  288:     u_int16_t		ppd;		/* pkt processing delay */
  289:     u_int32_t		frameType;	/* framing type */
  290:   };
  291: 
  292: #else
  293:   { { "peerCid", 2 }, { PPTP_RESV_PREF "0", 2 }, { "speed", 4 },
  294:     { "recvWin", 2 }, { "ppd", 2 }, { "frameType", 4 }, { NULL, 0 } },
  295: #endif
  296: #ifndef _WANT_PPTP_FIELDS
  297: 
  298:   struct pptpCallClearRequest {
  299:     u_int16_t		cid;		/* PNS assigned call id */
  300:     u_int16_t		resv0;		/* reserved */
  301:   };
  302: 
  303: #else
  304:   { { "cid", 2 }, { PPTP_RESV_PREF "0", 2 }, { NULL, 0 } },
  305: #endif
  306: #ifndef _WANT_PPTP_FIELDS
  307: 
  308:   struct pptpCallDiscNotify {
  309:     u_int16_t		cid;		/* PAC assigned call id */
  310:     u_int8_t		result;		/* result code */
  311:     u_int8_t		err;		/* error code */
  312:     u_int16_t		cause;		/* cause code */
  313:     u_int16_t		resv0;		/* reserved */
  314:     char		stats[PPTP_STATS_LEN];	/* call stats */
  315:   };
  316: 
  317: #else
  318:   { { "cid", 2 }, { "result", 1 }, { "err", 1 }, { "cause", 2 },
  319:     { PPTP_RESV_PREF "0", 2 }, { "stats", PPTP_STATS_LEN },
  320:     { NULL, 0 } },
  321: #endif
  322: #ifndef _WANT_PPTP_FIELDS
  323: 
  324:   #define PPTP_CDN_RESL_CARR	1	/* lost carrier */
  325:   #define PPTP_CDN_RESL_ERR	2	/* general error; see error code */
  326:   #define PPTP_CDN_RESL_ADMIN	3	/* administrative reason */
  327:   #define PPTP_CDN_RESL_REQ	4	/* received disconnect request */
  328: 
  329:   struct pptpWanErrorNotify {
  330:     u_int16_t		cid;		/* PNS assigned call id */
  331:     u_int16_t		resv0;		/* reserved */
  332:     u_int32_t		crc;		/* crc errors */
  333:     u_int32_t		frame;		/* framing errors */
  334:     u_int32_t		hdw;		/* hardware errors */
  335:     u_int32_t		ovfl;		/* buffer overrun errors */
  336:     u_int32_t		timeout;	/* timeout errors */
  337:     u_int32_t		align;		/* alignment errors */
  338:   };
  339: 
  340: #else
  341:   { { "cid", 2 }, { PPTP_RESV_PREF "0", 2 }, { "crc", 4 },
  342:     { "frame", 4 }, { "hdw", 4 }, { "ovfl", 4 }, { "timeout", 4 },
  343:     { "align", 4 }, { NULL, 0 } },
  344: #endif
  345: #ifndef _WANT_PPTP_FIELDS
  346: 
  347:   struct pptpSetLinkInfo {
  348:     u_int16_t		cid;		/* call id */
  349:     u_int16_t		resv0;		/* reserved */
  350:     u_int32_t		sendAccm;	/* send ACCM */
  351:     u_int32_t		recvAccm;	/* receive ACCM */
  352:   };
  353: 
  354: #else
  355:   { { "cid", 2 }, { PPTP_RESV_PREF "0", 2 }, { "sendAccm", 4 },
  356:     { "recvAccm", 4 }, { NULL, 0 } },
  357: #endif
  358: #ifndef _WANT_PPTP_FIELDS
  359: 
  360:   #define PPTP_CTRL_MAX_FRAME	\
  361: 	(sizeof(struct pptpMsgHead) + sizeof(struct pptpInCallRequest))
  362:   #define PPTP_CTRL_MAX_FIELDS	14
  363: 
  364:   /* Describes one field of a PPTP control message structure */
  365:   struct pptpfield {
  366:     const char	*name;
  367:     u_short	length;
  368:   };
  369:   typedef struct pptpfield	*PptpField;
  370: 
  371:   /* Link <-> control liason structures and callback function types */
  372:   struct pptplinkinfo {		/* PPTP's info for accessing link code */
  373:     void	*cookie;	/* NULL indicates response is invalid */
  374:     void	(*result)(void *cookie, const char *errmsg, int frameType);
  375:     void	(*setLinkInfo)(void *cookie, u_int32_t sa, u_int32_t ra);
  376:     void	(*cancel)(void *cookie);	/* cancel outgoing call */
  377:   };
  378:   typedef struct pptplinkinfo	*PptpLinkInfo;
  379: 
  380:   struct pptpctrlinfo {		/* Link's info for accessing PPTP code */
  381:     void		*cookie;	/* NULL indicates response is invalid */
  382:     struct u_addr	peer_addr;	/* Peer IP address and port */
  383:     in_port_t		peer_port;
  384:     void		(*close)(void *cookie, int result, int err, int cause);
  385:     void		(*answer)(void *cookie, int rs, int er, int cs, int sp);
  386:     void		(*connected)(void *cookie, int sp);
  387:     void		(*setLinkInfo)(void *cookie, u_int32_t sa, u_int32_t ra);
  388:   };
  389:   typedef struct pptpctrlinfo	*PptpCtrlInfo;
  390: 
  391:   typedef struct pptplinkinfo	(*PptpGetInLink_t)(struct pptpctrlinfo *cinfo,
  392: 				  struct u_addr *self, struct u_addr *peer, in_port_t port, 
  393: 				  int bearType,
  394: 				  const char *callingNum,
  395: 				  const char *calledNum,
  396: 				  const char *subAddress);
  397: 
  398:   typedef struct pptplinkinfo	(*PptpGetOutLink_t)(struct pptpctrlinfo *cinfo,
  399: 				  struct u_addr *self, struct u_addr *peer, in_port_t port, 
  400: 				  int bearType, int frameType, int minBps, int maxBps,
  401: 				  const char *calledNum,
  402: 				  const char *subAddress);
  403: 
  404: /*
  405:  * FUNCTIONS
  406:  */
  407: 
  408:   extern int			PptpCtrlInit(PptpGetInLink_t getInLink,
  409: 				  PptpGetOutLink_t getOutLink);
  410: 
  411:   extern void*			PptpCtrlListen(struct u_addr *ip, in_port_t port);
  412:   extern void			PptpCtrlUnListen(void *listener);
  413: 
  414:   extern void			PptpCtrlInCall(struct pptpctrlinfo *cinfo,
  415: 				  struct pptplinkinfo *linfo,
  416: 				  struct u_addr *locip, struct u_addr *ip,
  417: 				  in_port_t port, int bearType, int frameType,
  418: 				  int minBps, int maxBps,
  419: 				  const char *callingNum,
  420: 				  const char *calledNum,
  421: 				  const char *subAddress);
  422: 
  423:   extern void			PptpCtrlOutCall(struct pptpctrlinfo *cinfo,
  424: 				  struct pptplinkinfo *linfo,
  425: 				  struct u_addr *locip, struct u_addr *ip,
  426: 				  in_port_t port, int bearType, int frameType,
  427: 				  int minBps, int maxBps,
  428: 				  const char *calledNum,
  429: 				  const char *subAddress);
  430: 
  431:   extern int			PptpCtrlGetSessionInfo(struct pptpctrlinfo *cp,
  432: 				  struct u_addr *selfAddr,
  433: 				  struct u_addr *peerAddr,
  434: 				  u_int16_t *selfCid, u_int16_t *peerCid,
  435: 				  u_int16_t *peerWin, u_int16_t *peerPpd);
  436: 
  437: /*
  438:  * Get local/remote hostnames.
  439:  */
  440:   extern int	PptpCtrlGetSelfName(struct pptpctrlinfo *cp,
  441: 			void *buf, size_t buf_len);
  442:   extern int	PptpCtrlGetPeerName(struct pptpctrlinfo *cp,
  443: 			void *buf, size_t buf_len);
  444: 
  445: #endif	/* #ifndef _WANT_PPTP_FIELDS */
  446: #endif	/* #if !defined(_PPTP_CTRL_H_) || defined(_WANT_PPTP_FIELDS) */
  447: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>