Annotation of embedaddon/mpd/src/pptp_ctrl.h, revision 1.1
1.1 ! misho 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>