1 /* 2 * libjingle 3 * Copyright 2004--2005, Google Inc. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright notice, 9 * this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright notice, 11 * this list of conditions and the following disclaimer in the documentation 12 * and/or other materials provided with the distribution. 13 * 3. The name of the author may not be used to endorse or promote products 14 * derived from this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 19 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 22 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 24 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 */ 27 28 #ifndef TALK_P2P_BASE_STUNSERVER_H_ 29 #define TALK_P2P_BASE_STUNSERVER_H_ 30 31 #include "talk/base/asyncudpsocket.h" 32 #include "talk/base/scoped_ptr.h" 33 #include "talk/p2p/base/stun.h" 34 35 namespace cricket { 36 37 const int STUN_SERVER_PORT = 3478; 38 39 class StunServer : public sigslot::has_slots<> { 40 public: 41 // Creates a STUN server, which will listen on the given socket. 42 explicit StunServer(talk_base::AsyncUDPSocket* socket); 43 // Removes the STUN server from the socket and deletes the socket. 44 ~StunServer(); 45 46 protected: 47 // Slot for AsyncSocket.PacketRead: 48 void OnPacket( 49 talk_base::AsyncPacketSocket* socket, const char* buf, size_t size, 50 const talk_base::SocketAddress& remote_addr); 51 52 // Handlers for the different types of STUN/TURN requests: 53 void OnBindingRequest(StunMessage* msg, 54 const talk_base::SocketAddress& addr); 55 void OnAllocateRequest(StunMessage* msg, 56 const talk_base::SocketAddress& addr); 57 void OnSharedSecretRequest(StunMessage* msg, 58 const talk_base::SocketAddress& addr); 59 void OnSendRequest(StunMessage* msg, 60 const talk_base::SocketAddress& addr); 61 62 // Sends an error response to the given message back to the user. 63 void SendErrorResponse( 64 const StunMessage& msg, const talk_base::SocketAddress& addr, 65 int error_code, const char* error_desc); 66 67 // Sends the given message to the appropriate destination. 68 void SendResponse(const StunMessage& msg, 69 const talk_base::SocketAddress& addr); 70 71 private: 72 talk_base::scoped_ptr<talk_base::AsyncUDPSocket> socket_; 73 }; 74 75 } // namespace cricket 76 77 #endif // TALK_P2P_BASE_STUNSERVER_H_ 78