| /* |
| * Copyright (c) 2011 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_ipv4.h" |
| #include "module_ipv6.h" |
| #include "module_pppoe.h" |
| #include "module_vlan.h" |
| #include "module_hidrv.h" |
| #include "module_tx.h" |
| #include "module_Rx.h" |
| #include "module_stat.h" |
| #include "module_rtp_relay.h" |
| #include "module_socket.h" |
| #include "module_natpt.h" |
| #include "module_qm.h" |
| #include "module_mc4.h" |
| #include "module_mc6.h" |
| #include "icc.h" |
| #include "module_ipsec.h" |
| #include "module_bridge.h" |
| #include "module_tunnel.h" |
| #include "module_wifi.h" |
| #include "module_capture.h" |
| #include "module_l2tp.h" |
| |
| void __pfe_ctrl_cmd_handler(U16 fcode, U16 length, U16 *payload, U16 *rlen, U16 *rbuf) |
| { |
| CmdProc cmdproc; |
| U32 eventid; |
| |
| eventid = FCODE_TO_EVENT(fcode); |
| cmdproc = gCmdProcTable[eventid]; |
| |
| if (cmdproc) |
| { |
| memcpy(rbuf, payload, length); |
| *rlen = (*cmdproc)(fcode, length, rbuf); |
| if (*rlen == 0) |
| { |
| rbuf[0] = NO_ERR; |
| *rlen = 2; |
| } |
| } |
| else |
| { |
| rbuf[0] = ERR_UNKNOWN_COMMAND; |
| *rlen = 2; |
| } |
| } |
| |
| |
| int __pfe_ctrl_init(void) |
| { |
| int rc; |
| |
| rc = tx_init(); |
| if (rc < 0) |
| goto err_tx; |
| |
| rc = rx_init(); |
| if (rc < 0) |
| goto err_rx; |
| |
| rc = pppoe_init(); |
| if (rc < 0) |
| goto err_pppoe; |
| |
| rc = vlan_init(); |
| if (rc < 0) |
| goto err_vlan; |
| |
| rc = ipv4_init(); |
| if (rc < 0) |
| goto err_ipv4; |
| |
| rc = ipv6_init(); |
| if (rc < 0) |
| goto err_ipv6; |
| |
| rc = mc4_init(); |
| if (rc < 0) |
| goto err_mc4; |
| |
| rc = mc6_init(); |
| if (rc < 0) |
| goto err_mc6; |
| |
| #ifdef CFG_STATS |
| rc = statistics_init(); |
| if (rc < 0) |
| goto err_statistics; |
| #endif |
| |
| rc = socket_init(); |
| if (rc < 0) |
| goto err_socket; |
| |
| rc = rtp_relay_init(); |
| if (rc < 0) |
| goto err_rtp_relay; |
| |
| rc = natpt_init(); |
| if (rc < 0) |
| goto err_natpt; |
| |
| rc = qm_init(); |
| if (rc < 0) |
| goto err_qm; |
| |
| rc = icc_control_init(); |
| if (rc < 0) |
| goto err_icc; |
| |
| rc = bridge_init(); |
| if (rc < 0) |
| goto err_bridge; |
| |
| rc = ipsec_init(); |
| if (rc < 0) |
| goto err_ipsec; |
| |
| rc = tunnel_init(); |
| if (rc < 0) |
| goto err_tunnel; |
| |
| #ifdef CFG_WIFI_OFFLOAD |
| rc = wifi_init(); |
| if (rc < 0) |
| goto err_wifi; |
| #endif |
| #ifdef CFG_PCAP |
| rc = pktcap_init(); |
| if (rc < 0) |
| goto err_pcap; |
| #endif |
| rc = l2tp_init(); |
| if (rc < 0) |
| goto err_l2tp; |
| return 0; |
| err_l2tp: |
| #ifdef CFG_PCAP |
| pktcap_exit(); |
| err_pcap: |
| #endif |
| #ifdef CFG_WIFI_OFFLOAD |
| wifi_exit(); |
| err_wifi: |
| #endif |
| tunnel_exit(); |
| |
| err_tunnel: |
| ipsec_exit(); |
| |
| err_ipsec: |
| bridge_exit(); |
| |
| err_bridge: |
| icc_control_exit(); |
| |
| err_icc: |
| qm_exit(); |
| |
| err_qm: |
| natpt_exit(); |
| |
| err_natpt: |
| rtp_relay_exit(); |
| |
| err_rtp_relay: |
| socket_exit(); |
| |
| err_socket: |
| #ifdef CFG_STATS |
| statistics_exit(); |
| |
| err_statistics: |
| #endif |
| mc6_exit(); |
| |
| err_mc6: |
| mc4_exit(); |
| |
| err_mc4: |
| ipv6_exit(); |
| |
| err_ipv6: |
| ipv4_exit(); |
| |
| err_ipv4: |
| vlan_exit(); |
| |
| err_vlan: |
| pppoe_exit(); |
| |
| err_pppoe: |
| rx_exit(); |
| |
| err_rx: |
| tx_exit(); |
| |
| err_tx: |
| return rc; |
| } |
| |
| |
| void __pfe_ctrl_exit(void) |
| { |
| #ifdef CFG_PCAP |
| pktcap_exit(); |
| #endif |
| |
| #ifdef CFG_WIFI_OFFLOAD |
| wifi_exit(); |
| #endif |
| |
| tunnel_exit(); |
| |
| ipsec_exit(); |
| |
| bridge_exit(); |
| |
| icc_control_exit(); |
| |
| qm_exit(); |
| |
| /* natpt_exit() and rtp_relay_exit() should be called before socket_exit() */ |
| natpt_exit(); |
| |
| rtp_relay_exit(); |
| |
| socket_exit(); |
| |
| #ifdef CFG_STATS |
| statistics_exit(); |
| #endif |
| |
| mc6_exit(); |
| |
| mc4_exit(); |
| |
| ipv6_exit(); |
| |
| ipv4_exit(); |
| |
| vlan_exit(); |
| |
| pppoe_exit(); |
| |
| rx_exit(); |
| |
| tx_exit(); |
| } |