Home | History | Annotate | Download | only in src
      1 /*
      2 Copyright (c) 2013, The Linux Foundation. All rights reserved.
      3 
      4 Redistribution and use in source and binary forms, with or without
      5 modification, are permitted provided that the following conditions are
      6 met:
      7     * Redistributions of source code must retain the above copyright
      8       notice, this list of conditions and the following disclaimer.
      9     * Redistributions in binary form must reproduce the above
     10       copyright notice, this list of conditions and the following
     11       disclaimer in the documentation and/or other materials provided
     12       with the distribution.
     13     * Neither the name of The Linux Foundation nor the names of its
     14       contributors may be used to endorse or promote products derived
     15       from this software without specific prior written permission.
     16 
     17 THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
     18 WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     19 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
     20 ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
     21 BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     22 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     23 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
     24 BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     25 WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
     26 OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
     27 IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     28 */
     29 
     30 #include "ipa_nat_drv.h"
     31 #include "ipa_nat_drvi.h"
     32 
     33 /**
     34  * ipa_nat_add_ipv4_tbl() - create ipv4 nat table
     35  * @public_ip_addr: [in] public ipv4 address
     36  * @number_of_entries: [in]  number of nat entries
     37  * @table_handle: [out] Handle of new ipv4 nat table
     38  *
     39  * To create new ipv4 nat table
     40  *
     41  * Returns:	0  On Success, negative on failure
     42  */
     43 int ipa_nat_add_ipv4_tbl(uint32_t public_ip_addr,
     44 		uint16_t number_of_entries,
     45 		uint32_t *tbl_hdl)
     46 {
     47   int ret;
     48 
     49   if (NULL == tbl_hdl || 0 == number_of_entries) {
     50     IPAERR("Invalid parameters \n");
     51     return -EINVAL;
     52   }
     53 
     54   ret = ipa_nati_add_ipv4_tbl(public_ip_addr,
     55 								number_of_entries,
     56 								tbl_hdl);
     57   if (ret != 0) {
     58     IPAERR("unable to add table \n");
     59     return -EINVAL;
     60   }
     61   IPADBG("Returning table handle 0x%x\n", *tbl_hdl);
     62 
     63   return ret;
     64 } /* __ipa_nat_add_ipv4_tbl() */
     65 
     66 /**
     67  * ipa_nat_del_ipv4_tbl() - delete ipv4 table
     68  * @table_handle: [in] Handle of ipv4 nat table
     69  *
     70  * To delete given ipv4 nat table
     71  *
     72  * Returns:	0  On Success, negative on failure
     73  */
     74 int ipa_nat_del_ipv4_tbl(uint32_t tbl_hdl)
     75 {
     76   if (IPA_NAT_INVALID_NAT_ENTRY == tbl_hdl ||
     77       tbl_hdl > IPA_NAT_MAX_IP4_TBLS) {
     78     IPAERR("invalid table handle passed \n");
     79     return -EINVAL;
     80   }
     81   IPADBG("Passed Table Handle: 0x%x\n", tbl_hdl);
     82 
     83   return ipa_nati_del_ipv4_table(tbl_hdl);
     84 }
     85 
     86 /**
     87  * ipa_nat_add_ipv4_rule() - to insert new ipv4 rule
     88  * @table_handle: [in] handle of ipv4 nat table
     89  * @rule: [in]  Pointer to new rule
     90  * @rule_handle: [out] Return the handle to rule
     91  *
     92  * To insert new ipv4 nat rule into ipv4 nat table
     93  *
     94  * Returns:	0  On Success, negative on failure
     95  */
     96 int ipa_nat_add_ipv4_rule(uint32_t tbl_hdl,
     97 		const ipa_nat_ipv4_rule *clnt_rule,
     98 		uint32_t *rule_hdl)
     99 {
    100   int result = -EINVAL;
    101 
    102   if (IPA_NAT_INVALID_NAT_ENTRY == tbl_hdl ||
    103       tbl_hdl > IPA_NAT_MAX_IP4_TBLS || NULL == rule_hdl ||
    104       NULL == clnt_rule) {
    105     IPAERR("invalide table handle passed \n");
    106     return result;
    107   }
    108   IPADBG("Passed Table handle: 0x%x\n", tbl_hdl);
    109 
    110   if (ipa_nati_add_ipv4_rule(tbl_hdl, clnt_rule, rule_hdl) != 0) {
    111 		return result;
    112 	}
    113 
    114   IPADBG("returning rule handle 0x%x\n", *rule_hdl);
    115   return 0;
    116 }
    117 
    118 
    119 /**
    120  * ipa_nat_del_ipv4_rule() - to delete ipv4 nat rule
    121  * @table_handle: [in] handle of ipv4 nat table
    122  * @rule_handle: [in] ipv4 nat rule handle
    123  *
    124  * To insert new ipv4 nat rule into ipv4 nat table
    125  *
    126  * Returns:	0  On Success, negative on failure
    127  */
    128 int ipa_nat_del_ipv4_rule(uint32_t tbl_hdl,
    129 		uint32_t rule_hdl)
    130 {
    131   int result = -EINVAL;
    132 
    133   if (IPA_NAT_INVALID_NAT_ENTRY == tbl_hdl ||
    134       IPA_NAT_INVALID_NAT_ENTRY == rule_hdl) {
    135     IPAERR("invalide parameters\n");
    136     return result;
    137   }
    138   IPADBG("Passed Table: 0x%x and rule handle 0x%x\n", tbl_hdl, rule_hdl);
    139 
    140   result = ipa_nati_del_ipv4_rule(tbl_hdl, rule_hdl);
    141   if (result) {
    142     IPAERR("unable to delete rule from hw \n");
    143     return result;
    144   }
    145 
    146   return 0;
    147 }
    148 
    149 /**
    150  * ipa_nat_query_timestamp() - to query timestamp
    151  * @table_handle: [in] handle of ipv4 nat table
    152  * @rule_handle: [in] ipv4 nat rule handle
    153  * @time_stamp: [out] time stamp of rule
    154  *
    155  * To retrieve the timestamp that lastly the
    156  * nat rule was accessed
    157  *
    158  * Returns:	0  On Success, negative on failure
    159  */
    160 int ipa_nat_query_timestamp(uint32_t  tbl_hdl,
    161 		uint32_t  rule_hdl,
    162 		uint32_t  *time_stamp)
    163 {
    164 
    165   if (0 == tbl_hdl || tbl_hdl > IPA_NAT_MAX_IP4_TBLS ||
    166       NULL == time_stamp) {
    167     IPAERR("invalid parameters passed \n");
    168     return -EINVAL;
    169   }
    170   IPADBG("Passed Table: 0x%x and rule handle 0x%x\n", tbl_hdl, rule_hdl);
    171 
    172   return ipa_nati_query_timestamp(tbl_hdl, rule_hdl, time_stamp);
    173 }
    174 
    175 
    176