| 1 | /* $Id: miniupnpc.h,v 1.62 2023/06/11 23:25:46 nanard Exp $ */ | 
|---|
| 2 | /* vim: tabstop=4 shiftwidth=4 noexpandtab | 
|---|
| 3 | * Project: miniupnp | 
|---|
| 4 | * http://miniupnp.free.fr/ or https://miniupnp.tuxfamily.org/ | 
|---|
| 5 | * Author: Thomas Bernard | 
|---|
| 6 | * Copyright (c) 2005-2022 Thomas Bernard | 
|---|
| 7 | * This software is subjects to the conditions detailed | 
|---|
| 8 | * in the LICENCE file provided within this distribution */ | 
|---|
| 9 | #ifndef MINIUPNPC_H_INCLUDED | 
|---|
| 10 | #define MINIUPNPC_H_INCLUDED | 
|---|
| 11 |  | 
|---|
| 12 | #include "miniupnpc_declspec.h" | 
|---|
| 13 | #include "igd_desc_parse.h" | 
|---|
| 14 | #include "upnpdev.h" | 
|---|
| 15 |  | 
|---|
| 16 | /* error codes : */ | 
|---|
| 17 | #define UPNPDISCOVER_SUCCESS (0) | 
|---|
| 18 | #define UPNPDISCOVER_UNKNOWN_ERROR (-1) | 
|---|
| 19 | #define UPNPDISCOVER_SOCKET_ERROR (-101) | 
|---|
| 20 | #define UPNPDISCOVER_MEMORY_ERROR (-102) | 
|---|
| 21 |  | 
|---|
| 22 | /* versions : */ | 
|---|
| 23 | #define MINIUPNPC_VERSION	"2.2.5" | 
|---|
| 24 | #define MINIUPNPC_API_VERSION	17 | 
|---|
| 25 |  | 
|---|
| 26 | /* Source port: | 
|---|
| 27 | Using "1" as an alias for 1900 for backwards compatibility | 
|---|
| 28 | (presuming one would have used that for the "sameport" parameter) */ | 
|---|
| 29 | #define UPNP_LOCAL_PORT_ANY     0 | 
|---|
| 30 | #define UPNP_LOCAL_PORT_SAME    1 | 
|---|
| 31 |  | 
|---|
| 32 | #ifdef __cplusplus | 
|---|
| 33 | extern "C"{ | 
|---|
| 34 | #endif | 
|---|
| 35 |  | 
|---|
| 36 | /* Structures definitions : */ | 
|---|
| 37 | struct UPNParg { const char * elt; const char * val; }; | 
|---|
| 38 |  | 
|---|
| 39 | char * | 
|---|
| 40 | simpleUPnPcommand(int, const char *, const char *, | 
|---|
| 41 | const char *, struct UPNParg *, | 
|---|
| 42 | int *); | 
|---|
| 43 |  | 
|---|
| 44 | /* upnpDiscover() | 
|---|
| 45 | * discover UPnP devices on the network. | 
|---|
| 46 | * The discovered devices are returned as a chained list. | 
|---|
| 47 | * It is up to the caller to free the list with freeUPNPDevlist(). | 
|---|
| 48 | * delay (in millisecond) is the maximum time for waiting any device | 
|---|
| 49 | * response. | 
|---|
| 50 | * If available, device list will be obtained from MiniSSDPd. | 
|---|
| 51 | * Default path for minissdpd socket will be used if minissdpdsock argument | 
|---|
| 52 | * is NULL. | 
|---|
| 53 | * If multicastif is not NULL, it will be used instead of the default | 
|---|
| 54 | * multicast interface for sending SSDP discover packets. | 
|---|
| 55 | * If localport is set to UPNP_LOCAL_PORT_SAME(1) SSDP packets will be sent | 
|---|
| 56 | * from the source port 1900 (same as destination port), if set to | 
|---|
| 57 | * UPNP_LOCAL_PORT_ANY(0) system assign a source port, any other value will | 
|---|
| 58 | * be attempted as the source port. | 
|---|
| 59 | * "searchalltypes" parameter is useful when searching several types, | 
|---|
| 60 | * if 0, the discovery will stop with the first type returning results. | 
|---|
| 61 | * TTL should default to 2. */ | 
|---|
| 62 | MINIUPNP_LIBSPEC struct UPNPDev * | 
|---|
| 63 | upnpDiscover(int delay, const char * multicastif, | 
|---|
| 64 | const char * minissdpdsock, int localport, | 
|---|
| 65 | int ipv6, unsigned char ttl, | 
|---|
| 66 | int * error); | 
|---|
| 67 |  | 
|---|
| 68 | MINIUPNP_LIBSPEC struct UPNPDev * | 
|---|
| 69 | upnpDiscoverAll(int delay, const char * multicastif, | 
|---|
| 70 | const char * minissdpdsock, int localport, | 
|---|
| 71 | int ipv6, unsigned char ttl, | 
|---|
| 72 | int * error); | 
|---|
| 73 |  | 
|---|
| 74 | MINIUPNP_LIBSPEC struct UPNPDev * | 
|---|
| 75 | upnpDiscoverDevice(const char * device, int delay, const char * multicastif, | 
|---|
| 76 | const char * minissdpdsock, int localport, | 
|---|
| 77 | int ipv6, unsigned char ttl, | 
|---|
| 78 | int * error); | 
|---|
| 79 |  | 
|---|
| 80 | MINIUPNP_LIBSPEC struct UPNPDev * | 
|---|
| 81 | upnpDiscoverDevices(const char * const deviceTypes[], | 
|---|
| 82 | int delay, const char * multicastif, | 
|---|
| 83 | const char * minissdpdsock, int localport, | 
|---|
| 84 | int ipv6, unsigned char ttl, | 
|---|
| 85 | int * error, | 
|---|
| 86 | int searchalltypes); | 
|---|
| 87 |  | 
|---|
| 88 | /* parserootdesc() : | 
|---|
| 89 | * parse root XML description of a UPnP device and fill the IGDdatas | 
|---|
| 90 | * structure. */ | 
|---|
| 91 | MINIUPNP_LIBSPEC void parserootdesc(const char *, int, struct IGDdatas *); | 
|---|
| 92 |  | 
|---|
| 93 | /* structure used to get fast access to urls | 
|---|
| 94 | * controlURL: controlURL of the WANIPConnection | 
|---|
| 95 | * ipcondescURL: url of the description of the WANIPConnection | 
|---|
| 96 | * controlURL_CIF: controlURL of the WANCommonInterfaceConfig | 
|---|
| 97 | * controlURL_6FC: controlURL of the WANIPv6FirewallControl | 
|---|
| 98 | */ | 
|---|
| 99 | struct UPNPUrls { | 
|---|
| 100 | char * controlURL; | 
|---|
| 101 | char * ipcondescURL; | 
|---|
| 102 | char * controlURL_CIF; | 
|---|
| 103 | char * controlURL_6FC; | 
|---|
| 104 | char * rootdescURL; | 
|---|
| 105 | }; | 
|---|
| 106 |  | 
|---|
| 107 | /* UPNP_GetValidIGD() : | 
|---|
| 108 | * return values : | 
|---|
| 109 | *     0 = NO IGD found | 
|---|
| 110 | *     1 = A valid connected IGD has been found | 
|---|
| 111 | *     2 = A valid IGD has been found but it reported as | 
|---|
| 112 | *         not connected | 
|---|
| 113 | *     3 = an UPnP device has been found but was not recognized as an IGD | 
|---|
| 114 | * | 
|---|
| 115 | * In any non zero return case, the urls and data structures | 
|---|
| 116 | * passed as parameters are set. Donc forget to call FreeUPNPUrls(urls) to | 
|---|
| 117 | * free allocated memory. | 
|---|
| 118 | */ | 
|---|
| 119 | MINIUPNP_LIBSPEC int | 
|---|
| 120 | UPNP_GetValidIGD(struct UPNPDev * devlist, | 
|---|
| 121 | struct UPNPUrls * urls, | 
|---|
| 122 | struct IGDdatas * data, | 
|---|
| 123 | char * lanaddr, int lanaddrlen); | 
|---|
| 124 |  | 
|---|
| 125 | /* UPNP_GetIGDFromUrl() | 
|---|
| 126 | * Used when skipping the discovery process. | 
|---|
| 127 | * When succeding, urls, data, and lanaddr arguments are set. | 
|---|
| 128 | * return value : | 
|---|
| 129 | *   0 - Not ok | 
|---|
| 130 | *   1 - OK */ | 
|---|
| 131 | MINIUPNP_LIBSPEC int | 
|---|
| 132 | UPNP_GetIGDFromUrl(const char * rootdescurl, | 
|---|
| 133 | struct UPNPUrls * urls, | 
|---|
| 134 | struct IGDdatas * data, | 
|---|
| 135 | char * lanaddr, int lanaddrlen); | 
|---|
| 136 |  | 
|---|
| 137 | MINIUPNP_LIBSPEC void | 
|---|
| 138 | GetUPNPUrls(struct UPNPUrls *, struct IGDdatas *, | 
|---|
| 139 | const char *, unsigned int); | 
|---|
| 140 |  | 
|---|
| 141 | MINIUPNP_LIBSPEC void | 
|---|
| 142 | FreeUPNPUrls(struct UPNPUrls *); | 
|---|
| 143 |  | 
|---|
| 144 | /* return 0 or 1 */ | 
|---|
| 145 | MINIUPNP_LIBSPEC int UPNPIGD_IsConnected(struct UPNPUrls *, struct IGDdatas *); | 
|---|
| 146 |  | 
|---|
| 147 |  | 
|---|
| 148 | #ifdef __cplusplus | 
|---|
| 149 | } | 
|---|
| 150 | #endif | 
|---|
| 151 |  | 
|---|
| 152 | #endif | 
|---|
| 153 |  | 
|---|
| 154 |  | 
|---|