text: /**
   * @file libnatpmp.h Interface to NAT-PMP Client library
   *
   * Copyright (C) 2010 Creytiv.com
   */
  
  
  enum {
  	NATPMP_VERSION =    0,
  	NATPMP_PORT    = 5351,
  };
  
  enum natpmp_op {
  	NATPMP_OP_EXTERNAL    = 0,
  	NATPMP_OP_MAPPING_UDP = 1,
  	NATPMP_OP_MAPPING_TCP = 2,
  };
  
  enum natpmp_result {
  	NATPMP_SUCCESS          = 0,
  	NATPMP_UNSUP_VERSION    = 1,
  	NATPMP_REFUSED          = 2,
  	NATPMP_NETWORK_FAILURE  = 3,
  	NATPMP_OUT_OF_RESOURCES = 4,
  	NATPMP_UNSUP_OPCODE     = 5
  };
  
  struct natpmp_resp {
  	uint8_t vers;
  	uint8_t op;
  	uint16_t result;
  	uint32_t epoch;
  
  	union {
  		uint32_t ext_addr;
  		struct {
  			uint16_t int_port;
  			uint16_t ext_port;
  			uint32_t lifetime;
  		} map;
  	} u;
  };
  
  struct natpmp_req;
  
  typedef void (natpmp_resp_h)(int err, const struct natpmp_resp *resp,
  			     void *arg);
  
  int natpmp_external_request(struct natpmp_req **npp, const struct sa *srv,
  			    natpmp_resp_h *h, void *arg);
  int natpmp_mapping_request(struct natpmp_req **natpmpp, const struct sa *srv,
  			   uint16_t int_port, uint16_t ext_port,
  			   uint32_t lifetime, natpmp_resp_h *resph, void *arg);
  