text: /**
   * @file stun.h  Internal STUN interface
   *
   * Copyright (C) 2010 Creytiv.com
   */
  
  
  /** STUN Protocol values */
  enum {
  	STUN_MAGIC_COOKIE = 0x2112a442 /**< Magic Cookie for 3489bis        */
  };
  
  
  /** Calculate STUN message type from method and class */
  #define STUN_TYPE(method, class)	    \
  	((method)&0x0f80) << 2 |	    \
  	((method)&0x0070) << 1 |	    \
  	((method)&0x000f) << 0 |	    \
  	((class)&0x2)     << 7 |	    \
  	((class)&0x1)     << 4
  
  
  #define STUN_CLASS(type) \
  	((type >> 7 | type >> 4) & 0x3)
  
  
  #define STUN_METHOD(type) \
  	((type&0x3e00)>>2 | (type&0x00e0)>>1 | (type&0x000f))
  
  
  struct stun_hdr {
  	uint16_t type;               /**< Message type   */
  	uint16_t len;                /**< Payload length */
  	uint32_t cookie;             /**< Magic cookie   */
  	uint8_t tid[STUN_TID_SIZE];  /**< Transaction ID */
  };
  
  
  struct stun {
  	struct list ctl;
  	struct stun_conf conf;
  	stun_ind_h *indh;
  	void *arg;
  };
  
  int stun_hdr_encode(struct mbuf *mb, const struct stun_hdr *hdr);
  int stun_hdr_decode(struct mbuf *mb, struct stun_hdr *hdr);
  
  int stun_attr_encode(struct mbuf *mb, uint16_t type, const void *v,
  		     const uint8_t *tid, uint8_t padding);
  int stun_attr_decode(struct stun_attr **attrp, struct mbuf *mb,
  		     const uint8_t *tid, struct stun_unknown_attr *ua);
  void stun_attr_dump(const struct stun_attr *a);
  
  int  stun_addr_encode(struct mbuf *mb, const struct sa *addr,
  		      const uint8_t *tid);
  int  stun_addr_decode(struct mbuf *mb, struct sa *addr, const uint8_t *tid);
  
  int stun_ctrans_request(struct stun_ctrans **ctp, struct stun *stun, int proto,
  			void *sock, const struct sa *dst, struct mbuf *mb,
  			const uint8_t tid[], uint16_t met, const uint8_t *key,
  			size_t keylen, stun_resp_h *resph, void *arg);
  void stun_ctrans_close(struct stun *stun);
  int  stun_ctrans_debug(struct re_printf *pf, const struct stun *stun);
  