/*
 *  Copyright (c) 2009 Mindspeed Technologies, Inc.
 *
 *  This program is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU General Public License
 *  as published by the Free Software Foundation; either version 2
 *  of the License, or (at your option) any later version.

 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.

 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 *
 *
 */


#include "module_socket.h"


PSockEntry SOCKET_bind(U16 socketID, PVOID owner, U16 owner_type)__attribute__ ((noinline));
PSockEntry SOCKET_unbind(U16 socketID) __attribute__ ((noinline));

void SOCKET4_free_entries(void);
void SOCKET4_delete_route(PSockEntry pSocket);

int SOCKET4_HandleIP_Socket_Open (U16 *p, U16 Length);
int SOCKET4_HandleIP_Socket_Update (U16 *p, U16 Length);
int SOCKET4_HandleIP_Socket_Close (U16 *p, U16 Length);

void SOCKET6_free_entries(void);
void SOCKET6_delete_route(PSock6Entry pSocket);

int SOCKET6_HandleIP_Socket_Open (U16 *p, U16 Length);
int SOCKET6_HandleIP_Socket_Update (U16 *p, U16 Length);
int SOCKET6_HandleIP_Socket_Close (U16 *p, U16 Length);




