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/p2p/base/stun.h" 32 #include "webrtc/base/asyncudpsocket.h" 33 #include "webrtc/base/scoped_ptr.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(rtc::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 rtc::AsyncPacketSocket* socket, const char* buf, size_t size, 50 const rtc::SocketAddress& remote_addr, 51 const rtc::PacketTime& packet_time); 52 53 // Handlers for the different types of STUN/TURN requests: 54 void OnBindingRequest(StunMessage* msg, 55 const rtc::SocketAddress& addr); 56 void OnAllocateRequest(StunMessage* msg, 57 const rtc::SocketAddress& addr); 58 void OnSharedSecretRequest(StunMessage* msg, 59 const rtc::SocketAddress& addr); 60 void OnSendRequest(StunMessage* msg, 61 const rtc::SocketAddress& addr); 62 63 // Sends an error response to the given message back to the user. 64 void SendErrorResponse( 65 const StunMessage& msg, const rtc::SocketAddress& addr, 66 int error_code, const char* error_desc); 67 68 // Sends the given message to the appropriate destination. 69 void SendResponse(const StunMessage& msg, 70 const rtc::SocketAddress& addr); 71 72 private: 73 rtc::scoped_ptr<rtc::AsyncUDPSocket> socket_; 74 }; 75 76 } // namespace cricket 77 78 #endif // TALK_P2P_BASE_STUNSERVER_H_ 79