00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071 #ifndef __STUN_H__
00072 #define __STUN_H__
00073
00074 #include <stdio.h>
00075 #include <time.h>
00076 #include <ortp/port.h>
00077 #include <ortp/stun_udp.h>
00078
00079
00080 #ifdef __cplusplus
00081 extern "C"
00082 {
00083 #endif
00084
00085
00086 #define STUN_VERSION "0.99"
00087
00088 #define STUN_MAX_STRING 256
00089 #define STUN_MAX_UNKNOWN_ATTRIBUTES 8
00090 #define STUN_MAX_MESSAGE_SIZE 2048
00091
00092 #define STUN_PORT 3478
00093
00094
00095 typedef unsigned char UInt8;
00096 typedef unsigned short UInt16;
00097 typedef unsigned int UInt32;
00098 #if defined(WIN32) || defined(_WIN32_WCE)
00099 typedef unsigned __int64 UInt64;
00100 #else
00101 typedef unsigned long long UInt64;
00102 #endif
00103 typedef struct { unsigned char octet[12]; } UInt96;
00104
00105
00106 #define IPv4Family 0x01
00107 #define IPv6Family 0x02
00108
00109
00110 #define ChangeIpFlag 0x04
00111 #define ChangePortFlag 0x02
00112
00113
00114 #define SA_MAPPEDADDRESS 0x0001
00115 #define SA_RESPONSEADDRESS 0x0002
00116 #define SA_CHANGEREQUEST 0x0003
00117 #define SA_SOURCEADDRESS 0x0004
00118 #define SA_CHANGEDADDRESS 0x0005
00119 #define SA_USERNAME 0x0006
00120 #define SA_PASSWORD 0x0007
00121 #define SA_MESSAGEINTEGRITY 0x0008
00122 #define SA_ERRORCODE 0x0009
00123 #define SA_UNKNOWNATTRIBUTE 0x000A
00124 #define SA_REFLECTEDFROM 0x000B
00125 #define SA_REALM 0x0014
00126 #define SA_NONCE 0x0015
00127 #define SA_XORMAPPEDADDRESS 0x0020
00128
00129 #define SA_XORMAPPEDADDRESS2 0x8020
00130 #define SA_XORONLY 0x0021
00131 #define SA_SECONDARYADDRESS 0x0050
00132
00133 #define SA_SOFTWARE 0x8022
00134 #define SA_ALTERNATESERVER 0x8023
00135 #define SA_FINGERPRINT 0x8028
00136
00137
00138 #define TA_CHANNELNUMBER 0x000C
00139 #define TA_LIFETIME 0x000D
00140 #define TA_DEPRECATEDBANDWIDTH 0x0010
00141 #define TA_XORPEERADDRESS 0x0012
00142 #define TA_DATA 0x0013
00143 #define TA_XORRELAYEDADDRESS 0x0016
00144 #define TA_EVENPORT 0x0018
00145 #define TA_REQUESTEDTRANSPORT 0x0019
00146 #define TA_DONTFRAGMENT 0x001A
00147 #define TA_DEPRECATEDTIMERVAL 0x0021
00148 #define TA_RESERVATIONTOKEN 0x0022
00149
00150 #define ICEA_PRIORITY 0x0024
00151 #define ICEA_USECANDIDATE 0x0025
00152 #define ICEA_ICECONTROLLED 0x8029
00153 #define ICEA_ICECONTROLLING 0x802a
00154
00155 #define STUN_REQUEST 0x0000
00156 #define STUN_INDICATION 0x0010
00157 #define STUN_SUCCESS_RESP 0x0100
00158 #define STUN_ERR_RESP 0x0110
00159
00160 #define STUN_IS_REQUEST(msg_type) (((msg_type) & 0x0110) == 0x0000)
00161 #define STUN_IS_INDICATION(msg_type) (((msg_type) & 0x0110) == 0x0010)
00162 #define STUN_IS_SUCCESS_RESP(msg_type) (((msg_type) & 0x0110) == 0x0100)
00163 #define STUN_IS_ERR_RESP(msg_type) (((msg_type) & 0x0110) == 0x0110)
00164
00165
00166 #define STUN_METHOD_BINDING 0x0001
00167 #define TURN_MEDHOD_ALLOCATE 0x0003 //(only request/response semantics defined)
00168 #define TURN_METHOD_REFRESH 0x0004 //(only request/response semantics defined)
00169 #define TURN_METHOD_CREATEPERMISSION 0x0008 //(only request/response semantics defined
00170 #define TURN_METHOD_CHANNELBIND 0x0009 //(only request/response semantics defined)
00171
00172
00173
00174 #define SharedSecretRequestMsg 0x0002
00175 #define SharedSecretResponseMsg 0x0102
00176 #define SharedSecretErrorResponseMsg 0x0112
00177
00178 #define TURN_INDICATION_SEND 0x0006 //(only indication semantics defined)
00179 #define TURN_INDICATION_DATA 0x0007 //(only indication semantics defined)
00180
00181 typedef struct
00182 {
00183 UInt16 msgType;
00184 UInt16 msgLength;
00185 UInt32 magic_cookie;
00186 UInt96 tr_id;
00187 } StunMsgHdr;
00188
00189
00190 typedef struct
00191 {
00192 UInt16 type;
00193 UInt16 length;
00194 } StunAtrHdr;
00195
00196 typedef struct
00197 {
00198 UInt16 port;
00199 UInt32 addr;
00200 } StunAddress4;
00201
00202 typedef struct
00203 {
00204 UInt8 pad;
00205 UInt8 family;
00206 StunAddress4 ipv4;
00207 } StunAtrAddress4;
00208
00209 typedef struct
00210 {
00211 UInt32 value;
00212 } StunAtrChangeRequest;
00213
00214 typedef struct
00215 {
00216 UInt16 pad;
00217 UInt8 errorClass;
00218 UInt8 number;
00219 char reason[STUN_MAX_STRING];
00220 UInt16 sizeReason;
00221 } StunAtrError;
00222
00223 typedef struct
00224 {
00225 UInt16 attrType[STUN_MAX_UNKNOWN_ATTRIBUTES];
00226 UInt16 numAttributes;
00227 } StunAtrUnknown;
00228
00229 typedef struct
00230 {
00231 UInt16 channelNumber;
00232 UInt16 rffu;
00233 } TurnAtrChannelNumber;
00234
00235 typedef struct
00236 {
00237 UInt32 lifetime;
00238 } TurnAtrLifetime;
00239
00240 typedef struct
00241 {
00242 char value[1500];
00243 UInt16 sizeValue;
00244 } TurnAtrData;
00245
00246 typedef struct
00247 {
00248 UInt8 proto;
00249 UInt8 pad1;
00250 UInt8 pad2;
00251 UInt8 pad3;
00252 } TurnAtrRequestedTransport;
00253
00254 typedef struct
00255 {
00256 UInt64 value;
00257 } TurnAtrReservationToken;
00258
00259 typedef struct
00260 {
00261 UInt32 fingerprint;
00262 } TurnAtrFingerprint;
00263
00264
00265 typedef struct
00266 {
00267 char value[STUN_MAX_STRING];
00268 UInt16 sizeValue;
00269 } StunAtrString;
00270
00271 typedef struct
00272 {
00273 UInt32 priority;
00274 } IceAtrPriority;
00275
00276 typedef struct
00277 {
00278 UInt64 value;
00279 } IceAtrIceControll;
00280
00281 typedef struct
00282 {
00283 char hash[20];
00284 } StunAtrIntegrity;
00285
00286 typedef enum
00287 {
00288 HmacUnkown=0,
00289 HmacOK,
00290 HmacBadUserName,
00291 HmacUnkownUserName,
00292 HmacFailed
00293 } StunHmacStatus;
00294
00295
00296 typedef struct
00297 {
00298 UInt16 attrType[STUN_MAX_UNKNOWN_ATTRIBUTES];
00299 UInt16 numAttributes;
00300 } TurnAtrUnknown;
00301
00302 typedef struct
00303 {
00304 StunMsgHdr msgHdr;
00305
00306 bool_t hasMappedAddress;
00307 StunAtrAddress4 mappedAddress;
00308
00309 bool_t hasResponseAddress;
00310 StunAtrAddress4 responseAddress;
00311
00312 bool_t hasChangeRequest;
00313 StunAtrChangeRequest changeRequest;
00314
00315 bool_t hasSourceAddress;
00316 StunAtrAddress4 sourceAddress;
00317
00318 bool_t hasChangedAddress;
00319 StunAtrAddress4 changedAddress;
00320
00321 bool_t hasUsername;
00322 StunAtrString username;
00323
00324 bool_t hasPassword;
00325 StunAtrString password;
00326
00327 bool_t hasMessageIntegrity;
00328 StunAtrIntegrity messageIntegrity;
00329
00330 bool_t hasErrorCode;
00331 StunAtrError errorCode;
00332
00333 bool_t hasUnknownAttributes;
00334 StunAtrUnknown unknownAttributes;
00335
00336 bool_t hasReflectedFrom;
00337 StunAtrAddress4 reflectedFrom;
00338
00339 bool_t hasRealm;
00340 StunAtrString realmName;
00341
00342 bool_t hasNonce;
00343 StunAtrString nonceName;
00344
00345 bool_t hasXorMappedAddress;
00346 StunAtrAddress4 xorMappedAddress;
00347
00348 bool_t hasSoftware;
00349 StunAtrString softwareName;
00350
00351
00352 bool_t hasChannelNumberAttributes;
00353 TurnAtrChannelNumber channelNumberAttributes;
00354
00355 bool_t hasLifetimeAttributes;
00356 TurnAtrLifetime lifetimeAttributes;
00357
00358 bool_t hasXorPeerAddress;
00359 StunAtrAddress4 xorPeerAddress;
00360
00361 bool_t hasData;
00362 TurnAtrData data;
00363
00364 bool_t hasXorRelayedAddress;
00365 StunAtrAddress4 xorRelayedAddress;
00366
00367 bool_t hasRequestedTransport;
00368 TurnAtrRequestedTransport requestedTransport;
00369
00370 bool_t hasDontFragment;
00371
00372 bool_t hasReservationToken;
00373 TurnAtrReservationToken reservationToken;
00374
00375 bool_t hasFingerprint;
00376 TurnAtrFingerprint fingerprint;
00377
00378 bool_t hasPriority;
00379 IceAtrPriority priority;
00380
00381 bool_t hasUseCandidate;
00382
00383 bool_t hasIceControlled;
00384 IceAtrIceControll iceControlled;
00385
00386 bool_t hasIceControlling;
00387 IceAtrIceControll iceControlling;
00388 } StunMessage;
00389
00390
00391
00392 typedef enum
00393 {
00394 StunTypeUnknown=0,
00395 StunTypeOpen,
00396 StunTypeConeNat,
00397 StunTypeRestrictedNat,
00398 StunTypePortRestrictedNat,
00399 StunTypeSymNat,
00400 StunTypeSymFirewall,
00401 StunTypeBlocked,
00402 StunTypeFailure
00403 } NatType;
00404
00405
00406 #define MAX_MEDIA_RELAYS 500
00407 #define MAX_RTP_MSG_SIZE 1500
00408 #define MEDIA_RELAY_TIMEOUT 3*60
00409
00410 typedef struct
00411 {
00412 int relayPort;
00413 int fd;
00414 StunAddress4 destination;
00415 time_t expireTime;
00416 } StunMediaRelay;
00417
00418 typedef struct
00419 {
00420 StunAddress4 myAddr;
00421 StunAddress4 altAddr;
00422 Socket myFd;
00423 Socket altPortFd;
00424 Socket altIpFd;
00425 Socket altIpPortFd;
00426 bool_t relay;
00427 StunMediaRelay relays[MAX_MEDIA_RELAYS];
00428 } StunServerInfo;
00429
00430 bool_t
00431 stunParseMessage( char* buf,
00432 unsigned int bufLen,
00433 StunMessage *message);
00434
00435 void
00436 stunBuildReqSimple( StunMessage* msg,
00437 const StunAtrString *username,
00438 bool_t changePort, bool_t changeIp, unsigned int id );
00439
00440 unsigned int
00441 stunEncodeMessage( const StunMessage *message,
00442 char* buf,
00443 unsigned int bufLen,
00444 const StunAtrString *password);
00445
00446 void
00447 stunCreateUserName(const StunAddress4 *addr, StunAtrString* username);
00448
00449 void
00450 stunGetUserNameAndPassword( const StunAddress4 *dest,
00451 StunAtrString* username,
00452 StunAtrString* password);
00453
00454 void
00455 stunCreatePassword(const StunAtrString *username, StunAtrString* password);
00456
00457 int
00458 stunRand(void);
00459
00460 UInt64
00461 stunGetSystemTimeSecs(void);
00462
00463
00464 bool_t
00465 stunParseServerName( const char* serverName, StunAddress4 *stunServerAddr);
00466
00467 bool_t
00468 stunParseHostName( const char* peerName,
00469 UInt32 *ip,
00470 UInt16 *portVal,
00471 UInt16 defaultPort );
00472
00473
00474
00475 bool_t
00476 stunInitServer(StunServerInfo *info,
00477 const StunAddress4 *myAddr,
00478 const StunAddress4 *altAddr,
00479 int startMediaPort);
00480
00481 void
00482 stunStopServer(StunServerInfo *info);
00483
00484
00485 int
00486 stunFindLocalInterfaces(UInt32* addresses, int maxSize );
00487
00488 int
00489 stunTest( StunAddress4 *dest, int testNum, StunAddress4* srcAddr, StunAddress4 *sMappedAddr, StunAddress4* sChangedAddr);
00490
00491 NatType
00492 stunNatType( StunAddress4 *dest,
00493 bool_t* preservePort,
00494 bool_t* hairpin ,
00495 int port,
00496 StunAddress4* sAddr
00497 );
00498
00499 bool_t
00500 stunServerProcessMsg( char* buf,
00501 unsigned int bufLen,
00502 StunAddress4 *from,
00503 StunAddress4 *myAddr,
00504 StunAddress4 *altAddr,
00505 StunMessage *resp,
00506 StunAddress4 *destination,
00507 StunAtrString *hmacPassword,
00508 bool_t* changePort,
00509 bool_t* changeIp);
00510
00511 int
00512 stunOpenSocket( StunAddress4 *dest,
00513 StunAddress4* mappedAddr,
00514 int port,
00515 StunAddress4* srcAddr);
00516
00517 bool_t
00518 stunOpenSocketPair(StunAddress4 *dest,
00519 StunAddress4* mapAddr_rtp,
00520 StunAddress4* mapAddr_rtcp,
00521 int* fd1, int* fd2,
00522 int srcPort, StunAddress4* srcAddr);
00523
00524 bool_t
00525 turnAllocateSocketPair(StunAddress4 *dest,
00526 StunAddress4* mapAddr_rtp,
00527 StunAddress4* mapAddr_rtcp,
00528 int* fd1, int* fd2,
00529 int srcPort, StunAddress4* srcAddr);
00530
00531 #ifdef __cplusplus
00532 }
00533 #endif
00534
00535 #endif
00536