diff --git a/config/LICENSE b/config/LICENSE
deleted file mode 100644
index ecbc059..0000000
--- a/config/LICENSE
+++ /dev/null
@@ -1,339 +0,0 @@
-                    GNU GENERAL PUBLIC LICENSE
-                       Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-                            Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-the GNU Lesser General Public License instead.)  You can apply it to
-your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
-  To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  You must make sure that they, too, receive or can get the
-source code.  And you must show them these terms so they know their
-rights.
-
-  We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-  Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary.  To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-
-                    GNU GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License.  The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language.  (Hereinafter, translation is included without limitation in
-the term "modification".)  Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-  1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
-  2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) You must cause the modified files to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    b) You must cause any work that you distribute or publish, that in
-    whole or in part contains or is derived from the Program or any
-    part thereof, to be licensed as a whole at no charge to all third
-    parties under the terms of this License.
-
-    c) If the modified program normally reads commands interactively
-    when run, you must cause it, when started running for such
-    interactive use in the most ordinary way, to print or display an
-    announcement including an appropriate copyright notice and a
-    notice that there is no warranty (or else, saying that you provide
-    a warranty) and that users may redistribute the program under
-    these conditions, and telling the user how to view a copy of this
-    License.  (Exception: if the Program itself is interactive but
-    does not normally print such an announcement, your work based on
-    the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-    a) Accompany it with the complete corresponding machine-readable
-    source code, which must be distributed under the terms of Sections
-    1 and 2 above on a medium customarily used for software interchange; or,
-
-    b) Accompany it with a written offer, valid for at least three
-    years, to give any third party, for a charge no more than your
-    cost of physically performing source distribution, a complete
-    machine-readable copy of the corresponding source code, to be
-    distributed under the terms of Sections 1 and 2 above on a medium
-    customarily used for software interchange; or,
-
-    c) Accompany it with the information you received as to the offer
-    to distribute corresponding source code.  (This alternative is
-    allowed only for noncommercial distribution and only if you
-    received the program in object code or executable form with such
-    an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it.  For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable.  However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License.  Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-  5. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Program or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-  6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
-  7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded.  In such case, this License incorporates
-the limitation as if written in the body of this License.
-
-  9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation.  If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-  10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission.  For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this.  Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
-                            NO WARRANTY
-
-  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
-  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
-                     END OF TERMS AND CONDITIONS
-
-            How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    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.
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
-    Gnomovision version 69, Copyright (C) year name of author
-    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-  `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-  <signature of Ty Coon>, 1 April 1989
-  Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs.  If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library.  If this is what you want to do, use the GNU Lesser General
-Public License instead of this License.
\ No newline at end of file
diff --git a/config/NOTICE b/config/NOTICE
deleted file mode 100644
index 5a30e9a..0000000
--- a/config/NOTICE
+++ /dev/null
@@ -1,10 +0,0 @@
-Copyright (c) 2021 The Linux Foundation. All rights reserved.
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License version 2 and
-only version 2 as published by the Free Software Foundation.
-
-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.
\ No newline at end of file
diff --git a/define_modules.bzl b/define_modules.bzl
index 84b89ef..70bac62 100644
--- a/define_modules.bzl
+++ b/define_modules.bzl
@@ -14,7 +14,7 @@
     ipam_local_defines = []
     if target != "niobe":
              ipam_deps_list.append(
-              "//vendor/qcom/opensource/datarmnet-ext/mem:{}_rmnet_mem".format(kernel_build_variant),
+              "//vendor/qcom/opensource/monaco/datarmnet-ext/mem:{}_rmnet_mem".format(kernel_build_variant),
              )
              ipam_local_defines.append(
               "CONFIG_IPA_RMNET_MEM=y".format(include_base),
diff --git a/drivers/LICENSE b/drivers/LICENSE
deleted file mode 100644
index ecbc059..0000000
--- a/drivers/LICENSE
+++ /dev/null
@@ -1,339 +0,0 @@
-                    GNU GENERAL PUBLIC LICENSE
-                       Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-                            Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-the GNU Lesser General Public License instead.)  You can apply it to
-your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
-  To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  You must make sure that they, too, receive or can get the
-source code.  And you must show them these terms so they know their
-rights.
-
-  We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-  Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary.  To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-
-                    GNU GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License.  The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language.  (Hereinafter, translation is included without limitation in
-the term "modification".)  Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-  1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
-  2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) You must cause the modified files to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    b) You must cause any work that you distribute or publish, that in
-    whole or in part contains or is derived from the Program or any
-    part thereof, to be licensed as a whole at no charge to all third
-    parties under the terms of this License.
-
-    c) If the modified program normally reads commands interactively
-    when run, you must cause it, when started running for such
-    interactive use in the most ordinary way, to print or display an
-    announcement including an appropriate copyright notice and a
-    notice that there is no warranty (or else, saying that you provide
-    a warranty) and that users may redistribute the program under
-    these conditions, and telling the user how to view a copy of this
-    License.  (Exception: if the Program itself is interactive but
-    does not normally print such an announcement, your work based on
-    the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-    a) Accompany it with the complete corresponding machine-readable
-    source code, which must be distributed under the terms of Sections
-    1 and 2 above on a medium customarily used for software interchange; or,
-
-    b) Accompany it with a written offer, valid for at least three
-    years, to give any third party, for a charge no more than your
-    cost of physically performing source distribution, a complete
-    machine-readable copy of the corresponding source code, to be
-    distributed under the terms of Sections 1 and 2 above on a medium
-    customarily used for software interchange; or,
-
-    c) Accompany it with the information you received as to the offer
-    to distribute corresponding source code.  (This alternative is
-    allowed only for noncommercial distribution and only if you
-    received the program in object code or executable form with such
-    an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it.  For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable.  However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License.  Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-  5. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Program or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-  6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
-  7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded.  In such case, this License incorporates
-the limitation as if written in the body of this License.
-
-  9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation.  If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-  10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission.  For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this.  Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
-                            NO WARRANTY
-
-  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
-  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
-                     END OF TERMS AND CONDITIONS
-
-            How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    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.
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
-    Gnomovision version 69, Copyright (C) year name of author
-    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-  `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-  <signature of Ty Coon>, 1 April 1989
-  Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs.  If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library.  If this is what you want to do, use the GNU Lesser General
-Public License instead of this License.
\ No newline at end of file
diff --git a/drivers/NOTICE b/drivers/NOTICE
deleted file mode 100644
index 5a30e9a..0000000
--- a/drivers/NOTICE
+++ /dev/null
@@ -1,10 +0,0 @@
-Copyright (c) 2021 The Linux Foundation. All rights reserved.
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License version 2 and
-only version 2 as published by the Free Software Foundation.
-
-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.
\ No newline at end of file
diff --git a/drivers/platform/msm/gsi/gsi_trace.h b/drivers/platform/msm/gsi/gsi_trace.h
index 3b481fe..363e1fb 100644
--- a/drivers/platform/msm/gsi/gsi_trace.h
+++ b/drivers/platform/msm/gsi/gsi_trace.h
@@ -49,7 +49,7 @@
 /* This part must be outside protection */
 #ifndef GSI_TRACE_INCLUDE_PATH
 #ifdef CONFIG_IPA_VENDOR_DLKM
-#define GSI_TRACE_INCLUDE_PATH ../../../../vendor/qcom/opensource/dataipa/drivers/platform/msm/gsi
+#define GSI_TRACE_INCLUDE_PATH ../../../../../vendor/qcom/opensource/monaco/dataipa/drivers/platform/msm/gsi
 #else
 #define GSI_TRACE_INCLUDE_PATH ../../techpack/dataipa/drivers/platform/msm/gsi
 #endif
diff --git a/drivers/platform/msm/ipa/ipa_clients/rndis_ipa_trace.h b/drivers/platform/msm/ipa/ipa_clients/rndis_ipa_trace.h
index 7eb499f..173c277 100644
--- a/drivers/platform/msm/ipa/ipa_clients/rndis_ipa_trace.h
+++ b/drivers/platform/msm/ipa/ipa_clients/rndis_ipa_trace.h
@@ -72,7 +72,7 @@
 /* This part must be outside protection */
 #ifndef RNDIS_TRACE_INCLUDE_PATH
 #ifdef CONFIG_IPA_VENDOR_DLKM
-#define RNDIS_TRACE_INCLUDE_PATH ../../../../vendor/qcom/opensource/dataipa/drivers/platform/msm/ipa/ipa_clients
+#define RNDIS_TRACE_INCLUDE_PATH ../../../../../vendor/qcom/opensource/monaco/dataipa/drivers/platform/msm/ipa/ipa_clients
 #else
 #define RNDIS_TRACE_INCLUDE_PATH ../../techpack/dataipa/drivers/platform/msm/ipa/ipa_clients
 #endif
diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_trace.h b/drivers/platform/msm/ipa/ipa_v3/ipa_trace.h
index 8507f79..59daacc 100644
--- a/drivers/platform/msm/ipa/ipa_v3/ipa_trace.h
+++ b/drivers/platform/msm/ipa/ipa_v3/ipa_trace.h
@@ -394,7 +394,7 @@
 /* This part must be outside protection */
 #ifndef IPA_TRACE_INCLUDE_PATH
 #ifdef CONFIG_IPA_VENDOR_DLKM
-#define IPA_TRACE_INCLUDE_PATH ../../../../vendor/qcom/opensource/dataipa/drivers/platform/msm/ipa/ipa_v3
+#define IPA_TRACE_INCLUDE_PATH ../../../../../vendor/qcom/opensource/monaco/dataipa/drivers/platform/msm/ipa/ipa_v3
 #else
 #define IPA_TRACE_INCLUDE_PATH ../../techpack/dataipa/drivers/platform/msm/ipa/ipa_v3
 #endif
diff --git a/ipanat/Android.bp b/ipanat/Android.bp
deleted file mode 100644
index c122824..0000000
--- a/ipanat/Android.bp
+++ /dev/null
@@ -1,28 +0,0 @@
-cc_library_shared {
-    name: "libipanat",
-
-    header_libs: ["device_kernel_headers"]+["qti_kernel_headers"]+["qti_ipa_kernel_headers"],
-
-    srcs: [
-        "src/ipa_nat_map.cpp",
-        "src/ipa_table.c",
-        "src/ipa_nat_statemach.c",
-        "src/ipa_nat_drvi.c",
-        "src/ipa_nat_drv.c",
-        "src/ipa_mem_descriptor.c",
-        "src/ipa_nat_utils.c",
-        "src/ipa_ipv6ct.c",
-    ],
-
-   shared_libs:
-        ["libcutils",
-        "libdl",
-        "libbase",
-        "libutils",
-    ],
-    export_include_dirs: ["inc"],
-    vendor: true,
-
-    cflags: ["-DDEBUG"] + ["-DFEATURE_IPA_ANDROID"] + ["-Wno-int-conversion"],
-
-}
diff --git a/ipanat/NOTICE b/ipanat/NOTICE
deleted file mode 100644
index b7f9f90..0000000
--- a/ipanat/NOTICE
+++ /dev/null
@@ -1,26 +0,0 @@
-Copyright (c) 2021 The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above
-      copyright notice, this list of conditions and the following
-      disclaimer in the documentation and/or other materials provided
-      with the distribution.
-    * Neither the name of The Linux Foundation nor the names of its
-      contributors may be used to endorse or promote products derived
-      from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
diff --git a/ipanat/inc/ipa_ipv6ct.h b/ipanat/inc/ipa_ipv6ct.h
deleted file mode 100644
index 7796d30..0000000
--- a/ipanat/inc/ipa_ipv6ct.h
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright (c) 2018, 2020 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#ifndef IPA_IPV6CT_H
-#define IPA_IPV6CT_H
-
-#include <stdint.h>
-#include <stdbool.h>
-#include <linux/msm_ipa.h>
-
-/**
- * enum ipa_ipv6_ct_direction_settings_type - direction filter settings
- *
- * IPA_IPV6CT_DIRECTION_DENY_ALL  - deny inbound and outbound
- * IPA_IPV6CT_DIRECTION_ALLOW_OUT - allow outbound and deny inbound
- * IPA_IPV6CT_DIRECTION_ALLOW_IN  - allow inbound and deny outbound
- * IPA_IPV6CT_DIRECTION_ALLOW_ALL - allow inbound and outbound
- */
-typedef enum
-{
-	IPA_IPV6CT_DIRECTION_DENY_ALL  = 0,
-	IPA_IPV6CT_DIRECTION_ALLOW_OUT = 1,
-	IPA_IPV6CT_DIRECTION_ALLOW_IN  = 2,
-	IPA_IPV6CT_DIRECTION_ALLOW_ALL = 3
-} ipa_ipv6_ct_direction_settings_type;
-
-/**
- * struct ipa_ipv6ct_rule - To hold IPv6CT rule
- * @src_ipv6_lsb: source IPv6 address LSB
- * @src_ipv6_msb: source IPv6 address MSB
- * @dest_ipv6_lsb: destination IPv6 address LSB
- * @dest_ipv6_msb: destination IPv6 address MSB
- * @direction_settings: direction filter settings (inbound/outbound) (see ipa_ipv6_ct_direction_settings_type)
- * @src_port: source port
- * @dest_port: destination port
- * @protocol: protocol of rule (tcp/udp)
- * @uc_activation_index: index pointing to uc activation table
- * @s: bit indication to use the system or local (1 or 0) addr for above table
- * @ucp: enable uc processing
- */
-typedef struct {
-	uint64_t src_ipv6_lsb;
-	uint64_t src_ipv6_msb;
-	uint64_t dest_ipv6_lsb;
-	uint64_t dest_ipv6_msb;
-	ipa_ipv6_ct_direction_settings_type  direction_settings;
-	bool  ucp;
-	bool s;
-	uint16_t uc_activation_index;
-	uint16_t src_port;
-	uint16_t dest_port;
-	uint8_t  protocol;
-} ipa_ipv6ct_rule;
-
-/**
- * ipa_ipv6ct_add_tbl() - create IPv6CT table
- * @number_of_entries: [in] number of IPv6CT entries
- * @table_handle: [out] handle of new IPv6CT table
- *
- * To create new IPv6CT table
- *
- * Returns:	0  On Success, negative on failure
- */
-int ipa_ipv6ct_add_tbl(uint16_t number_of_entries, uint32_t* table_handle);
-
-/**
- * ipa_ipv6ct_del_tbl() - delete IPv6CT table
- * @table_handle: [in] Handle of IPv6CT table
- *
- * To delete given IPv6CT table
- *
- * Returns:	0  On Success, negative on failure
- */
-int ipa_ipv6ct_del_tbl(uint32_t table_handle);
-
-/**
- * ipa_ipv6ct_add_rule() - to insert new IPv6CT rule
- * @table_handle: [in] handle of IPv6CT table
- * @user_rule: [in] Pointer to new rule
- * @rule_handle: [out] Return the handle to rule
- *
- * To insert new rule into a IPv6CT table
- *
- * Returns:	0  On Success, negative on failure
- */
-int ipa_ipv6ct_add_rule(uint32_t table_handle, const ipa_ipv6ct_rule* user_rule, uint32_t* rule_handle);
-
-/**
- * ipa_ipv6ct_del_rule() - to delete IPv6CT rule
- * @table_handle: [in] handle of IPv6CT table
- * @rule_handle: [in] IPv6CT rule handle
- *
- * To delete a rule from a IPv6CT table
- *
- * Returns:	0  On Success, negative on failure
- */
-int ipa_ipv6ct_del_rule(uint32_t table_handle, uint32_t rule_handle);
-
-/**
- * ipa_ipv6ct_query_timestamp() - to query timestamp
- * @table_handle: [in] handle of IPv6CT table
- * @rule_handle: [in] IPv6CT rule handle
- * @time_stamp: [out] time stamp of rule
- *
- * To retrieve the timestamp that lastly the IPv6CT rule was accessed
- *
- * Returns:	0  On Success, negative on failure
- */
-int ipa_ipv6ct_query_timestamp(uint32_t table_handle, uint32_t rule_handle, uint32_t* time_stamp);
-
-/**
- * ipa_ipv6ct_dump_table() - dumps IPv6CT table
- * @table_handle: [in] handle of IPv6CT table
- */
-void ipa_ipv6ct_dump_table(uint32_t tbl_hdl);
-
-/**
- * ipa_ipv6ct_add_uc_act_entry() - add uc activation entry
- * @u: [in] structure specifying the uC activation entry
- *
- * Returns:	0  On Success, negative on failure
- */
-int ipa_ipv6ct_add_uc_act_entry(union ipa_ioc_uc_activation_entry *u);
-
-/**
- * ipa_ipv6ct_del_uc_act_entry() - del uc activation entry
- * @index: [in] index of the uc activation entry to be removed
- *
- * Returns:	0  On Success, negative on failure
- */
-int ipa_ipv6ct_del_uc_act_entry(uint16_t index);
-
-#endif
-
diff --git a/ipanat/inc/ipa_ipv6cti.h b/ipanat/inc/ipa_ipv6cti.h
deleted file mode 100644
index c4dc32a..0000000
--- a/ipanat/inc/ipa_ipv6cti.h
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Copyright (c) 2018, 2020 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#ifndef IPA_IPV6CTI_H
-#define IPA_IPV6CTI_H
-
-#include "ipa_table.h"
-#include "ipa_mem_descriptor.h"
-#include "ipa_nat_utils.h"
-
-#define IPA_IPV6CT_MAX_TBLS   1
-
-#define IPA_IPV6CT_RULE_FLAG_FIELD_OFFSET        34
-#define IPA_IPV6CT_RULE_NEXT_FIELD_OFFSET        40
-#define IPA_IPV6CT_RULE_PROTO_FIELD_OFFSET       38
-
-#define IPA_IPV6CT_FLAG_ENABLE_BIT  1
-
-#define IPA_IPV6CT_DIRECTION_ALLOW_BIT  1
-#define IPA_IPV6CT_DIRECTION_DISALLOW_BIT 0
-
-#define IPA_IPV6CT_INVALID_PROTO_FIELD_VALUE 0xFF00
-#define IPA_IPV6CT_INVALID_PROTO_FIELD_CMP   0xFF
-
-typedef enum
-{
-	IPA_IPV6CT_TABLE_FLAGS,
-	IPA_IPV6CT_TABLE_NEXT_INDEX,
-	IPA_IPV6CT_TABLE_PROTOCOL,
-	IPA_IPV6CT_TABLE_DMA_CMD_MAX
-} ipa_ipv6ct_table_dma_cmd_type;
-
-/*------------------------  IPV6CT Table Entry  ---------------------------------------------------
-
-  -------------------------------------------------------------------------------------------------
-  |     7     |      6      |     5     |     4     |     3     |     2     |     1     |     0     |
-  ---------------------------------------------------------------------------------------------------
-  |                              Outbound Src IPv6 Address (8 LSB Bytes)                            |
-  ---------------------------------------------------------------------------------------------------
-  |                              Outbound Src IPv6 Address (8 MSB Bytes)                            |
-  ---------------------------------------------------------------------------------------------------
-  |                              Outbound Dest IPv6 Address (8 LSB Bytes)                           |
-  ---------------------------------------------------------------------------------------------------
-  |                              Outbound Dest IPv6 Address (8 MSB Bytes)                           |
-  ---------------------------------------------------------------------------------------------------
-  | Protocol  |           TimeStamp (3B)            |       Flags (2B)      |Rsvd   |S |uC activatio|
-  |    (1B)   |                                     |Enable|Redirect|Resv   |[15:14]|13|Index [12:0]|
-  ---------------------------------------------------------------------------------------------------
-  |Reserved   |Settings     |     Src Port (2B)     |     Dest Port (2B)    |    Next Index (2B)    |
-  |  (1B)     |  (1B)       |                       |                       |                       |
-  ---------------------------------------------------------------------------------------------------
-  |           SW Specific Parameters(4B)            |                   Reserved (4B)               |
-  |     Prev Index (2B)     |    Reserved (2B)      |                                               |
-  ---------------------------------------------------------------------------------------------------
-  |                                             Reserved (8B)                                       |
-  ---------------------------------------------------------------------------------------------------
-
-  Settings(1B)
- -----------------------------------------------
- |IN Allowed|OUT Allowed|Reserved|uC processing|
- |[7:7]     |[6:6]      |[5:1]   |[0:0]        |
- -----------------------------------------------
-
-  Dont change below structure definition.
-  It should be same as above(little endian order)
-  -------------------------------------------------------------------------------------------------*/
-typedef struct
-{
-	uint64_t src_ipv6_lsb : 64;
-	uint64_t src_ipv6_msb : 64;
-	uint64_t dest_ipv6_lsb : 64;
-	uint64_t dest_ipv6_msb : 64;
-
-	uint64_t uc_activation_index : 13;
-	uint64_t s : 1;
-	uint64_t rsvd1 : 16;
-	uint64_t redirect : 1;
-	uint64_t enable : 1;
-	uint64_t time_stamp : 24;
-	uint64_t protocol : 8;
-
-	uint64_t next_index : 16;
-	uint64_t dest_port : 16;
-	uint64_t src_port : 16;
-	uint64_t ucp : 1;
-	uint64_t rsvd2 : 5;
-	uint64_t out_allowed : 1;
-	uint64_t in_allowed : 1;
-	uint64_t rsvd3 : 8;
-
-	uint64_t rsvd4 : 48;
-	uint64_t prev_index : 16;
-
-	uint64_t rsvd5 : 64;
-} ipa_ipv6ct_hw_entry;
-
-/*
-	----------------------
-	|    1    |    0     |
-	----------------------
-	|     Flags(2B)      |
-	|Enable|Redirect|Resv|
-	----------------------
-*/
-typedef struct
-{
-	uint16_t rsvd1 : 14;
-	uint16_t redirect : 1;
-	uint16_t enable : 1;
-} ipa_ipv6ct_flags;
-
-typedef struct
-{
-	ipa_mem_descriptor mem_desc;
-	ipa_table table;
-	ipa_table_dma_cmd_helper table_dma_cmd_helpers[IPA_IPV6CT_TABLE_DMA_CMD_MAX];
-}  ipa_ipv6ct_table;
-
-typedef struct
-{
-	ipa_descriptor* ipa_desc;
-	ipa_ipv6ct_table tables[IPA_IPV6CT_MAX_TBLS];
-	uint8_t table_cnt;
-} ipa_ipv6ct;
-
-#endif
diff --git a/ipanat/inc/ipa_mem_descriptor.h b/ipanat/inc/ipa_mem_descriptor.h
deleted file mode 100644
index c7dd739..0000000
--- a/ipanat/inc/ipa_mem_descriptor.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (c) 2018-2020 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#ifndef IPA_MEM_DESCRIPTOR_H
-#define IPA_MEM_DESCRIPTOR_H
-
-#include <stdint.h>
-#include <stdbool.h>
-#include <linux/msm_ipa.h>
-
-typedef struct
-{
-	int orig_rqst_size;
-	int mmap_size;
-	void* base_addr;
-	void* mmap_addr;
-	uint32_t addr_offset;
-	unsigned long allocate_ioctl_num;
-	unsigned long delete_ioctl_num;
-	char name[IPA_RESOURCE_NAME_MAX];
-	uint8_t table_index;
-	uint8_t valid;
-	bool consider_using_sram;
-	bool sram_available;
-	bool sram_to_be_used;
-	struct ipa_nat_in_sram_info nat_sram_info;
-} ipa_mem_descriptor;
-
-void ipa_mem_descriptor_init(
-	ipa_mem_descriptor* desc,
-	const char* device_name,
-	int size,
-	uint8_t table_index,
-	unsigned long allocate_ioctl_num,
-	unsigned long delete_ioctl_num,
-	bool consider_using_sram );
-
-int ipa_mem_descriptor_allocate_memory(
-	ipa_mem_descriptor* desc,
-	int ipa_fd);
-
-int ipa_mem_descriptor_delete(
-	ipa_mem_descriptor* desc,
-	int ipa_fd);
-
-#endif
diff --git a/ipanat/inc/ipa_nat_drv.h b/ipanat/inc/ipa_nat_drv.h
deleted file mode 100644
index 3686634..0000000
--- a/ipanat/inc/ipa_nat_drv.h
+++ /dev/null
@@ -1,271 +0,0 @@
-/*
- * Copyright (c) 2013-2021 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#ifndef IPA_NAT_DRV_H
-#define IPA_NAT_DRV_H
-
-#include "ipa_nat_utils.h"
-
-#include <stdint.h>  /* uint32_t */
-#include <stdbool.h>
-
-/**
- * ipa_nat_is_sram_supported() - Reports if sram is available for use
- */
-bool ipa_nat_is_sram_supported(void);
-
-/**
- * struct ipa_nat_ipv4_rule - To hold ipv4 nat rule
- * @target_ip: destination ip address
- * @private_ip: private ip address
- * @target_port: destination port
- * @private_port: private port
- * @protocol: protocol of rule (tcp/udp)
- * @pdn_index: PDN index in the PDN config table
- * @redirect: used internally by various API calls
- * @enable: used internally by various API calls
- * @time_stamp: used internally by various API calls
- * @uc_activation_index: index pointing to uc activation table
- * @s: bit indication to use the system or local (1 or 0) addr for above table
- * @ucp: enable uc processing
- * @dst_only: construct NAT for DL only
- * @src_only: construct NAT for UL only
- */
-typedef struct {
-	uint32_t target_ip;
-	uint32_t private_ip;
-	uint16_t target_port;
-	uint16_t private_port;
-	uint16_t public_port;
-	uint8_t  protocol;
-	uint8_t  pdn_index;
-	uint8_t  redirect;
-	uint8_t  enable;
-	uint32_t time_stamp;
-	uint16_t uc_activation_index;
-	bool s;
-	bool ucp;
-	bool dst_only;
-	bool src_only;
-} ipa_nat_ipv4_rule;
-
-static inline char* prep_nat_ipv4_rule_4print(
-	ipa_nat_ipv4_rule* rule_ptr,
-	char*              buf_ptr,
-	uint32_t           buf_sz )
-{
-	if ( rule_ptr && buf_ptr && buf_sz )
-	{
-		snprintf(
-			buf_ptr, buf_sz,
-			"IPV4 RULE: "
-			"protocol(0x%02X) "
-			"public_port(0x%04X) "
-			"target_ip(0x%08X) "
-			"target_port(0x%04X) "
-			"private_ip(0x%08X) "
-			"private_port(0x%04X) "
-			"pdn_index(0x%02X)",
-			rule_ptr->protocol,
-			rule_ptr->public_port,
-			rule_ptr->target_ip,
-			rule_ptr->target_port,
-			rule_ptr->private_ip,
-			rule_ptr->private_port,
-			rule_ptr->pdn_index);
-	}
-
-	return buf_ptr;
-}
-
-/**
- * struct ipa_nat_pdn_entry - holds a PDN entry data
- * @public_ip: PDN's public ip address
- * @src_metadata: metadata to be used for source NAT metadata replacement
- * @dst_metadata: metadata to be used for destination NAT metadata replacement
- */
-typedef struct {
-	uint32_t public_ip;
-	uint32_t src_metadata;
-	uint32_t dst_metadata;
-} ipa_nat_pdn_entry;
-
-/**
- * ipa_nat_add_ipv4_tbl() - create ipv4 nat table
- * @public_ip_addr: [in] public ipv4 address
- * @mem_type_ptr: [in] type of memory table is to reside in
- * @number_of_entries: [in]  number of nat entries
- * @table_handle: [out] Handle of new ipv4 nat table
- *
- * To create new ipv4 nat table
- *
- * Returns:	0  On Success, negative on failure
- */
-int ipa_nat_add_ipv4_tbl(
-	uint32_t public_ip_addr,
-	const char *mem_type_ptr,
-	uint16_t number_of_entries,
-	uint32_t *table_handle);
-
-/**
- * ipa_nat_del_ipv4_tbl() - delete ipv4 table
- * @table_handle: [in] Handle of ipv4 nat table
- *
- * To delete given ipv4 nat table
- *
- * Returns:	0  On Success, negative on failure
- */
-int ipa_nat_del_ipv4_tbl(uint32_t table_handle);
-
-/**
- * ipa_nat_add_ipv4_rule() - to insert new ipv4 rule
- * @table_handle: [in] handle of ipv4 nat table
- * @rule: [in]  Pointer to new rule
- * @rule_handle: [out] Return the handle to rule
- *
- * To insert new ipv4 nat rule into ipv4 nat table
- *
- * Returns:	0  On Success, negative on failure
- */
-int ipa_nat_add_ipv4_rule(uint32_t table_handle,
-				const ipa_nat_ipv4_rule * rule,
-				uint32_t *rule_handle);
-
-/**
- * ipa_nat_del_ipv4_rule() - to delete ipv4 nat rule
- * @table_handle: [in] handle of ipv4 nat table
- * @rule_handle: [in] ipv4 nat rule handle
- *
- * To insert new ipv4 nat rule into ipv4 nat table
- *
- * Returns:	0  On Success, negative on failure
- */
-int ipa_nat_del_ipv4_rule(uint32_t table_handle,
-				uint32_t rule_handle);
-
-
-/**
- * ipa_nat_query_timestamp() - to query timestamp
- * @table_handle: [in] handle of ipv4 nat table
- * @rule_handle: [in] ipv4 nat rule handle
- * @time_stamp: [out] time stamp of rule
- *
- * To retrieve the timestamp that lastly the
- * nat rule was accessed
- *
- * Returns:	0  On Success, negative on failure
- */
-int ipa_nat_query_timestamp(uint32_t  table_handle,
-				uint32_t  rule_handle,
-				uint32_t  *time_stamp);
-
-
-/**
- * ipa_nat_modify_pdn() - modify single PDN entry in the PDN config table
- * @table_handle: [in] handle of ipv4 nat table
- * @pdn_index : [in] the index of the entry to be modified
- * @pdn_info : [in] values for the PDN entry to be changed
- *
- * Modify a PDN entry
- *
- * Returns:	0  On Success, negative on failure
- */
-int ipa_nat_modify_pdn(uint32_t  tbl_hdl,
-	uint8_t pdn_index,
-	ipa_nat_pdn_entry *pdn_info);
-
-/**
-* ipa_nat_get_pdn_index() - get a PDN index for a public ip
-* @public_ip : [in] IPv4 address of the PDN entry
-* @pdn_index : [out] the index of the requested PDN entry
-*
-* Get a PDN entry
-*
-* Returns:	0  On Success, negative on failure
-*/
-int ipa_nat_get_pdn_index(uint32_t public_ip, uint8_t *pdn_index);
-
-/**
-* ipa_nat_alloc_pdn() - allocate a PDN for new WAN
-* @pdn_info : [in] values for the PDN entry to be created
-* @pdn_index : [out] the index of the requested PDN entry
-*
-* allocate a new PDN entry
-*
-* Returns:	0  On Success, negative on failure
-*/
-int ipa_nat_alloc_pdn(ipa_nat_pdn_entry *pdn_info,
-	uint8_t *pdn_index);
-
-/**
-* ipa_nat_get_pdn_count() - get the number of allocated PDNs
-* @pdn_cnt : [out] the number of allocated PDNs
-*
-* get the number of allocated PDNs
-*
-* Returns:	0  On Success, negative on failure
-*/
-int ipa_nat_get_pdn_count(uint8_t *pdn_cnt);
-
-/**
-* ipa_nat_dealloc_pdn() - deallocate a PDN entry
-* @pdn_index : [in] pdn index to be deallocated
-*
-* deallocate a PDN in specified index - zero the PDN entry
-*
-* Returns:	0  On Success, negative on failure
-*/
-int ipa_nat_dealloc_pdn(uint8_t pdn_index);
-
-
-/**
- * ipa_nat_dump_ipv4_table() - dumps IPv4 NAT table
- * @table_handle: [in] handle of IPv4 NAT table
- */
-void ipa_nat_dump_ipv4_table(uint32_t tbl_hdl);
-
-/**
- * ipa_nat_vote_clock() - used for voting clock
- * @vote_type: [in] desired vote type
- */
-int ipa_nat_vote_clock(
-	enum ipa_app_clock_vote_type vote_type );
-
-/**
- * ipa_nat_switch_to() - While in HYBRID mode only, used for switching
- * from SRAM to DDR or the reverse.
- * @nmi: memory type to switch to
- * @hold_state: Will the new memory type get locked in (ie. no more
- *              oscilation between the memory types)
- */
-int ipa_nat_switch_to(
-	enum ipa3_nat_mem_in nmi,
-	bool                 hold_state );
-
-#endif
-
diff --git a/ipanat/inc/ipa_nat_drvi.h b/ipanat/inc/ipa_nat_drvi.h
deleted file mode 100644
index 261583b..0000000
--- a/ipanat/inc/ipa_nat_drvi.h
+++ /dev/null
@@ -1,404 +0,0 @@
-/*
- * Copyright (c) 2013-2020 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef IPA_NAT_DRVI_H
-#define IPA_NAT_DRVI_H
-
-#include "ipa_table.h"
-#include "ipa_mem_descriptor.h"
-#include "ipa_nat_utils.h"
-
-#undef MAKE_TBL_HDL
-#define MAKE_TBL_HDL(hdl, mt) \
-	((mt) << 31 | (hdl))
-
-#undef BREAK_TBL_HDL
-#define BREAK_TBL_HDL(hdl_in, mt, hdl_out) \
-	do { \
-		mt      = (hdl_in) >> 31 & 0x0000000001; \
-		hdl_out = (hdl_in)       & 0x00000000FF; \
-	} while ( 0 )
-
-#undef VALID_TBL_HDL
-#define VALID_TBL_HDL(h) \
-	(((h) & 0x00000000FF) == IPA_NAT_MAX_IP4_TBLS)
-
-/*======= IMPLEMENTATION related data structures and functions ======= */
-
-#define IPA_NAT_MAX_IP4_TBLS   1
-
-#define IPA_NAT_RULE_FLAG_FIELD_OFFSET        18
-#define IPA_NAT_RULE_NEXT_FIELD_OFFSET        8
-#define IPA_NAT_RULE_PROTO_FIELD_OFFSET       22
-
-#define IPA_NAT_INDEX_RULE_NEXT_FIELD_OFFSET       2
-#define IPA_NAT_INDEX_RULE_NAT_INDEX_FIELD_OFFSET  0
-
-#define IPA_NAT_FLAG_ENABLE_BIT  1
-
-#define IPA_NAT_INVALID_PROTO_FIELD_VALUE 0xFF00
-/*
- * IPA_NAT_INVALID_PROTO_FIELD_VALUE above is what's passed to the IPA
- * in a DMA command.  It is written into the NAT's rule, by the
- * IPA. After being written, It minifests in the rule in the form
- * below, hence it will be used when perusing the "struct
- * ipa_nat_rule".
- */
-#define IPA_NAT_INVALID_PROTO_FIELD_VALUE_IN_RULE  0xFF
-
-typedef enum {
-	IPA_NAT_TABLE_FLAGS,
-	IPA_NAT_TABLE_NEXT_INDEX,
-	IPA_NAT_TABLE_PROTOCOL,
-	IPA_NAT_INDEX_TABLE_ENTRY,
-	IPA_NAT_INDEX_TABLE_NEXT_INDEX,
-	IPA_NAT_TABLE_DMA_CMD_MAX
-} ipa_nat_table_dma_cmd_type;
-
-/*
- * ------------------------  NAT Table Entry  -----------------------------------------
- *
- * ------------------------------------------------------------------------------------
- * |   7    |    6    |   5    |    4    |     3        |  2   |    1    |    0       |
- * ------------------------------------------------------------------------------------
- * |             Target IP(4B)           |             Private IP(4B)                 |
- * ------------------------------------------------------------------------------------
- * |Target Port(2B)   | Private Port(2B) | Public Port(2B)     | Next Index(2B)       |
- * ------------------------------------------------------------------------------------
- * | Proto   |      TimeStamp(3B)        |       Flags(2B)     | IP check sum Diff(2B)|
- * | (1B)    |                           |EN|Redirect|Resv     |                      |
- * ------------------------------------------------------------------------------------
- * | TCP/UDP checksum |PDN info|Reserved |    SW Specific Parameters(4B)              |
- * |    diff (2B)     |  (1B)  |  (1B)   |                                            |
- * ------------------------------------------------------------------------------------
- *
- * Dont change below structure definition.
- *
- * It should be same as above(little endian order)
- *
- * -------------------------------------------------------------------------------
- */
-struct ipa_nat_rule {
-	uint64_t private_ip:32;
-	uint64_t target_ip:32;
-
-	uint64_t next_index:16;
-	uint64_t public_port:16;
-	uint64_t private_port:16;
-	uint64_t target_port:16;
-
-	uint64_t ip_chksum:16;
-
-	/*--------------------------------------------------
-	IPA NAT Flag is interpreted as follows
-	---------------------------------------------------
-	|  EN   |FIN/RST|  S   | IPv4 uC activation index |
-	| [15]  | [14]  | [13] |          [12:0]          |
-	---------------------------------------------------
-	--------------------------------------------------*/
-	uint64_t uc_activation_index:13;
-	uint64_t s:1;
-	uint64_t redirect:1;
-	uint64_t enable:1;
-
-	uint64_t time_stamp:24;
-	uint64_t protocol:8;
-
-	/*--------------------------------------------------
-	32 bit sw_spec_params is interpreted as follows
-	------------------------------------
-	|     16 bits     |     16 bits    |
-	------------------------------------
-	|  index table    |  prev index    |
-	|     entry       |                |
-	------------------------------------
-	--------------------------------------------------*/
-	uint64_t prev_index:16;
-	uint64_t indx_tbl_entry:16;
-	uint64_t rsvd2:8;
-	/*-----------------------------------------
-	8 bit PDN info is interpreted as following
-	-----------------------------------------------------
-	|     4 bits      |     1 bit      |     3 bits     |
-	-----------------------------------------------------
-	|  PDN index      |  uC processing |  src dst Rsrv3 |
-	|      [7:4]      |       [3]      |  [2] [1]  [0]  |
-	-----------------------------------------------------
-	-------------------------------------------*/
-	uint64_t rsvd3:1;
-	uint64_t dst_only:1;
-	uint64_t src_only:1;
-	uint64_t ucp:1;
-	uint64_t pdn_index:4;
-
-	uint64_t tcp_udp_chksum:16;
-};
-
-static inline char* prep_nat_rule_4print(
-	struct ipa_nat_rule* rule_ptr,
-	char*                buf_ptr,
-	uint32_t             buf_sz )
-{
-	if ( rule_ptr && buf_ptr && buf_sz )
-	{
-		snprintf(
-			buf_ptr, buf_sz,
-			"NAT RULE: "
-			"protocol(0x%02X) "
-			"public_port(0x%04X) "
-			"target_ip(0x%08X) "
-			"target_port(0x%04X) "
-			"private_ip(0x%08X) "
-			"private_port(0x%04X) "
-			"pdn_index(0x%02X) "
-			"ip_chksum(0x%04X) "
-			"tcp_udp_chksum(0x%04X) "
-			"redirect(0x%02X) "
-			"enable(0x%02X) "
-			"time_stamp(0x%08X) "
-			"indx_tbl_entry(0x%04X) "
-			"prev_index(0x%04X) "
-			"next_index(0x%04X)",
-			rule_ptr->protocol,
-			rule_ptr->public_port,
-			rule_ptr->target_ip,
-			rule_ptr->target_port,
-			rule_ptr->private_ip,
-			rule_ptr->private_port,
-			rule_ptr->pdn_index,
-			rule_ptr->ip_chksum,
-			rule_ptr->tcp_udp_chksum,
-			rule_ptr->redirect,
-			rule_ptr->enable,
-			rule_ptr->time_stamp,
-			rule_ptr->indx_tbl_entry,
-			rule_ptr->prev_index,
-			rule_ptr->next_index);
-	}
-
-	return buf_ptr;
-}
-
-static inline const char *ipa3_nat_mem_in_as_str(
-	enum ipa3_nat_mem_in nmi)
-{
-	switch (nmi) {
-	case IPA_NAT_MEM_IN_DDR:
-		return "IPA_NAT_MEM_IN_DDR";
-	case IPA_NAT_MEM_IN_SRAM:
-		return "IPA_NAT_MEM_IN_SRAM";
-	default:
-		break;
-	}
-	return "???";
-}
-
-static inline char *ipa_ioc_v4_nat_init_as_str(
-	struct ipa_ioc_v4_nat_init *ptr,
-	char                       *buf,
-	uint32_t                    buf_sz)
-{
-	if (ptr && buf && buf_sz) {
-		snprintf(
-			buf, buf_sz,
-			"V4 NAT INIT: tbl_index(0x%02X) ipv4_rules_offset(0x%08X) expn_rules_offset(0x%08X) index_offset(0x%08X) index_expn_offset(0x%08X) table_entries(0x%04X) expn_table_entries(0x%04X) ip_addr(0x%08X)",
-			ptr->tbl_index,
-			ptr->ipv4_rules_offset,
-			ptr->expn_rules_offset,
-			ptr->index_offset,
-			ptr->index_expn_offset,
-			ptr->table_entries,
-			ptr->expn_table_entries,
-			ptr->ip_addr);
-	}
-	return buf;
-}
-
-/*
-	IPA NAT Flag is interpreted as follows
-	---------------------------------------------------
-	|  EN   |FIN/RST|  S   | IPv4 uC activation index |
-	| [15]  | [14]  | [13] |          [12:0]          |
-	---------------------------------------------------
-*/
-typedef struct {
-	uint32_t uc_activation_index:13;
-	uint32_t s:1;
-	uint32_t redirect:1;
-	uint32_t enable:1;
-} ipa_nat_flags;
-
-struct ipa_nat_indx_tbl_rule {
-	uint16_t tbl_entry;
-	uint16_t next_index;
-};
-
-struct ipa_nat_indx_tbl_meta_info {
-	uint16_t prev_index;
-};
-
-struct ipa_nat_ip4_table_cache {
-	uint32_t public_addr;
-	ipa_mem_descriptor mem_desc;
-	ipa_table table;
-	ipa_table index_table;
-	struct ipa_nat_indx_tbl_meta_info *index_expn_table_meta;
-	ipa_table_dma_cmd_helper table_dma_cmd_helpers[IPA_NAT_TABLE_DMA_CMD_MAX];
-};
-
-struct ipa_nat_cache {
-	ipa_descriptor* ipa_desc;
-	struct ipa_nat_ip4_table_cache ip4_tbl[IPA_NAT_MAX_IP4_TBLS];
-	uint8_t table_cnt;
-	enum ipa3_nat_mem_in nmi;
-};
-
-int ipa_nati_add_ipv4_tbl(
-	uint32_t    public_ip_addr,
-	const char *mem_type_ptr,
-	uint16_t    number_of_entries,
-	uint32_t   *table_hanle);
-
-int ipa_nati_del_ipv4_table(uint32_t tbl_hdl);
-
-int ipa_nati_query_timestamp(uint32_t  tbl_hdl,
-				uint32_t  rule_hdl,
-				uint32_t  *time_stamp);
-
-int ipa_nati_modify_pdn(struct ipa_ioc_nat_pdn_entry *entry);
-
-int ipa_nati_get_pdn_index(uint32_t public_ip, uint8_t *pdn_index);
-
-int ipa_nati_alloc_pdn(ipa_nat_pdn_entry *pdn_info, uint8_t *pdn_index);
-
-int ipa_nati_get_pdn_cnt(void);
-
-int ipa_nati_dealloc_pdn(uint8_t pdn_index);
-
-int ipa_nati_add_ipv4_rule(uint32_t tbl_hdl,
-				const ipa_nat_ipv4_rule *clnt_rule,
-				uint32_t *rule_hdl);
-
-int ipa_nati_del_ipv4_rule(uint32_t tbl_hdl,
-				uint32_t rule_hdl);
-
-int ipa_nati_get_sram_size(
-	uint32_t* size_ptr);
-
-int ipa_nati_clear_ipv4_tbl(
-	uint32_t tbl_hdl );
-
-int ipa_nati_copy_ipv4_tbl(
-	uint32_t          src_tbl_hdl,
-	uint32_t          dst_tbl_hdl,
-	ipa_table_walk_cb copy_cb );
-
-typedef enum
-{
-	USE_NAT_TABLE   = 0,
-	USE_INDEX_TABLE = 1,
-
-	USE_MAX
-} WhichTbl2Use;
-
-#define VALID_WHICHTBL2USE(w) \
-	( (w) >= USE_NAT_TABLE && (w) < USE_MAX )
-
-int ipa_nati_walk_ipv4_tbl(
-	uint32_t          tbl_hdl,
-	WhichTbl2Use      which,
-	ipa_table_walk_cb walk_cb,
-	void*             arb_data_ptr );
-
-/*
- * The following used for retrieving table stats.
- */
-typedef struct
-{
-	enum ipa3_nat_mem_in nmi;
-	uint32_t tot_ents;
-	uint32_t tot_base_ents;
-	uint32_t tot_base_ents_filled;
-	uint32_t tot_expn_ents;
-	uint32_t tot_expn_ents_filled;
-	uint32_t tot_chains;
-	uint32_t min_chain_len;
-	uint32_t max_chain_len;
-	float    avg_chain_len;
-} ipa_nati_tbl_stats;
-
-int ipa_nati_ipv4_tbl_stats(
-	uint32_t            tbl_hdl,
-	ipa_nati_tbl_stats* nat_stats_ptr,
-	ipa_nati_tbl_stats* idx_stats_ptr );
-
-int ipa_nati_vote_clock(
-	enum ipa_app_clock_vote_type vote_type );
-
-int ipa_NATI_add_ipv4_tbl(
-	enum ipa3_nat_mem_in nmi,
-	uint32_t             public_ip_addr,
-	uint16_t             number_of_entries,
-	uint32_t*            tbl_hdl);
-
-int ipa_NATI_del_ipv4_table(
-	uint32_t tbl_hdl);
-
-int ipa_NATI_clear_ipv4_tbl(
-	uint32_t tbl_hdl );
-
-int ipa_NATI_walk_ipv4_tbl(
-	uint32_t          tbl_hdl,
-	WhichTbl2Use      which,
-	ipa_table_walk_cb walk_cb,
-	void*             arb_data_ptr );
-
-int ipa_NATI_ipv4_tbl_stats(
-	uint32_t            tbl_hdl,
-	ipa_nati_tbl_stats* nat_stats_ptr,
-	ipa_nati_tbl_stats* idx_stats_ptr );
-
-int ipa_NATI_query_timestamp(
-	uint32_t  tbl_hdl,
-	uint32_t  rule_hdl,
-	uint32_t* time_stamp);
-
-int ipa_NATI_add_ipv4_rule(
-	uint32_t                 tbl_hdl,
-	const ipa_nat_ipv4_rule* clnt_rule,
-	uint32_t*                rule_hdl);
-
-int ipa_NATI_del_ipv4_rule(
-	uint32_t tbl_hdl,
-	uint32_t rule_hdl);
-
-int ipa_NATI_post_ipv4_init_cmd(
-	uint32_t tbl_hdl );
-
-#endif /* #ifndef IPA_NAT_DRVI_H */
diff --git a/ipanat/inc/ipa_nat_map.h b/ipanat/inc/ipa_nat_map.h
deleted file mode 100644
index 192a9bf..0000000
--- a/ipanat/inc/ipa_nat_map.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright (c) 2019 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#if !defined(_IPA_NATI_MAP_H_)
-# define _IPA_NATI_MAP_H_
-
-#include <stdint.h>
-
-# ifdef __cplusplus
-extern "C"
-{
-# endif /* __cplusplus */
-
-/* Used below */
-#define MAKE_AS_STR_CASE(v) case v: return #v
-
-/*
- * The following is used to describe which map to use.
- *
- * PLEASE KEEP THE FOLLOWING IN SYNC WITH ipa_which_map_as_str()
- * BELOW.
- */
-typedef enum
-{
-	MAP_NUM_00 = 0,
-	MAP_NUM_01 = 1,
-	MAP_NUM_02 = 2,
-	MAP_NUM_03 = 3,
-
-	MAP_NUM_99 = 4,
-
-	MAP_NUM_MAX
-} ipa_which_map;
-
-#define VALID_IPA_USE_MAP(w) \
-	( (w) >= MAP_NUM_00 || (w) < MAP_NUM_MAX )
-
-/* KEEP THE FOLLOWING IN SYNC WITH ABOVE. */
-static inline const char* ipa_which_map_as_str(
-	ipa_which_map w )
-{
-	switch ( w )
-	{
-		MAKE_AS_STR_CASE(MAP_NUM_00);
-		MAKE_AS_STR_CASE(MAP_NUM_01);
-		MAKE_AS_STR_CASE(MAP_NUM_02);
-		MAKE_AS_STR_CASE(MAP_NUM_03);
-
-		MAKE_AS_STR_CASE(MAP_NUM_99);
-	default:
-		break;
-	}
-
-	return "???";
-}
-
-int ipa_nat_map_add(
-	ipa_which_map which,
-	uint32_t      key,
-	uint32_t      val );
-
-int ipa_nat_map_find(
-	ipa_which_map which,
-	uint32_t      key,
-	uint32_t*     val_ptr );
-
-int ipa_nat_map_del(
-	ipa_which_map which,
-	uint32_t      key,
-	uint32_t*     val_ptr );
-
-int ipa_nat_map_clear(
-	ipa_which_map which );
-
-int ipa_nat_map_dump(
-	ipa_which_map which );
-
-# ifdef __cplusplus
-}
-# endif /* __cplusplus */
-
-#endif /* #if !defined(_IPA_NATI_MAP_H_) */
diff --git a/ipanat/inc/ipa_nat_statemach.h b/ipanat/inc/ipa_nat_statemach.h
deleted file mode 100644
index 56d0094..0000000
--- a/ipanat/inc/ipa_nat_statemach.h
+++ /dev/null
@@ -1,297 +0,0 @@
-/*
- * Copyright (c) 2019-2021 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#if !defined(_IPA_NAT_STATEMACH_H_)
-# define _IPA_NAT_STATEMACH_H_
-
-typedef uintptr_t arb_t;
-
-#define MAKE_AS_STR_CASE(v) case v: return #v
-
-/******************************************************************************/
-/**
- * The following enum represents the states that a nati object can be
- * in.
- */
-typedef enum {
-	NATI_STATE_NULL       = 0,
-	NATI_STATE_DDR_ONLY   = 1, /* NAT in DDR only (traditional) */
-	NATI_STATE_SRAM_ONLY  = 2, /* NAT in SRAM only (new) */
-	NATI_STATE_HYBRID     = 3, /* NAT simultaneously in both SRAM/DDR */
-	NATI_STATE_HYBRID_DDR = 4, /* NAT transitioned from SRAM to DDR */
-
-	NATI_STATE_LAST
-} ipa_nati_state;
-
-/* KEEP THE FOLLOWING IN SYNC WITH ABOVE. */
-static inline const char* ipa_nati_state_as_str(
-	ipa_nati_state s )
-{
-	switch ( s )
-	{
-		MAKE_AS_STR_CASE(NATI_STATE_NULL);
-		MAKE_AS_STR_CASE(NATI_STATE_DDR_ONLY);
-		MAKE_AS_STR_CASE(NATI_STATE_SRAM_ONLY);
-		MAKE_AS_STR_CASE(NATI_STATE_HYBRID);
-		MAKE_AS_STR_CASE(NATI_STATE_HYBRID_DDR);
-		MAKE_AS_STR_CASE(NATI_STATE_LAST);
-
-	default:
-		break;
-	}
-
-	return "???";
-}
-
-# undef strcasesame
-# define strcasesame(a, b) (!strcasecmp(a, b))
-
-static inline ipa_nati_state mem_type_str_to_ipa_nati_state(
-	const char* str )
-{
-	if ( str ) {
-		if (strcasesame(str, "HYBRID" ))
-			return NATI_STATE_HYBRID;
-		if (strcasesame(str, "SRAM" ))
-			return NATI_STATE_SRAM_ONLY;
-	}
-	return NATI_STATE_DDR_ONLY;
-}
-
-/******************************************************************************/
-/**
- * The following enum represents the API triggers that may or may not
- * cause a nati object to transition through its various allowable
- * states defined in ipa_nati_state above.
- */
-typedef enum {
-	NATI_TRIG_NULL       =  0,
-	NATI_TRIG_ADD_TABLE  =  1,
-	NATI_TRIG_DEL_TABLE  =  2,
-	NATI_TRIG_CLR_TABLE  =  3,
-	NATI_TRIG_WLK_TABLE  =  4,
-	NATI_TRIG_TBL_STATS  =  5,
-	NATI_TRIG_ADD_RULE   =  6,
-	NATI_TRIG_DEL_RULE   =  7,
-	NATI_TRIG_TBL_SWITCH =  8,
-	NATI_TRIG_GOTO_DDR   =  9,
-	NATI_TRIG_GOTO_SRAM  = 10,
-	NATI_TRIG_GET_TSTAMP = 11,
-
-	NATI_TRIG_LAST
-} ipa_nati_trigger;
-
-/******************************************************************************/
-/**
- * The following structure used to keep switch stats.
- */
-typedef struct
-{
-	uint32_t pass;
-	uint32_t fail;
-} nati_switch_stats;
-
-/******************************************************************************/
-/**
- * The following structure used to direct map usage.
- *
- * Maps are needed to map rule handles..orig to new and new to orig.
- * See comments in ipa_nat_statemach.c on this topic...
- */
-typedef struct
-{
-	uint32_t orig2new_map;
-	uint32_t new2orig_map;
-} nati_map_pair;
-
-/******************************************************************************/
-/**
- * The following is a nati object that will maintain state relative to
- * various API calls.
- */
-typedef struct
-{
-	ipa_nati_state prev_state;
-	ipa_nati_state curr_state;
-	bool           hold_state;
-	ipa_nati_state state_to_hold;
-	uint32_t       ddr_tbl_hdl;
-	uint32_t       sram_tbl_hdl;
-	uint32_t       tot_slots_in_sram;
-	uint32_t       back_to_sram_thresh;
-	/*
-	 * tot_rules_in_table[0] for ddr, and
-	 * tot_rules_in_table[1] for sram
-	 */
-	uint32_t       tot_rules_in_table[2];
-	/*
-	 * map_pairs[0] for ddr, and
-	 * map_pairs[1] for sram
-	 */
-	nati_map_pair  map_pairs[2];
-	/*
-	 * sw_stats[0] for ddr, and
-	 * sw_stats[1] for sram
-	 */
-	nati_switch_stats sw_stats[2];
-} ipa_nati_obj;
-
-/*
- * For use with the arrays above..in ipa_nati_obj...
- */
-#undef DDR_SUB
-#undef SRAM_SUB
-
-#define DDR_SUB  0
-#define SRAM_SUB 1
-
-#undef BACK2_UNSTARTED_STATE
-#define BACK2_UNSTARTED_STATE() \
-	nati_obj.prev_state = nati_obj.curr_state = NATI_STATE_NULL;
-
-#undef IN_UNSTARTED_STATE
-#define IN_UNSTARTED_STATE() \
-	( nati_obj.prev_state == NATI_STATE_NULL )
-
-#undef IN_HYBRID_STATE
-#define IN_HYBRID_STATE() \
-	( nati_obj.curr_state == NATI_STATE_HYBRID || \
-	  nati_obj.curr_state == NATI_STATE_HYBRID_DDR )
-
-#undef COMPATIBLE_NMI_4SWITCH
-#define COMPATIBLE_NMI_4SWITCH(n) \
-	( (n) == IPA_NAT_MEM_IN_SRAM && nati_obj.curr_state == NATI_STATE_HYBRID_DDR ) || \
-	( (n) == IPA_NAT_MEM_IN_DDR  && nati_obj.curr_state == NATI_STATE_HYBRID ) || \
-	( (n) == IPA_NAT_MEM_IN_DDR  && nati_obj.curr_state == NATI_STATE_DDR_ONLY ) || \
-	( (n) == IPA_NAT_MEM_IN_SRAM && nati_obj.curr_state == NATI_STATE_SRAM_ONLY )
-
-#undef GEN_HOLD_STATE
-#define GEN_HOLD_STATE() \
-	( ! IN_HYBRID_STATE() ) ? nati_obj.curr_state : \
-	(nati_obj.curr_state == NATI_STATE_HYBRID) ? NATI_STATE_SRAM_ONLY : \
-	NATI_STATE_DDR_ONLY
-
-#undef  SRAM_CURRENTLY_ACTIVE
-#define SRAM_CURRENTLY_ACTIVE() \
-	( nati_obj.curr_state == NATI_STATE_SRAM_ONLY || \
-	  nati_obj.curr_state == NATI_STATE_HYBRID )
-
-#define SRAM_TO_BE_ACCESSED(t) \
-	( SRAM_CURRENTLY_ACTIVE() || \
-	  (t) == NATI_TRIG_GOTO_SRAM || \
-	  (t) == NATI_TRIG_TBL_SWITCH )
-
-/*
- * NOTE: The exclusion of timestamp retrieval and table creation
- *       below.
- *
- * Why?
- *
- *  In re timestamp:
- *
- *   Because timestamp retrieval institutes too many repetitive
- *   accesses, hence would lead to too many successive votes. Instead,
- *   it will be handled differently and in the app layer above.
- *
- *  In re table creation:
- *
- *    Because it can't be known, apriori, whether or not sram is
- *    really available for use. Instead, we'll move table creation
- *    voting to a place where we know sram is available.
- */
-#undef  VOTE_REQUIRED
-#define VOTE_REQUIRED(t) \
-	( SRAM_TO_BE_ACCESSED(t) && \
-	  (t) != NATI_TRIG_GET_TSTAMP && \
-	  (t) != NATI_TRIG_ADD_TABLE )
-
-/******************************************************************************/
-/**
- * A helper macro for changing a nati object's state...
- */
-# undef SET_NATIOBJ_STATE
-# define SET_NATIOBJ_STATE(x, s)  {        \
-		(x)->prev_state = (x)->curr_state; \
-		(x)->curr_state = s;               \
-	}
-
-/******************************************************************************/
-/**
- * A function signature for a state/trigger callback function...
- */
-typedef int (*nati_statemach_cb)(
-	ipa_nati_obj*    nati_obj_ptr,
-	ipa_nati_trigger trigger,
-	arb_t*           arb_data_ptr );
-
-/******************************************************************************/
-/**
- * A structure for relating state to trigger callbacks.
- */
-typedef struct
-{
-	ipa_nati_state    state;
-	ipa_nati_trigger  trigger;
-	nati_statemach_cb sm_cb;
-	const char*       state_as_str;
-	const char*       trigger_as_str;
-	const char*       sm_cb_as_str;
-} nati_statemach_tuple;
-
-#undef SM_ROW
-#define SM_ROW(s, t, f) \
-	{ s, t, f, #s, #t, #f }
-
-/******************************************************************************/
-/**
- * FUNCTION: ipa_nati_statemach
- *
- * PARAMS:
- *
- *   @nati_obj_ptr (IN) A pointer to an initialized nati object
- *
- *   @trigger      (IN) The trigger to run through the state machine
- *
- *   @arb_data_ptr (IN) Anything you like.  Will be passed, untouched,
- *                     to the state/trigger callback function.
- *
- * DESCRIPTION:
- *
- *   This function allows a nati object and a trigger to be run
- *   through the state machine.
- *
- * RETURNS:
- *
- *   zero on success, otherwise non-zero
- */
-int ipa_nati_statemach(
-	ipa_nati_obj*    nati_obj_ptr,
-	ipa_nati_trigger trigger,
-	arb_t*           arb_data_ptr );
-
-#endif /* #if !defined(_IPA_NAT_STATEMACH_H_) */
diff --git a/ipanat/inc/ipa_nat_utils.h b/ipanat/inc/ipa_nat_utils.h
deleted file mode 100644
index 22b99c4..0000000
--- a/ipanat/inc/ipa_nat_utils.h
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- * Copyright (c) 2013, 2018-2020 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * Changes from Qualcomm Innovation Center are provided under the following license:
- *
- * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted (subject to the limitations in the
- * disclaimer below) provided that the following conditions are met:
- *
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *
- *     * Neither the name of Qualcomm Innovation Center, Inc. nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
- * GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
- * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
- * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
- * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
- */
-#ifndef IPA_NAT_UTILS_H
-#define IPA_NAT_UTILS_H
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <syslog.h>
-#include <time.h>
-#include <linux/msm_ipa.h>
-
-#ifndef FALSE
-#define FALSE 0
-#endif
-
-#ifndef TRUE
-#define TRUE 1
-#endif
-
-#define MAX_DMA_ENTRIES_FOR_ADD 4
-#define MAX_DMA_ENTRIES_FOR_DEL 3
-
-#if !defined(MSM_IPA_TESTS) && !defined(FEATURE_IPA_ANDROID)
-#ifdef USE_GLIB
-#include <glib.h>
-#define strlcpy g_strlcpy
-#else
-size_t strlcpy(char* dst, const char* src, size_t size);
-#endif
-#endif
-
-#define IPAERR(fmt, ...)  printf("ERR: %s:%d %s() " fmt, __FILE__,  __LINE__, __FUNCTION__, ##__VA_ARGS__);
-
-#define IPAINFO(fmt, ...)  printf("INFO: %s:%d %s() " fmt, __FILE__,  __LINE__, __FUNCTION__, ##__VA_ARGS__);
-
-#define IPAWARN(fmt, ...)  printf("WARN: %s:%d %s() " fmt, __FILE__,  __LINE__, __FUNCTION__, ##__VA_ARGS__);
-
-#ifdef NAT_DEBUG
-#define IPADBG(fmt, ...) printf("%s:%d %s() " fmt, __FILE__,  __LINE__, __FUNCTION__, ##__VA_ARGS__);
-#else
-#define IPADBG(fmt, ...)
-#endif
-
-typedef struct
-{
-	int              fd;
-	enum ipa_hw_type ver;
-} ipa_descriptor;
-
-ipa_descriptor* ipa_descriptor_open(void);
-
-void ipa_descriptor_close(
-	ipa_descriptor*);
-
-void ipa_read_debug_info(
-	const char* debug_file_path);
-
-static inline char* prep_ioc_nat_dma_cmd_4print(
-	struct ipa_ioc_nat_dma_cmd* cmd_ptr,
-	char*                       buf_ptr,
-	uint32_t                    buf_sz )
-{
-	uint32_t i, len, buf_left;
-
-	if ( cmd_ptr && buf_ptr && buf_sz )
-	{
-		snprintf(
-			buf_ptr,
-			buf_sz,
-			"NAT_DMA_CMD: mem_type(%u) entries(%u) ",
-			cmd_ptr->mem_type,
-			cmd_ptr->entries);
-
-		for ( i = 0; i < cmd_ptr->entries; i++ )
-		{
-			len = strlen(buf_ptr);
-
-			buf_left = buf_sz - len;
-
-			if ( buf_left > 0 && buf_left < buf_sz )
-			{
-				snprintf(
-					buf_ptr + len,
-					buf_left,
-					"[%u](table_index(0x%02X) base_addr(0x%02X) offset(0x%08X) data(0x%04X)) ",
-					i,
-					cmd_ptr->dma[i].table_index,
-					cmd_ptr->dma[i].base_addr,
-					cmd_ptr->dma[i].offset,
-					(uint32_t) cmd_ptr->dma[i].data);
-			}
-		}
-	}
-
-	return buf_ptr;
-}
-
-#undef NANOS_PER_SEC
-#undef MICROS_PER_SEC
-#undef MILLIS_PER_SEC
-
-#define NANOS_PER_SEC  1000000000
-#define MICROS_PER_SEC    1000000
-#define MILLIS_PER_SEC       1000
-
-/**
- * A macro for converting seconds to nanoseconds...
- */
-#define SECS2NanSECS(x) ((x) * NANOS_PER_SEC)
-
-/**
- * A macro for converting seconds to microseconds...
- */
-#define SECS2MicSECS(x) ((x) * MICROS_PER_SEC)
-
-/**
- * A macro for converting seconds to milliseconds...
- */
-#define SECS2MilSECS(x) ((x) * MILLIS_PER_SEC)
-
-/******************************************************************************/
-
-typedef enum
-{
-	TimeAsNanSecs = 0,
-	TimeAsMicSecs = 1,
-	TimeAsMilSecs = 2
-} TimeAs_t;
-
-#undef VALID_TIMEAS
-#define VALID_TIMEAS(ta)   \
-	( (ta) == TimeAsNanSecs ||					\
-	  (ta) == TimeAsMicSecs ||					\
-	  (ta) == TimeAsMilSecs )
-
-int currTimeAs(
-	TimeAs_t  timeAs,
-	uint64_t* valPtr );
-
-#endif /* IPA_NAT_UTILS_H */
diff --git a/ipanat/inc/ipa_table.h b/ipanat/inc/ipa_table.h
deleted file mode 100644
index e394a45..0000000
--- a/ipanat/inc/ipa_table.h
+++ /dev/null
@@ -1,323 +0,0 @@
-/*
- * Copyright (c) 2018-2020 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#ifndef IPA_TABLE_H
-#define IPA_TABLE_H
-
-#include <stdint.h>
-#include <stdbool.h>
-#include <linux/msm_ipa.h>
-
-#define IPA_TABLE_MAX_ENTRIES 5120
-
-#define IPA_TABLE_INVALID_ENTRY 0x0
-
-#undef  VALID_INDEX
-#define VALID_INDEX(idx) \
-	( (idx) != IPA_TABLE_INVALID_ENTRY )
-
-#undef  VALID_RULE_HDL
-#define VALID_RULE_HDL(hdl) \
-	( (hdl) != IPA_TABLE_INVALID_ENTRY )
-
-#undef GOTO_REC
-#define GOTO_REC(tbl, rec_idx) \
-	( (tbl)->table_addr + ((rec_idx) * (tbl)->entry_size) )
-
-typedef enum
-{
-	IPA_NAT_BASE_TBL       = 0,
-	IPA_NAT_EXPN_TBL       = 1,
-	IPA_NAT_INDX_TBL       = 2,
-	IPA_NAT_INDEX_EXPN_TBL = 3,
-	IPA_IPV6CT_BASE_TBL    = 4,
-	IPA_IPV6CT_EXPN_TBL    = 5,
-} ipa_table_dma_type;
-
-#define VALID_IPA_TABLE_DMA_TYPE(t) \
-	( (t) >= IPA_NAT_BASE_TBL && (t) <= IPA_IPV6CT_EXPN_TBL )
-
-/*
- *    --------- NAT Rule Handle Entry ID structure ---------
- *
- * +-----------+-----------+------------------+----------------+
- * |   1 bit   |  2 bits   |    12 bits       |     1 bit      |
- * +-----------+-----------+------------------+----------------+
- * | 0 - DDR   | reserved  | index into table |  0 - base      |
- * | 1 - SRAM  |           |                  |  1 - expansion |
- * +-----------+-----------+------------------+----------------+
- */
-#define IPA_TABLE_TYPE_BITS      0x00000001
-#define IPA_TABLE_TYPE_MASK      0x00000001
-#define IPA_TABLE_INDX_MASK      0x00000FFF
-#define IPA_TABLE_TYPE_MEM_SHIFT 15
-
-#undef BREAK_RULE_HDL
-#define BREAK_RULE_HDL(tbl, hdl, mt, iet, indx) \
-	do { \
-		mt    = ((hdl) >> IPA_TABLE_TYPE_MEM_SHIFT) & IPA_TABLE_TYPE_MASK; \
-		iet   =  (hdl)                              & IPA_TABLE_TYPE_MASK; \
-		indx  = ((hdl) >> IPA_TABLE_TYPE_BITS)      & IPA_TABLE_INDX_MASK; \
-		indx += (iet) ? tbl->table_entries : 0; \
-		/*IPADBG("hdl(%u) -> mt(%u) iet(%u) indx(%u)\n", hdl, mt, iet, indx);*/ \
-	} while ( 0 )
-
-typedef int (*entry_validity_checker)(
-	void* entry);
-
-typedef uint16_t (*entry_next_index_getter)(
-	void* entry);
-
-typedef uint16_t (*entry_prev_index_getter)(
-	void*    entry,
-	uint16_t entry_index,
-	void*    meta,
-	uint16_t base_table_size);
-
-typedef void (*entry_prev_index_setter)(
-	void*    entry,
-	uint16_t entry_index,
-	uint16_t prev_index,
-	void*    meta,
-	uint16_t base_table_size);
-
-typedef int (*entry_head_inserter)(
-	void*     entry,
-	void*     user_data,
-	uint16_t* dma_command_data);
-
-typedef int (*entry_tail_inserter)(
-	void* entry,
-	void* user_data);
-
-typedef uint16_t (*entry_delete_head_dma_command_data_getter)(
-	void* head,
-	void* next_entry);
-
-typedef struct
-{
-	entry_validity_checker  entry_is_valid;
-	entry_next_index_getter entry_get_next_index;
-	entry_prev_index_getter entry_get_prev_index;
-	entry_prev_index_setter entry_set_prev_index;
-	entry_head_inserter     entry_head_insert;
-	entry_tail_inserter     entry_tail_insert;
-	entry_delete_head_dma_command_data_getter
-	  entry_get_delete_head_dma_command_data;
-} ipa_table_entry_interface;
-
-typedef enum
-{
-	HELP_UPDATE_HEAD  = 0,
-	HELP_UPDATE_ENTRY = 1,
-	HELP_DELETE_HEAD  = 2,
-
-	HELP_UPDATE_MAX,
-} dma_help_type;
-
-#undef VALID_DMA_HELP_TYPE
-#define VALID_DMA_HELP_TYPE(t) \
-	( (t) >=  HELP_UPDATE_HEAD && (t) < HELP_UPDATE_MAX )
-
-typedef struct
-{
-	uint32_t           offset;
-	ipa_table_dma_type table_type;
-	ipa_table_dma_type expn_table_type;
-	uint8_t            table_indx;
-} ipa_table_dma_cmd_helper;
-
-typedef struct
-{
-	char                       name[IPA_RESOURCE_NAME_MAX];
-
-	enum ipa3_nat_mem_in       nmi;
-
-	int                        entry_size;
-
-	uint16_t                   table_entries;
-	uint16_t                   expn_table_entries;
-	uint32_t                   tot_tbl_ents;
-
-	uint8_t*                   table_addr;
-	uint8_t*                   expn_table_addr;
-
-	uint16_t                   cur_tbl_cnt;
-	uint16_t                   cur_expn_tbl_cnt;
-
-	ipa_table_entry_interface* entry_interface;
-
-	ipa_table_dma_cmd_helper*  dma_help[HELP_UPDATE_MAX];
-
-	void*                      meta;
-	int                        meta_entry_size;
-} ipa_table;
-
-typedef struct
-{
-	uint16_t prev_index;
-	void*    prev_entry;
-
-	uint16_t curr_index;
-	void*    curr_entry;
-
-	uint16_t next_index;
-	void*    next_entry;
-} ipa_table_iterator;
-
-
-void ipa_table_init(
-	ipa_table*                 table,
-	const char*                table_name,
-	enum ipa3_nat_mem_in       nmi,
-	int                        entry_size,
-	void*                      meta,
-	int                        meta_entry_size,
-	ipa_table_entry_interface* entry_interface);
-
-int ipa_table_calculate_entries_num(
-	ipa_table*           table,
-	uint16_t             number_of_entries,
-	enum ipa3_nat_mem_in nmi);
-
-int ipa_table_calculate_size(
-	ipa_table* table);
-
-uint8_t* ipa_table_calculate_addresses(
-	ipa_table* table,
-	uint8_t*   base_addr);
-
-void ipa_table_reset(
-	ipa_table* table);
-
-int ipa_table_add_entry(
-	ipa_table*                  table,
-	void*                       user_data,
-	uint16_t*                   index,
-	uint32_t*                   rule_hdl,
-	struct ipa_ioc_nat_dma_cmd* cmd);
-
-void ipa_table_create_delete_command(
-	ipa_table*                  table,
-	struct ipa_ioc_nat_dma_cmd* cmd,
-	ipa_table_iterator*         iterator);
-
-void ipa_table_delete_entry(
-	ipa_table*          table,
-	ipa_table_iterator* iterator,
-	uint8_t             is_prev_empty);
-
-void ipa_table_erase_entry(
-	ipa_table* table,
-	uint16_t   index);
-
-int ipa_table_get_entry(
-	ipa_table* table,
-	uint32_t   entry_handle,
-	void**     entry,
-	uint16_t*  entry_index);
-
-void* ipa_table_get_entry_by_index(
-	ipa_table* table,
-	uint16_t   index);
-
-void ipa_table_dma_cmd_helper_init(
-	ipa_table_dma_cmd_helper* dma_cmd_helper,
-	uint8_t                   table_indx,
-	ipa_table_dma_type        table_type,
-	ipa_table_dma_type        expn_table_type,
-	uint32_t                  offset);
-
-void ipa_table_dma_cmd_generate(
-	ipa_table_dma_cmd_helper*   dma_cmd_helper,
-	uint8_t                     is_expn,
-	uint32_t                    entry_offset,
-	uint16_t                    data,
-	struct ipa_ioc_nat_dma_cmd* cmd);
-
-int ipa_table_iterator_init(
-	ipa_table_iterator* iterator,
-	ipa_table*          table,
-	void*               curr_entry,
-	uint16_t            curr_index);
-
-int ipa_table_iterator_next(
-	ipa_table_iterator* iterator,
-	ipa_table*          table);
-
-int ipa_table_iterator_end(
-	ipa_table_iterator* iterator,
-	ipa_table*          table,
-	uint16_t            head_index,
-	void*               head);
-
-int ipa_table_iterator_is_head_with_tail(
-	ipa_table_iterator* iterator);
-
-int ipa_calc_num_sram_table_entries(
-	uint32_t  sram_size,
-	uint32_t  table1_ent_size,
-	uint32_t  table2_ent_size,
-	uint16_t* num_entries_ptr);
-
-typedef int (*ipa_table_walk_cb)(
-	ipa_table*      table_ptr,
-	uint32_t        rule_hdl,
-	void*           record_ptr,
-	uint16_t        record_index,
-	void*           meta_record_ptr,
-	uint16_t        meta_record_index,
-	void*           arb_data_ptr );
-
-typedef enum
-{
-	WHEN_SLOT_EMPTY  = 0,
-	WHEN_SLOT_FILLED = 1,
-
-	WHEN_SLOT_MAX
-} When2Callback;
-
-#define VALID_WHEN2CALLBACK(w) \
-	( (w) >= WHEN_SLOT_EMPTY && (w) < WHEN_SLOT_MAX )
-
-int ipa_table_walk(
-	ipa_table*        table,
-	uint16_t          start_index,
-	When2Callback     when,
-	ipa_table_walk_cb walk_cb,
-	void*             arb_data_ptr );
-
-int ipa_table_add_dma_cmd(
-	ipa_table*                  tbl_ptr,
-	dma_help_type               help_type,
-	void*                       rec_ptr,
-	uint16_t                    rec_index,
-	uint16_t                    data_for_entry,
-	struct ipa_ioc_nat_dma_cmd* cmd_ptr );
-
-#endif
diff --git a/ipanat/src/Makefile.am b/ipanat/src/Makefile.am
deleted file mode 100644
index a96fc3c..0000000
--- a/ipanat/src/Makefile.am
+++ /dev/null
@@ -1,37 +0,0 @@
-ACLOCAL_AMFLAGS = -I m4
-AUTOMAKE_OPTIONS = foreign
-
-AM_CFLAGS = -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -I../inc
-#AM_CFLAGS += -g -DDEBUG -DNAT_DEBUG
-
-common_CFLAGS =  -DUSE_GLIB @GLIB_CFLAGS@
-common_LDFLAGS = -lrt @GLIB_LIBS@
-
-library_includedir = $(pkgincludedir)
-
-cpp_sources = ipa_nat_map.cpp
-
-c_sources   = ipa_nat_drv.c \
-              ipa_nat_drvi.c \
-              ipa_nat_utils.c \
-              ipa_table.c \
-              ipa_mem_descriptor.c \
-              ipa_ipv6ct.c \
-              ipa_nat_statemach.c
-
-library_include_HEADERS = ../inc/ipa_nat_drvi.h \
-                          ../inc/ipa_nat_drv.h \
-                          ../inc/ipa_nat_utils.h \
-                          ../inc/ipa_table.h \
-                          ../inc/ipa_mem_descriptor.h \
-                          ../inc/ipa_ipv6ct.h \
-                          ../inc/ipa_nat_statemach.h \
-                          ../inc/ipa_nat_map.h
-
-lib_LTLIBRARIES = libipanat.la
-libipanat_la_C = @C@
-libipanat_la_CC = @CC@
-libipanat_la_SOURCES = $(c_sources) $(cpp_sources)
-libipanat_la_CFLAGS = $(AM_CFLAGS) $(common_CFLAGS)
-libipanat_la_CXXFLAGS = $(AM_CFLAGS) $(common_CPPFLAGS)
-libipanat_la_LDFLAGS = -shared $(common_LDFLAGS) -version-info 1:0:0
diff --git a/ipanat/src/configure.ac b/ipanat/src/configure.ac
deleted file mode 100644
index 3884ac7..0000000
--- a/ipanat/src/configure.ac
+++ /dev/null
@@ -1,85 +0,0 @@
-#                                               -*- Autoconf -*-
-# Process this file with autoconf to produce a configure script.
-
-AC_PREREQ([2.65])
-AC_INIT(data-ipanat, 1.0.0)
-AM_INIT_AUTOMAKE(data-ipanat, 1.0.0)
-AC_OUTPUT(Makefile)
-AC_CONFIG_SRCDIR([ipa_nat_drv.c])
-AC_CONFIG_HEADERS([config.h])
-AC_CONFIG_MACRO_DIR([m4])
-
-# Checks for programs.
-AC_PROG_CC
-AC_PROG_LIBTOOL
-AC_PROG_CXX
-
-# Checks for libraries.
-
-AC_ARG_WITH(sanitized-headers,
-      AS_HELP_STRING([--with-sanitized-headers=DIR],
-         [Specify the location of the sanitized Linux headers]),
-      [CPPFLAGS="$CPPFLAGS -idirafter $withval"])
-AM_CONDITIONAL(KERNELMODULES, [test -n -eq 0])
-
-AC_ARG_WITH([glib],
-      AC_HELP_STRING([--with-glib],
-         [enable glib, building HLOS systems which use glib]))
-
-if (test "x${with_glib}" = "xyes"); then
-        AC_DEFINE(ENABLE_USEGLIB, 1, [Define if HLOS systems uses glib])
-        PKG_CHECK_MODULES(GTHREAD, gthread-2.0 >= 2.16, dummy=yes,
-                                AC_MSG_ERROR(GThread >= 2.16 is required))
-        PKG_CHECK_MODULES(GLIB, glib-2.0 >= 2.16, dummy=yes,
-                                AC_MSG_ERROR(GLib >= 2.16 is required))
-        GLIB_CFLAGS="$GLIB_CFLAGS $GTHREAD_CFLAGS"
-        GLIB_LIBS="$GLIB_LIBS $GTHREAD_LIBS"
-        AC_SUBST(GLIB_CFLAGS)
-        AC_SUBST(GLIB_LIBS)
-fi
-
-AM_CONDITIONAL(USE_GLIB, test "x${with_glib}" = "xyes")
-
-AC_ARG_ENABLE(target,
-    [AS_HELP_STRING([--enable-target=TARGET], [Specify the target product to build])],
-    [TARGET=$enableval],
-    [TARGET=none]
-)
-
-if test "x$TARGET" = "xsdx20"; then
-    echo "\n UL firewall feature enabled\n"
-    CPPFLAGS="${CPPFLAGS} -DFEATURE_IPACM_UL_FIREWALL -DFEATURE_IPACM_PER_CLIENT_STATS"
-    CFLAGS="${CFLAGS} -DFEATURE_IPACM_UL_FIREWALL -DFEATURE_IPACM_PER_CLIENT_STATS"
-fi
-
-if test "x$TARGET" = "xsdxpoorwills"; then
-    echo "\n UL firewall feature enabled\n"
-    CPPFLAGS="${CPPFLAGS} -DFEATURE_IPACM_UL_FIREWALL -DFEATURE_IPACM_PER_CLIENT_STATS -DFEATURE_VLAN_MPDN -DFEATURE_L2TP"
-    CFLAGS="${CFLAGS} -DFEATURE_IPACM_UL_FIREWALL -DFEATURE_IPACM_PER_CLIENT_STATS -DFEATURE_VLAN_MPDN -DFEATURE_L2TP"
-fi
-
-if test "x$TARGET" = "xsdxprairie"; then
-    echo "\n UL firewall feature enabled\n"
-    CPPFLAGS="${CPPFLAGS} -DFEATURE_IPACM_UL_FIREWALL -DFEATURE_IPACM_PER_CLIENT_STATS -DFEATURE_VLAN_MPDN"
-    CFLAGS="${CFLAGS} -DFEATURE_IPACM_UL_FIREWALL -DFEATURE_IPACM_PER_CLIENT_STATS -DFEATURE_VLAN_MPDN"
-fi
-
-if test "x$TARGET" = "xsdxlemur"; then
-    echo "\n UL firewall feature enabled\n"
-    CPPFLAGS="${CPPFLAGS} -DFEATURE_IPACM_UL_FIREWALL -DFEATURE_IPACM_PER_CLIENT_STATS -DFEATURE_VLAN_MPDN"
-    CFLAGS="${CFLAGS} -DFEATURE_IPACM_UL_FIREWALL -DFEATURE_IPACM_PER_CLIENT_STATS -DFEATURE_VLAN_MPDN"
-fi
-AM_CONDITIONAL(NO_L2TP, test "x$TARGET" = "xsdx20" || test "x$TARGET" = "xsdxpoorwills" || test "x$TARGET" = "xsdxprairie" || test "x$TARGET" = "xsdxlemur")
-
-# Checks for header files.
-AC_CHECK_HEADERS([fcntl.h netinet/in.h sys/ioctl.h unistd.h])
-
-# Checks for typedefs, structures, and compiler characteristics.
-AC_TYPE_OFF_T
-
-# Checks for library functions.
-AC_FUNC_MALLOC
-AC_FUNC_MMAP
-AC_CHECK_FUNCS([memset munmap])
-
-AC_OUTPUT
diff --git a/ipanat/src/ipa_ipv6ct.c b/ipanat/src/ipa_ipv6ct.c
deleted file mode 100644
index 45e454c..0000000
--- a/ipanat/src/ipa_ipv6ct.c
+++ /dev/null
@@ -1,933 +0,0 @@
-/*
- * Copyright (c) 2018-2020 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * Changes from Qualcomm Innovation Center are provided under the following license:
- *
- * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted (subject to the limitations in the
- * disclaimer below) provided that the following conditions are met:
- *
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *
- *     * Neither the name of Qualcomm Innovation Center, Inc. nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
- * GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
- * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
- * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
- * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
- */
-#include "ipa_ipv6ct.h"
-#include "ipa_ipv6cti.h"
-
-#include <sys/ioctl.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <pthread.h>
-#include <unistd.h>
-#include <linux/msm_ipa.h>
-
-#define IPA_IPV6CT_DEBUG_FILE_PATH "/sys/kernel/debug/ipa/ipv6ct"
-#define IPA_UC_ACT_DEBUG_FILE_PATH "/sys/kernel/debug/ipa/uc_act_table"
-#define IPA_IPV6CT_TABLE_NAME "IPA IPv6CT table"
-#define IPA_MAX_DMA_ENTRIES_FOR_ADD 2
-#define IPA_MAX_DMA_ENTRIES_FOR_DEL 2
-
-static int ipa_ipv6ct_create_table(ipa_ipv6ct_table* ipv6ct_table, uint16_t number_of_entries, uint8_t table_index);
-static int ipa_ipv6ct_destroy_table(ipa_ipv6ct_table* ipv6ct_table);
-static void ipa_ipv6ct_create_table_dma_cmd_helpers(ipa_ipv6ct_table* ipv6ct_table, uint8_t table_indx);
-static int ipa_ipv6ct_post_init_cmd(ipa_ipv6ct_table* ipv6ct_table, uint8_t tbl_index);
-static int ipa_ipv6ct_post_dma_cmd(struct ipa_ioc_nat_dma_cmd* cmd);
-static uint16_t ipa_ipv6ct_hash(const ipa_ipv6ct_rule* rule, uint16_t size);
-static uint16_t ipa_ipv6ct_xor_segments(uint64_t num);
-
-static int table_entry_is_valid(void* entry);
-static uint16_t table_entry_get_next_index(void* entry);
-static uint16_t table_entry_get_prev_index(void* entry, uint16_t entry_index, void* meta, uint16_t base_table_size);
-static void table_entry_set_prev_index(void* entry, uint16_t entry_index, uint16_t prev_index,
-	void* meta, uint16_t base_table_size);
-static int table_entry_head_insert(void* entry, void* user_data, uint16_t* dma_command_data);
-static int table_entry_tail_insert(void* entry, void* user_data);
-static uint16_t table_entry_get_delete_head_dma_command_data(void* head, void* next_entry);
-
-static ipa_ipv6ct ipv6ct;
-static pthread_mutex_t ipv6ct_mutex = PTHREAD_MUTEX_INITIALIZER;
-
-static ipa_table_entry_interface entry_interface =
-{
-	table_entry_is_valid,
-	table_entry_get_next_index,
-	table_entry_get_prev_index,
-	table_entry_set_prev_index,
-	table_entry_head_insert,
-	table_entry_tail_insert,
-	table_entry_get_delete_head_dma_command_data
-};
-
-/**
- * ipa_ipv6ct_add_tbl() - Adds a new IPv6CT table
- * @number_of_entries: [in] number of IPv6CT entries
- * @table_handle: [out] handle of new IPv6CT table
- *
- * This function creates new IPv6CT table and posts IPv6CT init command to HW
- *
- * Returns:	0  On Success, negative on failure
- */
-int ipa_ipv6ct_add_tbl(uint16_t number_of_entries, uint32_t* table_handle)
-{
-	int ret;
-	ipa_ipv6ct_table* ipv6ct_table;
-
-	IPADBG("\n");
-
-	if (table_handle == NULL || number_of_entries == 0)
-	{
-		IPAERR("Invalid parameters table_handle=%pK number_of_entries=%d\n", table_handle, number_of_entries);
-		return -EINVAL;
-	}
-
-	*table_handle = 0;
-
-	if (ipv6ct.table_cnt >= IPA_IPV6CT_MAX_TBLS)
-	{
-		IPAERR("Can't add addition IPv6 connection tracking table. Maximum %d tables allowed\n", IPA_IPV6CT_MAX_TBLS);
-		return -EINVAL;
-	}
-
-	if (!ipv6ct.ipa_desc)
-	{
-		ipv6ct.ipa_desc = ipa_descriptor_open();
-		if (ipv6ct.ipa_desc == NULL)
-		{
-			IPAERR("failed to open IPA driver file descriptor\n");
-			return -EIO;
-		}
-	}
-
-	if (ipv6ct.ipa_desc->ver < IPA_HW_v4_0)
-	{
-		IPAERR("IPv6 connection tracking isn't supported for IPA version %d\n", ipv6ct.ipa_desc->ver);
-		ret = -EPERM;
-		goto bail_ipa_desc;
-	}
-
-	ipv6ct_table = &ipv6ct.tables[ipv6ct.table_cnt];
-	ret = ipa_ipv6ct_create_table(ipv6ct_table, number_of_entries, ipv6ct.table_cnt);
-	if (ret)
-	{
-		IPAERR("unable to create ipv6ct table Error: %d\n", ret);
-		goto bail_ipa_desc;
-	}
-
-	/* Initialize the ipa hw with ipv6ct table dimensions */
-	ret = ipa_ipv6ct_post_init_cmd(ipv6ct_table, ipv6ct.table_cnt);
-	if (ret)
-	{
-		IPAERR("unable to post ipv6ct_init command Error %d\n", ret);
-		goto bail_ipv6ct_table;
-	}
-
-	/* Return table handle */
-	++ipv6ct.table_cnt;
-	*table_handle = ipv6ct.table_cnt;
-
-	IPADBG("Returning table handle 0x%x\n", *table_handle);
-	return 0;
-
-bail_ipv6ct_table:
-	ipa_ipv6ct_destroy_table(ipv6ct_table);
-bail_ipa_desc:
-	if (!ipv6ct.table_cnt) {
-		ipa_descriptor_close(ipv6ct.ipa_desc);
-		ipv6ct.ipa_desc = NULL;
-	}
-	return ret;
-}
-
-int ipa_ipv6ct_del_tbl(uint32_t table_handle)
-{
-	ipa_ipv6ct_table* ipv6ct_table;
-	int ret;
-
-	IPADBG("\n");
-
-	if (ipv6ct.ipa_desc->ver < IPA_HW_v4_0)
-	{
-		IPAERR("IPv6 connection tracking isn't supported for IPA version %d\n", ipv6ct.ipa_desc->ver);
-		return -EINVAL;
-	}
-
-	if (table_handle == IPA_TABLE_INVALID_ENTRY || table_handle > IPA_IPV6CT_MAX_TBLS)
-	{
-		IPAERR("invalid table handle %d passed\n", table_handle);
-		return -EINVAL;
-	}
-	IPADBG("Passed Table Handle: 0x%x\n", table_handle);
-
-	if (pthread_mutex_lock(&ipv6ct_mutex))
-	{
-		IPAERR("unable to lock the ipv6ct mutex\n");
-		return -EINVAL;
-	}
-
-	ipv6ct_table = &ipv6ct.tables[table_handle - 1];
-	if (!ipv6ct_table->mem_desc.valid)
-	{
-		IPAERR("invalid table handle %d\n", table_handle);
-		ret = -EINVAL;
-		goto unlock;
-	}
-
-	ret = ipa_ipv6ct_destroy_table(ipv6ct_table);
-	if (ret)
-	{
-		IPAERR("unable to delete IPV6CT table with handle %d\n", table_handle);
-		goto unlock;
-	}
-
-	if (!--ipv6ct.table_cnt) {
-		ipa_descriptor_close(ipv6ct.ipa_desc);
-		ipv6ct.ipa_desc = NULL;
-	}
-
-unlock:
-	if (pthread_mutex_unlock(&ipv6ct_mutex))
-	{
-		IPAERR("unable to unlock the ipv6ct mutex\n");
-		return (ret) ? ret : -EPERM;
-	}
-
-	IPADBG("return\n");
-	return ret;
-}
-
-int ipa_ipv6ct_add_rule(uint32_t table_handle, const ipa_ipv6ct_rule* user_rule, uint32_t* rule_handle)
-{
-	int ret;
-	ipa_ipv6ct_table* ipv6ct_table;
-	uint16_t new_entry_index;
-	uint32_t new_entry_handle;
-	uint32_t cmd_sz = sizeof(struct ipa_ioc_nat_dma_cmd) +
-		(IPA_MAX_DMA_ENTRIES_FOR_ADD * sizeof(struct ipa_ioc_nat_dma_one));
-	char cmd_buf[cmd_sz];
-	struct ipa_ioc_nat_dma_cmd* cmd;
-
-	IPADBG("\n");
-
-	if (ipv6ct.ipa_desc->ver < IPA_HW_v4_0)
-	{
-		IPAERR("IPv6 connection tracking isn't supported for IPA version %d\n", ipv6ct.ipa_desc->ver);
-		return -EINVAL;
-	}
-
-	if (table_handle == IPA_TABLE_INVALID_ENTRY || table_handle > IPA_IPV6CT_MAX_TBLS ||
-		rule_handle == NULL || user_rule == NULL)
-	{
-		IPAERR("Invalid parameters table_handle=%d rule_handle=%pK user_rule=%pK\n",
-			table_handle, rule_handle, user_rule);
-		return -EINVAL;
-	}
-	IPADBG("Passed Table handle: 0x%x\n", table_handle);
-
-	if (user_rule->protocol == IPA_IPV6CT_INVALID_PROTO_FIELD_CMP)
-	{
-		IPAERR("invalid parameter protocol=%d\n", user_rule->protocol);
-		return -EINVAL;
-	}
-
-	if (pthread_mutex_lock(&ipv6ct_mutex))
-	{
-		IPAERR("unable to lock the ipv6ct mutex\n");
-		return -EINVAL;
-	}
-
-	ipv6ct_table = &ipv6ct.tables[table_handle - 1];
-	if (!ipv6ct_table->mem_desc.valid)
-	{
-		IPAERR("invalid table handle %d\n", table_handle);
-		ret = -EINVAL;
-		goto unlock;
-	}
-
-	memset(cmd_buf, 0, sizeof(cmd_buf));
-	cmd = (struct ipa_ioc_nat_dma_cmd*) cmd_buf;
-	cmd->entries = 0;
-	new_entry_index = ipa_ipv6ct_hash(user_rule, ipv6ct_table->table.table_entries - 1);
-
-	ret = ipa_table_add_entry(&ipv6ct_table->table, (void*)user_rule, &new_entry_index, &new_entry_handle, cmd);
-	if (ret)
-	{
-		IPAERR("failed to add a new IPV6CT entry\n");
-		goto unlock;
-	}
-
-	ret = ipa_ipv6ct_post_dma_cmd(cmd);
-	if (ret)
-	{
-		IPAERR("unable to post dma command\n");
-		goto bail;
-	}
-
-	if (pthread_mutex_unlock(&ipv6ct_mutex))
-	{
-		IPAERR("unable to unlock the ipv6ct mutex\n");
-		return -EPERM;
-	}
-
-	*rule_handle = new_entry_handle;
-
-	IPADBG("return\n");
-	return 0;
-
-bail:
-	ipa_table_erase_entry(&ipv6ct_table->table, new_entry_index);
-unlock:
-	if (pthread_mutex_unlock(&ipv6ct_mutex))
-		IPAERR("unable to unlock the ipv6ct mutex\n");
-	return ret;
-}
-
-int ipa_ipv6ct_del_rule(uint32_t table_handle, uint32_t rule_handle)
-{
-	ipa_ipv6ct_table* ipv6ct_table;
-	ipa_table_iterator table_iterator;
-	ipa_ipv6ct_hw_entry* entry;
-	uint32_t cmd_sz = sizeof(struct ipa_ioc_nat_dma_cmd) +
-		(IPA_MAX_DMA_ENTRIES_FOR_DEL * sizeof(struct ipa_ioc_nat_dma_one));
-	char cmd_buf[cmd_sz];
-	struct ipa_ioc_nat_dma_cmd* cmd;
-	uint16_t index;
-	int ret;
-
-	IPADBG("\n");
-
-	if (ipv6ct.ipa_desc->ver < IPA_HW_v4_0)
-	{
-		IPAERR("IPv6 connection tracking isn't supported for IPA version %d\n", ipv6ct.ipa_desc->ver);
-		return -EINVAL;
-	}
-
-	if (table_handle == IPA_TABLE_INVALID_ENTRY || table_handle > IPA_IPV6CT_MAX_TBLS ||
-		rule_handle == IPA_TABLE_INVALID_ENTRY)
-	{
-		IPAERR("Invalid parameters table_handle=%d rule_handle=%d\n", table_handle, rule_handle);
-		return -EINVAL;
-	}
-	IPADBG("Passed Table: 0x%x and rule handle 0x%x\n", table_handle, rule_handle);
-
-	if (pthread_mutex_lock(&ipv6ct_mutex))
-	{
-		IPAERR("unable to lock the ipv6ct mutex\n");
-		return -EINVAL;
-	}
-
-	ipv6ct_table = &ipv6ct.tables[table_handle - 1];
-	if (!ipv6ct_table->mem_desc.valid)
-	{
-		IPAERR("invalid table handle %d\n", table_handle);
-		ret = -EINVAL;
-		goto unlock;
-	}
-
-	ret = ipa_table_get_entry(&ipv6ct_table->table, rule_handle, (void**)&entry, &index);
-	if (ret)
-	{
-		IPAERR("unable to retrive the entry with handle=%d in IPV6CT table with handle=%d\n",
-			rule_handle, table_handle);
-		goto unlock;
-	}
-
-	ret = ipa_table_iterator_init(&table_iterator, &ipv6ct_table->table, entry, index);
-	if (ret)
-	{
-		IPAERR("unable to create iterator which points to the entry index=%d in IPV6CT table with handle=%d\n",
-			index, table_handle);
-		goto unlock;
-	}
-
-	memset(cmd_buf, 0, sizeof(cmd_buf));
-	cmd = (struct ipa_ioc_nat_dma_cmd*) cmd_buf;
-	cmd->entries = 0;
-
-	ipa_table_create_delete_command(&ipv6ct_table->table, cmd, &table_iterator);
-
-	ret = ipa_ipv6ct_post_dma_cmd(cmd);
-	if (ret)
-	{
-		IPAERR("unable to post dma command\n");
-		goto unlock;
-	}
-
-	if (!ipa_table_iterator_is_head_with_tail(&table_iterator))
-	{
-		/* The entry can be deleted */
-		uint8_t is_prev_empty = (table_iterator.prev_entry != NULL &&
-			((ipa_ipv6ct_hw_entry*)table_iterator.prev_entry)->protocol == IPA_IPV6CT_INVALID_PROTO_FIELD_CMP);
-		ipa_table_delete_entry(&ipv6ct_table->table, &table_iterator, is_prev_empty);
-	}
-
-unlock:
-	if (pthread_mutex_unlock(&ipv6ct_mutex))
-	{
-		IPAERR("unable to unlock the ipv6ct mutex\n");
-		return (ret) ? ret : -EPERM;
-	}
-
-	IPADBG("return\n");
-	return ret;
-}
-
-int ipa_ipv6ct_query_timestamp(uint32_t table_handle, uint32_t rule_handle, uint32_t* time_stamp)
-{
-	int ret;
-	ipa_ipv6ct_table* ipv6ct_table;
-	ipa_ipv6ct_hw_entry *entry;
-
-	IPADBG("\n");
-
-	if (ipv6ct.ipa_desc->ver < IPA_HW_v4_0)
-	{
-		IPAERR("IPv6 connection tracking isn't supported for IPA version %d\n", ipv6ct.ipa_desc->ver);
-		return -EINVAL;
-	}
-
-	if (table_handle == IPA_TABLE_INVALID_ENTRY || table_handle > IPA_IPV6CT_MAX_TBLS ||
-		rule_handle == IPA_TABLE_INVALID_ENTRY || time_stamp == NULL)
-	{
-		IPAERR("invalid parameters passed table_handle=%d rule_handle=%d time_stamp=%pK\n",
-			table_handle, rule_handle, time_stamp);
-		return -EINVAL;
-	}
-	IPADBG("Passed Table: %d and rule handle %d\n", table_handle, rule_handle);
-
-	if (pthread_mutex_lock(&ipv6ct_mutex))
-	{
-		IPAERR("unable to lock the ipv6ct mutex\n");
-		return -EINVAL;
-	}
-
-	ipv6ct_table = &ipv6ct.tables[table_handle - 1];
-	if (!ipv6ct_table->mem_desc.valid)
-	{
-		IPAERR("invalid table handle %d\n", table_handle);
-		ret = -EINVAL;
-		goto unlock;
-	}
-
-	ret = ipa_table_get_entry(&ipv6ct_table->table, rule_handle, (void**)&entry, NULL);
-	if (ret)
-	{
-		IPAERR("unable to retrive the entry with handle=%d in IPV6CT table with handle=%d\n",
-			rule_handle, table_handle);
-		goto unlock;
-	}
-
-	*time_stamp = entry->time_stamp;
-
-unlock:
-	if (pthread_mutex_unlock(&ipv6ct_mutex))
-	{
-		IPAERR("unable to unlock the ipv6ct mutex\n");
-		return (ret) ? ret : -EPERM;
-	}
-
-	IPADBG("return\n");
-	return ret;
-}
-
-/**
-* ipv6ct_hash() - Find the index into ipv6ct table
-* @rule: [in] an IPv6CT rule
-* @size: [in] size of the IPv6CT table
-*
-* This hash method is used to find the hash index of an entry into IPv6CT table.
-* In case of result zero, N-1 will be returned, where N is size of IPv6CT table.
-*
-* Returns: >0 index into IPv6CT table, negative on failure
-*/
-static uint16_t ipa_ipv6ct_hash(const ipa_ipv6ct_rule* rule, uint16_t size)
-{
-	uint16_t hash = 0;
-
-	IPADBG("src_ipv6_lsb 0x%llx\n", rule->src_ipv6_lsb);
-	IPADBG("src_ipv6_msb 0x%llx\n", rule->src_ipv6_msb);
-	IPADBG("dest_ipv6_lsb 0x%llx\n", rule->dest_ipv6_lsb);
-	IPADBG("dest_ipv6_msb 0x%llx\n", rule->dest_ipv6_msb);
-	IPADBG("src_port: 0x%x dest_port: 0x%x\n", rule->src_port, rule->dest_port);
-	IPADBG("protocol: 0x%x size: 0x%x\n", rule->protocol, size);
-
-	hash ^= ipa_ipv6ct_xor_segments(rule->src_ipv6_lsb);
-	hash ^= ipa_ipv6ct_xor_segments(rule->src_ipv6_msb);
-	hash ^= ipa_ipv6ct_xor_segments(rule->dest_ipv6_lsb);
-	hash ^= ipa_ipv6ct_xor_segments(rule->dest_ipv6_msb);
-
-	hash ^= rule->src_port;
-	hash ^= rule->dest_port;
-	hash ^= rule->protocol;
-
-	/*
-	 * The size passed to hash function expected be power^2-1, while the actual size is power^2,
-	 * actual_size = size + 1
-	 */
-	hash &= size;
-
-	/* If the hash resulted to zero then set it to maximum value as zero is unused entry in ipv6ct table */
-	if (hash == 0)
-	{
-		hash = size;
-	}
-
-	IPADBG("ipa_ipv6ct_hash returning value: %d\n", hash);
-	return hash;
-}
-
-static uint16_t ipa_ipv6ct_xor_segments(uint64_t num)
-{
-	const uint64_t mask = 0xffff;
-	const size_t bits_in_two_byte = 16;
-	uint16_t ret = 0;
-
-	IPADBG("\n");
-
-	while (num)
-	{
-		ret ^= (uint16_t)(num & mask);
-		num >>= bits_in_two_byte;
-	}
-
-	IPADBG("return\n");
-	return ret;
-}
-
-static int table_entry_is_valid(void* entry)
-{
-	ipa_ipv6ct_hw_entry* ipv6ct_entry = (ipa_ipv6ct_hw_entry*)entry;
-
-	IPADBG("\n");
-
-	return ipv6ct_entry->enable;
-}
-
-static uint16_t table_entry_get_next_index(void* entry)
-{
-	uint16_t result;
-	ipa_ipv6ct_hw_entry* ipv6ct_entry = (ipa_ipv6ct_hw_entry*)entry;
-
-	IPADBG("\n");
-
-	result = ipv6ct_entry->next_index;
-
-	IPADBG("Next entry of %pK is %d\n", entry, result);
-	return result;
-}
-
-static uint16_t table_entry_get_prev_index(void* entry, uint16_t entry_index, void* meta, uint16_t base_table_size)
-{
-	uint16_t result;
-	ipa_ipv6ct_hw_entry* ipv6ct_entry = (ipa_ipv6ct_hw_entry*)entry;
-
-	IPADBG("\n");
-
-	result = ipv6ct_entry->prev_index;
-
-	IPADBG("Previous entry of %d is %d\n", entry_index, result);
-	return result;
-}
-
-static void table_entry_set_prev_index(void* entry, uint16_t entry_index, uint16_t prev_index,
-	void* meta, uint16_t base_table_size)
-{
-	ipa_ipv6ct_hw_entry* ipv6ct_entry = (ipa_ipv6ct_hw_entry*)entry;
-
-	IPADBG("Previous entry of %d is %d\n", entry_index, prev_index);
-
-	ipv6ct_entry->prev_index = prev_index;
-
-	IPADBG("return\n");
-}
-
-static int table_entry_copy_from_user(void* entry, void* user_data)
-{
-	ipa_ipv6ct_hw_entry* ipv6ct_entry = (ipa_ipv6ct_hw_entry*)entry;
-	const ipa_ipv6ct_rule* user_rule = (const ipa_ipv6ct_rule*)user_data;
-
-	IPADBG("\n");
-
-	ipv6ct_entry->src_ipv6_lsb = user_rule->src_ipv6_lsb;
-	ipv6ct_entry->src_ipv6_msb = user_rule->src_ipv6_msb;
-	ipv6ct_entry->dest_ipv6_lsb = user_rule->dest_ipv6_lsb;
-	ipv6ct_entry->dest_ipv6_msb = user_rule->dest_ipv6_msb;
-	ipv6ct_entry->protocol = user_rule->protocol;
-	ipv6ct_entry->src_port = user_rule->src_port;
-	ipv6ct_entry->dest_port = user_rule->dest_port;
-	ipv6ct_entry->ucp = user_rule->ucp;
-	ipv6ct_entry->uc_activation_index = user_rule->uc_activation_index;
-	ipv6ct_entry->s = user_rule->s;
-
-	switch (user_rule->direction_settings)
-	{
-	case IPA_IPV6CT_DIRECTION_DENY_ALL:
-		break;
-	case IPA_IPV6CT_DIRECTION_ALLOW_OUT:
-		ipv6ct_entry->out_allowed = IPA_IPV6CT_DIRECTION_ALLOW_BIT;
-		break;
-	case IPA_IPV6CT_DIRECTION_ALLOW_IN:
-		ipv6ct_entry->in_allowed = IPA_IPV6CT_DIRECTION_ALLOW_BIT;
-		break;
-	case IPA_IPV6CT_DIRECTION_ALLOW_ALL:
-		ipv6ct_entry->out_allowed = IPA_IPV6CT_DIRECTION_ALLOW_BIT;
-		ipv6ct_entry->in_allowed = IPA_IPV6CT_DIRECTION_ALLOW_BIT;
-		break;
-	default:
-		IPAERR("wrong value for IPv6CT direction setting parameter %d\n", user_rule->direction_settings);
-		return -EINVAL;
-	}
-
-	IPADBG("return\n");
-	return 0;
-}
-
-static int table_entry_head_insert(void* entry, void* user_data, uint16_t* dma_command_data)
-{
-	int ret;
-
-	IPADBG("\n");
-
-	ret = table_entry_copy_from_user(entry, user_data);
-	if (ret)
-	{
-		IPAERR("unable to copy from user a new entry\n");
-		return ret;
-	}
-
-	*dma_command_data = 0;
-	((ipa_ipv6ct_flags*)dma_command_data)->enable = IPA_IPV6CT_FLAG_ENABLE_BIT;
-
-	IPADBG("return\n");
-	return 0;
-}
-
-static int table_entry_tail_insert(void* entry, void* user_data)
-{
-	int ret;
-
-	IPADBG("\n");
-
-	ret = table_entry_copy_from_user(entry, user_data);
-	if (ret)
-	{
-		IPAERR("unable to copy from user a new entry\n");
-		return ret;
-	}
-
-	((ipa_ipv6ct_hw_entry*)entry)->enable = IPA_IPV6CT_FLAG_ENABLE_BIT;
-
-	IPADBG("return\n");
-	return 0;
-}
-
-static uint16_t table_entry_get_delete_head_dma_command_data(void* head, void* next_entry)
-{
-	IPADBG("\n");
-	return IPA_IPV6CT_INVALID_PROTO_FIELD_VALUE;
-}
-
-/**
- * ipa_ipv6ct_create_table() - Creates a new IPv6CT table
- * @ipv6ct_table: [in] IPv6CT table
- * @number_of_entries: [in] number of IPv6CT entries
- * @table_index: [in] the index of the IPv6CT table
- *
- * This function creates new IPv6CT table:
- * - Initializes table, memory descriptor and table_dma_cmd_helpers structures
- * - Allocates, maps and clears the memory for table
- *
- * Returns:	0  On Success, negative on failure
- */
-static int ipa_ipv6ct_create_table(ipa_ipv6ct_table* ipv6ct_table, uint16_t number_of_entries, uint8_t table_index)
-{
-	int ret, size;
-
-	IPADBG("\n");
-
-	ipa_table_init(
-		&ipv6ct_table->table, IPA_IPV6CT_TABLE_NAME, IPA_NAT_MEM_IN_DDR,
-		sizeof(ipa_ipv6ct_hw_entry), NULL, 0, &entry_interface);
-
-	ret = ipa_table_calculate_entries_num(
-		&ipv6ct_table->table, number_of_entries, IPA_NAT_MEM_IN_DDR);
-
-	if (ret)
-	{
-		IPAERR("unable to calculate number of entries in ipv6ct table %d, while required by user %d\n",
-			table_index, number_of_entries);
-		return ret;
-	}
-
-	size = ipa_table_calculate_size(&ipv6ct_table->table);
-	IPADBG("IPv6CT table size: %d\n", size);
-
-	ipa_mem_descriptor_init(
-		&ipv6ct_table->mem_desc,
-		IPA_IPV6CT_DEV_NAME,
-		size,
-		table_index,
-		IPA_IOC_ALLOC_IPV6CT_TABLE,
-		IPA_IOC_DEL_IPV6CT_TABLE,
-		false); /* false here means don't consider using sram */
-
-	ret = ipa_mem_descriptor_allocate_memory(
-		&ipv6ct_table->mem_desc,
-		ipv6ct.ipa_desc->fd);
-
-	if (ret)
-	{
-		IPAERR("unable to allocate ipv6ct memory descriptor Error: %d\n", ret);
-		goto bail;
-	}
-
-	ipa_table_calculate_addresses(&ipv6ct_table->table, ipv6ct_table->mem_desc.base_addr);
-
-	ipa_table_reset(&ipv6ct_table->table);
-
-	ipa_ipv6ct_create_table_dma_cmd_helpers(ipv6ct_table, table_index);
-
-	IPADBG("return\n");
-	return 0;
-
-bail:
-	memset(ipv6ct_table, 0, sizeof(*ipv6ct_table));
-	return ret;
-}
-
-static int ipa_ipv6ct_destroy_table(ipa_ipv6ct_table* ipv6ct_table)
-{
-	int ret;
-
-	IPADBG("\n");
-
-	ret = ipa_mem_descriptor_delete(&ipv6ct_table->mem_desc, ipv6ct.ipa_desc->fd);
-	if (ret)
-		IPAERR("unable to delete IPV6CT descriptor\n");
-
-	memset(ipv6ct_table, 0, sizeof(*ipv6ct_table));
-
-	IPADBG("return\n");
-	return ret;
-}
-
-/**
- * ipa_ipv6ct_create_table_dma_cmd_helpers() -
- *   Creates dma_cmd_helpers for base table in the received IPv6CT table
- * @ipv6ct_table: [in] IPv6CT table
- * @table_indx: [in] The index of the IPv6CT table
- *
- * A DMA command helper helps to generate the DMA command for one
- * specific field change. Each table has 3 different types of field
- * change: update_head, update_entry and delete_head. This function
- * creates the helpers and updates the base table correspondingly.
- */
-static void ipa_ipv6ct_create_table_dma_cmd_helpers(
-	ipa_ipv6ct_table* ipv6ct_table,
-	uint8_t table_indx )
-{
-	IPADBG("\n");
-
-	ipa_table_dma_cmd_helper_init(
-		&ipv6ct_table->table_dma_cmd_helpers[IPA_IPV6CT_TABLE_FLAGS],
-		table_indx,
-		IPA_IPV6CT_BASE_TBL,
-		IPA_IPV6CT_EXPN_TBL,
-		ipv6ct_table->mem_desc.addr_offset + IPA_IPV6CT_RULE_FLAG_FIELD_OFFSET);
-
-	ipa_table_dma_cmd_helper_init(
-		&ipv6ct_table->table_dma_cmd_helpers[IPA_IPV6CT_TABLE_NEXT_INDEX],
-		table_indx,
-		IPA_IPV6CT_BASE_TBL,
-		IPA_IPV6CT_EXPN_TBL,
-		ipv6ct_table->mem_desc.addr_offset + IPA_IPV6CT_RULE_NEXT_FIELD_OFFSET);
-
-	ipa_table_dma_cmd_helper_init(
-		&ipv6ct_table->table_dma_cmd_helpers[IPA_IPV6CT_TABLE_PROTOCOL],
-		table_indx,
-		IPA_IPV6CT_BASE_TBL,
-		IPA_IPV6CT_EXPN_TBL,
-		ipv6ct_table->mem_desc.addr_offset + IPA_IPV6CT_RULE_PROTO_FIELD_OFFSET);
-
-	ipv6ct_table->table.dma_help[HELP_UPDATE_HEAD] =
-		&ipv6ct_table->table_dma_cmd_helpers[IPA_IPV6CT_TABLE_FLAGS];
-	ipv6ct_table->table.dma_help[HELP_UPDATE_ENTRY] =
-		&ipv6ct_table->table_dma_cmd_helpers[IPA_IPV6CT_TABLE_NEXT_INDEX];
-	ipv6ct_table->table.dma_help[HELP_DELETE_HEAD] =
-		&ipv6ct_table->table_dma_cmd_helpers[IPA_IPV6CT_TABLE_PROTOCOL];
-
-	IPADBG("return\n");
-}
-
-static int ipa_ipv6ct_post_init_cmd(ipa_ipv6ct_table* ipv6ct_table, uint8_t tbl_index)
-{
-	struct ipa_ioc_ipv6ct_init cmd;
-	int ret;
-
-	IPADBG("\n");
-
-	cmd.tbl_index = tbl_index;
-
-	cmd.base_table_offset = ipv6ct_table->mem_desc.addr_offset;
-	cmd.expn_table_offset = cmd.base_table_offset + (ipv6ct_table->table.table_entries * sizeof(ipa_ipv6ct_hw_entry));
-
-	/* Driverr/HW expected base table size to be power^2-1 due to H/W hash calculation */
-	cmd.table_entries = ipv6ct_table->table.table_entries - 1;
-	cmd.expn_table_entries = ipv6ct_table->table.expn_table_entries;
-
-	ret = ioctl(ipv6ct.ipa_desc->fd, IPA_IOC_INIT_IPV6CT_TABLE, &cmd);
-	if (ret)
-	{
-		IPAERR("unable to post init cmd Error: %d IPA fd %d\n", ret, ipv6ct.ipa_desc->fd);
-		return ret;
-	}
-
-	IPADBG("Posted IPA_IOC_INIT_IPV6CT_TABLE to kernel successfully\n");
-	return 0;
-}
-
-static int ipa_ipv6ct_post_dma_cmd(struct ipa_ioc_nat_dma_cmd* cmd)
-{
-	IPADBG("\n");
-
-	cmd->mem_type = IPA_NAT_MEM_IN_DDR;
-
-	if (ioctl(ipv6ct.ipa_desc->fd, IPA_IOC_TABLE_DMA_CMD, cmd))
-	{
-		IPAERR("ioctl (IPA_IOC_TABLE_DMA_CMD) on fd %d has failed\n",
-			   ipv6ct.ipa_desc->fd);
-		return -EIO;
-	}
-	IPADBG("posted IPA_IOC_TABLE_DMA_CMD to kernel successfully\n");
-	return 0;
-}
-
-void ipa_ipv6ct_dump_table(uint32_t table_handle)
-{
-	ipa_ipv6ct_table* ipv6ct_table;
-
-	if (ipv6ct.ipa_desc->ver < IPA_HW_v4_0)
-	{
-		IPAERR("IPv6 connection tracking isn't supported for IPA version %d\n", ipv6ct.ipa_desc->ver);
-		return;
-	}
-
-	if (table_handle == IPA_TABLE_INVALID_ENTRY || table_handle > IPA_IPV6CT_MAX_TBLS)
-	{
-		IPAERR("invalid parameters passed %d\n", table_handle);
-		return;
-	}
-
-	if (pthread_mutex_lock(&ipv6ct_mutex))
-	{
-		IPAERR("unable to lock the ipv6ct mutex\n");
-		return;
-	}
-
-	ipv6ct_table = &ipv6ct.tables[table_handle - 1];
-	if (!ipv6ct_table->mem_desc.valid)
-	{
-		IPAERR("invalid table handle %d\n", table_handle);
-		goto unlock;
-	}
-
-	/* Prevents interleaving with later kernel printouts. Flush doesn't help. */
-	sleep(1);
-	ipa_read_debug_info(IPA_IPV6CT_DEBUG_FILE_PATH);
-	ipa_read_debug_info(IPA_UC_ACT_DEBUG_FILE_PATH);
-	sleep(1);
-
-unlock:
-	if (pthread_mutex_unlock(&ipv6ct_mutex))
-		IPAERR("unable to unlock the ipv6ct mutex\n");
-}
-
-/**
- * ipa_ipv6ct_add_uc_act_entry() - add uc activation entry
- * @u: [in] structure specifying the uC activation entry
- *
- * Returns:	0  On Success, negative on failure
- */
-int ipa_ipv6ct_add_uc_act_entry(union ipa_ioc_uc_activation_entry *u)
-{
-	IPADBG("\n");
-
-	if(ioctl(ipv6ct.ipa_desc->fd, IPA_IOC_ADD_UC_ACT_ENTRY, u))
-	{
-		IPAERR("ioctl (IPA_IOC_ADD_UC_ACT_ENTRY) on fd %d has failed\n",
-			ipv6ct.ipa_desc->fd);
-		return -EIO;
-	}
-	IPADBG("posted IPA_IOC_ADD_UC_ACT_ENTRY to kernel successfully, index %d\n",
-		u->ipv6_nat.index);
-	return 0;
-}
-
-/**
- * ipa_ipv6ct_del_uc_act_entry() - del uc activation entry
- * @index: [in] index of the uc activation entry to be removed
- *
- * Returns:	0  On Success, negative on failure
- */
-int ipa_ipv6ct_del_uc_act_entry(uint16_t index)
-{
-	IPADBG("\n");
-
-	if(ioctl(ipv6ct.ipa_desc->fd, IPA_IOC_DEL_UC_ACT_ENTRY, index))
-	{
-		IPAERR("ioctl (IPA_IOC_DEL_UC_ACT_ENTRY) on fd %d has failed\n",
-			ipv6ct.ipa_desc->fd);
-		return -EIO;
-	}
-	IPADBG("posted IPA_IOC_DEL_UC_ACT_ENTRY to kernel successfully, index %d\n",
-		index);
-	return 0;
-}
diff --git a/ipanat/src/ipa_mem_descriptor.c b/ipanat/src/ipa_mem_descriptor.c
deleted file mode 100644
index 4ef5343..0000000
--- a/ipanat/src/ipa_mem_descriptor.c
+++ /dev/null
@@ -1,363 +0,0 @@
-/*
- * Copyright (c) 2018-2020 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include "ipa_mem_descriptor.h"
-#include "ipa_nat_utils.h"
-
-#include <sys/ioctl.h>
-#include <fcntl.h>
-#include <sys/mman.h>
-#include <errno.h>
-#include <unistd.h>
-
-#define IPA_DEV_DIR "/dev/"
-
-#ifdef IPA_ON_R3PC
-#define IPA_DEVICE_MMAP_MEM_SIZE (2 * 1024UL * 1024UL - 1)
-#endif
-
-static int AllocateMemory(
-	ipa_mem_descriptor* desc,
-	int ipa_fd)
-{
-	struct ipa_ioc_nat_ipv6ct_table_alloc cmd;
-	int ret = 0;
-
-	IPADBG("In\n");
-
-#ifndef IPA_ON_R3PC
-	/*
-	 * If/when the number of NAT table entries requested yields a byte
-	 * count that will fit in SRAM, SRAM will be used to hold the NAT
-	 * table. When SRAM is used, some odd things can happen, relative
-	 * to mmap'ing's virtual memory scheme, that require us to make
-	 * some adjustments.
-	 *
-	 * To be more specific, the real physical SRAM location for the
-	 * table and the table's size may not play well with Linux's
-	 * mmap'ing virtual memory scheme....which likes everything to be
-	 * PAGE_SIZE aligned and sized in multiples of PAGE_SIZE.
-	 *
-	 * Given the above, if the NAT table's (in SRAM) physical address
-	 * in not on a PAGE_SIZE boundary, it will be offset into the
-	 * mmap'd virtual memory, hence we need to know that offset in
-	 * order to get to the table.  If said offset plus the table's
-	 * size takes it across a PAGE_SIZE boundary, we need to allocate
-	 * more space to ensure that the table is completely within the
-	 * mmap'd virtual memory.
-	 */
-	desc->sram_available = desc->sram_to_be_used = false;
-
-	memset(&desc->nat_sram_info, 0, sizeof(desc->nat_sram_info));
-
-	ret = ioctl(
-		ipa_fd,
-		IPA_IOC_GET_NAT_IN_SRAM_INFO,
-		&desc->nat_sram_info);
-
-	if ( ret == 0 )
-	{
-		IPADBG("sram_mem_available_for_nat(0x%08x) "
-			   "nat_table_offset_into_mmap(0x%08x) "
-			   "best_nat_in_sram_size_rqst(0x%08x)\n",
-			   desc->nat_sram_info.sram_mem_available_for_nat,
-			   desc->nat_sram_info.nat_table_offset_into_mmap,
-			   desc->nat_sram_info.best_nat_in_sram_size_rqst);
-
-		desc->sram_available = true;
-
-		if ( desc->consider_using_sram )
-		{
-			if (desc->orig_rqst_size <=
-				desc->nat_sram_info.sram_mem_available_for_nat)
-			{
-				desc->sram_to_be_used = true;
-			}
-		}
-	}
-#endif
-
-	/*
-	 * Now do the actual allocation...
-	 */
-	memset(&cmd, 0, sizeof(cmd));
-
-	cmd.size = desc->orig_rqst_size;
-
-	ret = ioctl(ipa_fd, desc->allocate_ioctl_num, &cmd);
-
-	if (ret)
-	{
-		IPAERR("Unable to post %s allocate table command. Error %d IPA fd %d\n",
-			   desc->name, ret, ipa_fd);
-		goto bail;
-	}
-
-	desc->addr_offset = cmd.offset;
-
-	IPADBG("The memory desc for %s allocated successfully\n", desc->name);
-
-bail:
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-static int MapMemory(
-	ipa_mem_descriptor* desc,
-	int ipa_fd)
-{
-	char device_full_path[IPA_RESOURCE_NAME_MAX];
-	size_t ipa_dev_dir_path_len;
-	int device_fd;
-	int ret = 0;
-
-	IPADBG("In\n");
-
-	ipa_dev_dir_path_len =
-		strlcpy(device_full_path, IPA_DEV_DIR, IPA_RESOURCE_NAME_MAX);
-
-	if (ipa_dev_dir_path_len >= IPA_RESOURCE_NAME_MAX)
-	{
-		IPAERR("Unable to copy a string with size %d to buffer with size %d\n",
-			   (int)ipa_dev_dir_path_len, IPA_RESOURCE_NAME_MAX);
-		ret = -EINVAL;
-		goto bail;
-	}
-
-	strlcpy(device_full_path + ipa_dev_dir_path_len,
-			desc->name, IPA_RESOURCE_NAME_MAX - ipa_dev_dir_path_len);
-
-	device_fd = open(device_full_path, O_RDWR);
-
-	if (device_fd < 0)
-	{
-		IPAERR("unable to open the desc %s in path %s. Error:%d\n",
-			   desc->name, device_full_path, device_fd);
-		ret = -EIO;
-		goto bail;
-	}
-
-#ifndef IPA_ON_R3PC
-	/*
-	 * If/when the number of NAT table entries requested yields a byte
-	 * count that will fit in SRAM, SRAM will be used to hold the NAT
-	 * table. When SRAM is used, some odd things can happen, relative
-	 * to mmap'ing's virtual memory scheme, that require us to make
-	 * some adjustments.
-	 *
-	 * To be more specific, the real physical SRAM location for the
-	 * table and the table's size may not play well with Linux's
-	 * mmap'ing virtual memory scheme....which likes everything to be
-	 * PAGE_SIZE aligned and sized in multiples of PAGE_SIZE.
-	 *
-	 * Given the above, if the NAT table's (in SRAM) physical address
-	 * in not on a PAGE_SIZE boundary, it will be offset into the
-	 * mmap'd virtual memory, hence we need to know that offset in
-	 * order to get to the table.  If said offset plus the table's
-	 * size takes it across a PAGE_SIZE boundary, we need to allocate
-	 * more space to ensure that the table is completely within the
-	 * mmap'd virtual memory.
-	 */
-	desc->mmap_size =
-		( desc->sram_to_be_used )                      ?
-		desc->nat_sram_info.best_nat_in_sram_size_rqst :
-		desc->orig_rqst_size;
-
-	desc->mmap_addr = desc->base_addr =
-		(void* )mmap(
-			NULL,
-			desc->mmap_size,
-			PROT_READ | PROT_WRITE,
-			MAP_SHARED,
-			device_fd,
-			0);
-#else
-	IPADBG("user space r3pc\n");
-	desc->mmap_addr = desc->base_addr =
-		(void *) mmap(
-			(caddr_t)0,
-			IPA_DEVICE_MMAP_MEM_SIZE,
-			PROT_READ | PROT_WRITE,
-			MAP_SHARED,
-			device_fd,
-			0);
-#endif
-
-	if (desc->base_addr == MAP_FAILED)
-	{
-		IPAERR("Unable to mmap the memory for %s\n", desc->name);
-		ret = -EINVAL;
-		goto close;
-	}
-
-	if ( desc->sram_to_be_used )
-	{
-		desc->base_addr =
-			(uint8_t*) (desc->base_addr) +
-			desc->nat_sram_info.nat_table_offset_into_mmap;
-	}
-
-	IPADBG("mmap for %s return value 0x%lx -> 0x%lx\n",
-		   desc->name,
-		   (long unsigned int) desc->mmap_addr,
-		   (long unsigned int) desc->base_addr);
-
-close:
-	if (close(device_fd))
-	{
-		IPAERR("unable to close the file descriptor for %s\n", desc->name);
-		ret = -EINVAL;
-	}
-
-bail:
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-static int DeallocateMemory(
-	ipa_mem_descriptor* desc,
-	int ipa_fd)
-{
-	struct ipa_ioc_nat_ipv6ct_table_del cmd;
-	int ret = 0;
-
-	IPADBG("In\n");
-
-	memset(&cmd, 0, sizeof(cmd));
-
-	cmd.table_index = desc->table_index;
-
-	cmd.mem_type =
-		( desc->sram_to_be_used ) ?
-		IPA_NAT_MEM_IN_SRAM       :
-		IPA_NAT_MEM_IN_DDR;
-
-	ret = ioctl(ipa_fd, desc->delete_ioctl_num, &cmd);
-
-	if (ret)
-	{
-		IPAERR("unable to post table delete command for %s Error: %d IPA fd %d\n",
-			   desc->name, ret, ipa_fd);
-		goto bail;
-	}
-
-	IPADBG("posted delete command for %s to kernel successfully\n", desc->name);
-
-bail:
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-void ipa_mem_descriptor_init(
-	ipa_mem_descriptor* desc,
-	const char* device_name,
-	int size,
-	uint8_t table_index,
-	unsigned long allocate_ioctl_num,
-	unsigned long delete_ioctl_num,
-	bool consider_using_sram )
-{
-	IPADBG("In\n");
-
-	strlcpy(desc->name, device_name, IPA_RESOURCE_NAME_MAX);
-
-	desc->orig_rqst_size      = desc->mmap_size = size;
-	desc->table_index         = table_index;
-	desc->allocate_ioctl_num  = allocate_ioctl_num;
-	desc->delete_ioctl_num    = delete_ioctl_num;
-	desc->consider_using_sram = consider_using_sram;
-
-	IPADBG("Out\n");
-}
-
-int ipa_mem_descriptor_allocate_memory(
-	ipa_mem_descriptor* desc,
-	int ipa_fd)
-{
-	int ret;
-
-	IPADBG("In\n");
-
-	ret = AllocateMemory(desc, ipa_fd);
-
-	if (ret)
-	{
-		IPAERR("unable to allocate %s\n", desc->name);
-		goto bail;
-	}
-
-	ret = MapMemory(desc, ipa_fd);
-
-	if (ret)
-	{
-		IPAERR("unable to map %s\n", desc->name);
-		DeallocateMemory(desc, ipa_fd);
-		goto bail;
-	}
-
-	desc->valid = TRUE;
-
-bail:
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-int ipa_mem_descriptor_delete(
-	ipa_mem_descriptor* desc,
-	int ipa_fd)
-{
-	int ret = 0;
-
-	IPADBG("In\n");
-
-	if (! desc->valid)
-	{
-		IPAERR("invalid desc handle passed\n");
-		ret = -EINVAL;
-		goto bail;
-	}
-
-	desc->valid = FALSE;
-
-#ifndef IPA_ON_R3PC
-	munmap(desc->mmap_addr, desc->mmap_size);
-#else
-	munmap(desc->mmap_addr, IPA_DEVICE_MMAP_MEM_SIZE);
-#endif
-
-	ret = DeallocateMemory(desc, ipa_fd);
-
-bail:
-	IPADBG("Out\n");
-
-	return ret;
-}
diff --git a/ipanat/src/ipa_nat_drv.c b/ipanat/src/ipa_nat_drv.c
deleted file mode 100644
index 0fbf473..0000000
--- a/ipanat/src/ipa_nat_drv.c
+++ /dev/null
@@ -1,348 +0,0 @@
-/*
- * Copyright (c) 2013-2020 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "ipa_nat_drv.h"
-#include "ipa_nat_drvi.h"
-
-#include <errno.h>
-
-/**
- * ipa_nat_add_ipv4_tbl() - create ipv4 nat table
- * @public_ip_addr: [in] public ipv4 address
- * @mem_type_ptr: [in] type of memory table is to reside in
- * @number_of_entries: [in]  number of nat entries
- * @table_handle: [out] Handle of new ipv4 nat table
- *
- * To create new ipv4 nat table
- *
- * Returns:	0  On Success, negative on failure
- */
-int ipa_nat_add_ipv4_tbl(
-	uint32_t public_ip_addr,
-	const char *mem_type_ptr,
-	uint16_t number_of_entries,
-	uint32_t *tbl_hdl)
-{
-	int ret;
-
-	if (tbl_hdl == NULL || mem_type_ptr == NULL || number_of_entries == 0) {
-		IPAERR(
-			"Invalid parameters tbl_hdl=%pK mem_type_ptr=%p number_of_entries=%d\n",
-			tbl_hdl,
-			mem_type_ptr,
-			number_of_entries);
-		return -EINVAL;
-	}
-
-	*tbl_hdl = 0;
-
-	ret = ipa_nati_add_ipv4_tbl(
-		public_ip_addr, mem_type_ptr, number_of_entries, tbl_hdl);
-
-	if (ret) {
-		IPAERR("unable to add NAT table\n");
-		return ret;
-	}
-
-	IPADBG("Returning table handle 0x%x\n", *tbl_hdl);
-
-	return ret;
-} /* __ipa_nat_add_ipv4_tbl() */
-
-/**
- * ipa_nat_del_ipv4_tbl() - delete ipv4 table
- * @table_handle: [in] Handle of ipv4 nat table
- *
- * To delete given ipv4 nat table
- *
- * Returns:	0  On Success, negative on failure
- */
-int ipa_nat_del_ipv4_tbl(
-	uint32_t tbl_hdl)
-{
-	if ( ! VALID_TBL_HDL(tbl_hdl) ) {
-		IPAERR("Invalid table handle passed 0x%08X\n", tbl_hdl);
-		return -EINVAL;
-	}
-
-	IPADBG("Passed Table Handle: 0x%08X\n", tbl_hdl);
-
-	return ipa_nati_del_ipv4_table(tbl_hdl);
-}
-
-/**
- * ipa_nat_add_ipv4_rule() - to insert new ipv4 rule
- * @table_handle: [in] handle of ipv4 nat table
- * @rule: [in]  Pointer to new rule
- * @rule_handle: [out] Return the handle to rule
- *
- * To insert new ipv4 nat rule into ipv4 nat table
- *
- * Returns:	0  On Success, negative on failure
- */
-int ipa_nat_add_ipv4_rule(
-	uint32_t tbl_hdl,
-	const ipa_nat_ipv4_rule *clnt_rule,
-	uint32_t *rule_hdl)
-{
-	int result = -EINVAL;
-
-	if ( ! VALID_TBL_HDL(tbl_hdl) ||
-		 rule_hdl == NULL ||
-		 clnt_rule == NULL ) {
-		IPAERR(
-			"Invalid parameters tbl_hdl=%d clnt_rule=%pK rule_hdl=%pK\n",
-			tbl_hdl, clnt_rule, rule_hdl);
-		return result;
-	}
-
-	IPADBG("Passed Table handle: 0x%x\n", tbl_hdl);
-
-	if (ipa_nati_add_ipv4_rule(tbl_hdl, clnt_rule, rule_hdl)) {
-		return result;
-	}
-
-	IPADBG("Returning rule handle %u\n", *rule_hdl);
-
-	return 0;
-}
-
-/**
- * ipa_nat_del_ipv4_rule() - to delete ipv4 nat rule
- * @table_handle: [in] handle of ipv4 nat table
- * @rule_handle: [in] ipv4 nat rule handle
- *
- * To insert new ipv4 nat rule into ipv4 nat table
- *
- * Returns:	0  On Success, negative on failure
- */
-int ipa_nat_del_ipv4_rule(
-	uint32_t tbl_hdl,
-	uint32_t rule_hdl)
-{
-	int result = -EINVAL;
-
-	if ( ! VALID_TBL_HDL(tbl_hdl) || ! VALID_RULE_HDL(rule_hdl) )
-	{
-		IPAERR("Invalid parameters tbl_hdl=0x%08X rule_hdl=0x%08X\n",
-			   tbl_hdl, rule_hdl);
-		return result;
-	}
-
-	IPADBG("Passed Table: 0x%08X and rule handle 0x%08X\n", tbl_hdl, rule_hdl);
-
-	result = ipa_nati_del_ipv4_rule(tbl_hdl, rule_hdl);
-	if (result) {
-		IPAERR(
-			"Unable to delete rule with handle 0x%08X "
-			"from hw for NAT table with handle 0x%08X\n",
-			rule_hdl, tbl_hdl);
-		return result;
-	}
-
-	return 0;
-}
-
-/**
- * ipa_nat_query_timestamp() - to query timestamp
- * @table_handle: [in] handle of ipv4 nat table
- * @rule_handle: [in] ipv4 nat rule handle
- * @time_stamp: [out] time stamp of rule
- *
- * To retrieve the timestamp that lastly the
- * nat rule was accessed
- *
- * Returns:	0  On Success, negative on failure
- */
-int ipa_nat_query_timestamp(
-	uint32_t tbl_hdl,
-	uint32_t rule_hdl,
-	uint32_t *time_stamp)
-{
-	if ( ! VALID_TBL_HDL(tbl_hdl) ||
-		 ! VALID_RULE_HDL(rule_hdl) ||
-		 time_stamp == NULL )
-	{
-		IPAERR("Invalid parameters passed tbl_hdl=0x%x rule_hdl=%u time_stamp=%pK\n",
-			   tbl_hdl, rule_hdl, time_stamp);
-		return -EINVAL;
-	}
-
-	IPADBG("Passed Table 0x%x and rule handle %u\n", tbl_hdl, rule_hdl);
-
-	return ipa_nati_query_timestamp(tbl_hdl, rule_hdl, time_stamp);
-}
-
-/**
-* ipa_nat_modify_pdn() - modify single PDN entry in the PDN config table
-* @table_handle: [in] handle of ipv4 nat table
-* @pdn_index : [in] the index of the entry to be modified
-* @pdn_info : [in] values for the PDN entry to be changed
-*
-* Modify a PDN entry
-*
-* Returns:	0  On Success, negative on failure
-*/
-int ipa_nat_modify_pdn(
-	uint32_t tbl_hdl,
-	uint8_t pdn_index,
-	ipa_nat_pdn_entry *pdn_info)
-{
-	struct ipa_ioc_nat_pdn_entry pdn_data;
-
-	if ( ! VALID_TBL_HDL(tbl_hdl) ||
-		 pdn_info == NULL) {
-		IPAERR(
-			"invalid parameters passed tbl_hdl=%d pdn_info=%pK\n",
-			tbl_hdl, pdn_info);
-		return -EINVAL;
-	}
-
-	if (pdn_index > IPA_MAX_PDN_NUM) {
-		IPAERR(
-			"PDN index %d is out of range maximum %d",
-			pdn_index, IPA_MAX_PDN_NUM);
-		return -EINVAL;
-	}
-
-	pdn_data.pdn_index = pdn_index;
-	pdn_data.public_ip = pdn_info->public_ip;
-	pdn_data.src_metadata = pdn_info->src_metadata;
-	pdn_data.dst_metadata = pdn_info->dst_metadata;
-
-	return ipa_nati_modify_pdn(&pdn_data);
-}
-
-/**
-* ipa_nat_get_pdn_index() - get a PDN index for a public ip
-* @public_ip : [in] IPv4 address of the PDN entry
-* @pdn_index : [out] the index of the requested PDN entry
-*
-* Get a PDN entry
-*
-* Returns:	0  On Success, negative on failure
-*/
-int ipa_nat_get_pdn_index(
-	uint32_t public_ip,
-	uint8_t *pdn_index)
-{
-	if(!pdn_index)
-	{
-		IPAERR("NULL PDN index\n");
-		return -EINVAL;
-	}
-
-	return ipa_nati_get_pdn_index(public_ip, pdn_index);
-}
-
-/**
-* ipa_nat_alloc_pdn() - allocate a PDN for new WAN
-* @pdn_info : [in] values for the PDN entry to be created
-* @pdn_index : [out] the index of the requested PDN entry
-*
-* allocate a new PDN entry
-*
-* Returns:	0  On Success, negative on failure
-*/
-int ipa_nat_alloc_pdn(
-	ipa_nat_pdn_entry *pdn_info,
-	uint8_t *pdn_index)
-{
-	if(!pdn_info)
-	{
-		IPAERR("NULL PDN info\n");
-		return -EINVAL;
-	}
-
-	if(!pdn_index)
-	{
-		IPAERR("NULL PDN index\n");
-		return -EINVAL;
-	}
-
-	return ipa_nati_alloc_pdn(pdn_info, pdn_index);
-}
-
-/**
-* ipa_nat_get_pdn_count() - get the number of allocated PDNs
-* @pdn_cnt : [out] the number of allocated PDNs
-*
-* get the number of allocated PDNs
-*
-* Returns:	0  On Success, negative on failure
-*/
-int ipa_nat_get_pdn_count(
-	uint8_t *pdn_cnt)
-{
-	if(!pdn_cnt)
-	{
-		IPAERR("NULL PDN count\n");
-		return -EINVAL;
-	}
-
-	*pdn_cnt = ipa_nati_get_pdn_cnt();
-
-	return 0;
-}
-
-/**
-* ipa_nat_dealloc_pdn() - deallocate a PDN entry
-* @pdn_index : [in] pdn index to be deallocated
-*
-* deallocate a PDN in specified index - zero the PDN entry
-*
-* Returns:	0  On Success, negative on failure
-*/
-int ipa_nat_dealloc_pdn(
-	uint8_t pdn_index)
-{
-	if(pdn_index > IPA_MAX_PDN_NUM) {
-		IPAERR("PDN index is out of range %d", pdn_index);
-		return -EINVAL;
-	}
-
-	return ipa_nati_dealloc_pdn(pdn_index);
-}
-
-/**
- * ipa_nat_vote_clock() - used for voting clock
- * @vote_type: [in] desired vote type
- */
-int ipa_nat_vote_clock(
-	enum ipa_app_clock_vote_type vote_type )
-{
-	if ( ! (vote_type >= IPA_APP_CLK_DEVOTE &&
-			vote_type <= IPA_APP_CLK_RESET_VOTE) )
-	{
-		IPAERR("Bad vote_type(%u) parameter\n", vote_type);
-		return -EINVAL;
-	}
-
-	return ipa_nati_vote_clock(vote_type);
-}
diff --git a/ipanat/src/ipa_nat_drvi.c b/ipanat/src/ipa_nat_drvi.c
deleted file mode 100644
index 53eaa4d..0000000
--- a/ipanat/src/ipa_nat_drvi.c
+++ /dev/null
@@ -1,2686 +0,0 @@
-/*
- * Copyright (c) 2013-2020 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "ipa_nat_drv.h"
-#include "ipa_nat_drvi.h"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stdbool.h>
-#include <sys/ioctl.h>
-#include <stdlib.h>
-#include <netinet/in.h>
-#include <errno.h>
-#include <pthread.h>
-#include <unistd.h>
-#include <linux/msm_ipa.h>
-
-#define IPA_NAT_DEBUG_FILE_PATH "/sys/kernel/debug/ipa/ip4_nat"
-#define IPA_NAT_TABLE_NAME "IPA NAT table"
-#define IPA_NAT_INDEX_TABLE_NAME "IPA NAT index table"
-
-
-#undef min
-#define min(a, b) ((a) < (b)) ? (a) : (b)
-
-#undef max
-#define max(a, b) ((a) > (b)) ? (a) : (b)
-
-static struct ipa_nat_cache ipv4_nat_cache[IPA_NAT_MEM_IN_MAX];
-
-static struct ipa_nat_cache *active_nat_cache_ptr = NULL;
-
-#undef DDR_IS_ACTIVE
-#define DDR_IS_ACTIVE() \
-	(active_nat_cache_ptr) ? \
-	(active_nat_cache_ptr->nmi == IPA_NAT_MEM_IN_DDR) : \
-	false
-
-#undef  SRAM_IS_ACTIVE
-#define SRAM_IS_ACTIVE() \
-	(active_nat_cache_ptr) ? \
-	(active_nat_cache_ptr->nmi == IPA_NAT_MEM_IN_SRAM) : \
-	false
-
-extern pthread_mutex_t nat_mutex;
-
-static ipa_nat_pdn_entry pdns[IPA_MAX_PDN_NUM];
-static int num_pdns = 0;
-static int Hash_token = 69;
-/*
- * ----------------------------------------------------------------------------
- * Private helpers for manipulating regular tables
- * ----------------------------------------------------------------------------
- */
-static int table_entry_is_valid(
-	void* entry)
-{
-	struct ipa_nat_rule* rule = (struct ipa_nat_rule*) entry;
-
-	IPADBG("In\n");
-
-	IPADBG("enable(%u)\n", rule->enable);
-
-	IPADBG("Out\n");
-
-	return rule->enable;
-}
-
-static uint16_t table_entry_get_next_index(
-	void* entry)
-{
-	uint16_t result;
-	struct ipa_nat_rule* rule = (struct ipa_nat_rule*)entry;
-
-	IPADBG("In\n");
-
-	result = rule->next_index;
-
-	IPADBG("Next entry of %pK is %u\n", entry, result);
-
-	IPADBG("Out\n");
-
-	return result;
-}
-
-static uint16_t table_entry_get_prev_index(
-	void* entry,
-	uint16_t entry_index,
-	void* meta,
-	uint16_t base_table_size)
-{
-	uint16_t result;
-	struct ipa_nat_rule* rule = (struct ipa_nat_rule*)entry;
-
-	IPADBG("In\n");
-
-	result = rule->prev_index;
-
-	IPADBG("Previous entry of %u is %u\n", entry_index, result);
-
-	IPADBG("Out\n");
-
-	return result;
-}
-
-static void table_entry_set_prev_index(
-	void*    entry,
-	uint16_t entry_index,
-	uint16_t prev_index,
-	void*    meta,
-	uint16_t base_table_size)
-{
-	struct ipa_nat_rule* rule = (struct ipa_nat_rule*) entry;
-
-	IPADBG("In\n");
-
-	IPADBG("Previous entry of %u is %u\n", entry_index, prev_index);
-
-	rule->prev_index = prev_index;
-
-	IPADBG("Out\n");
-}
-
-/**
- * ipa_nati_calc_ip_cksum() - Calculate the source nat IP checksum diff
- * @pub_ip_addr: [in] public ip address
- * @priv_ip_addr: [in]	Private ip address
- *
- * source nat ip checksum different is calculated as
- * public_ip_addr - private_ip_addr
- * Here we are using 1's complement to represent -ve number.
- * So take 1's complement of private ip addr and add it
- * to public ip addr.
- *
- * Returns: >0 ip checksum diff
- */
-static uint16_t ipa_nati_calc_ip_cksum(
-	uint32_t pub_ip_addr,
-	uint32_t priv_ip_addr)
-{
-	uint16_t ret;
-	uint32_t cksum = 0;
-
-	IPADBG("In\n");
-
-	/* Add LSB(2 bytes) of public ip address to cksum */
-	cksum += (pub_ip_addr & 0xFFFF);
-
-	/* Add MSB(2 bytes) of public ip address to cksum
-		and check for carry forward(CF), if any add it
-	*/
-	cksum += (pub_ip_addr>>16);
-	if (cksum >> 16) {
-		cksum = (cksum & 0x0000FFFF);
-		cksum += 1;
-	}
-
-	/* Calculate the 1's complement of private ip address */
-	priv_ip_addr = (~priv_ip_addr);
-
-	/* Add LSB(2 bytes) of private ip address to cksum
-		 and check for carry forward(CF), if any add it
-	*/
-	cksum += (priv_ip_addr & 0xFFFF);
-	if (cksum >> 16) {
-		cksum = (cksum & 0x0000FFFF);
-		cksum += 1;
-	}
-
-	/* Add MSB(2 bytes) of private ip address to cksum
-		 and check for carry forward(CF), if any add it
-	*/
-	cksum += (priv_ip_addr>>16);
-	if (cksum >> 16) {
-		cksum = (cksum & 0x0000FFFF);
-		cksum += 1;
-	}
-
-	/* Return the LSB(2 bytes) of checksum	*/
-	ret = (uint16_t)cksum;
-
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-/**
- * ipa_nati_calc_tcp_udp_cksum() - Calculate the source nat TCP/UDP checksum diff
- * @pub_ip_addr: [in] public ip address
- * @pub_port: [in] public tcp/udp port
- * @priv_ip_addr: [in]	Private ip address
- * @priv_port: [in] Private tcp/udp prot
- *
- * source nat tcp/udp checksum is calculated as
- * (pub_ip_addr + pub_port) - (priv_ip_addr + priv_port)
- * Here we are using 1's complement to represent -ve number.
- * So take 1's complement of prviate ip addr &private port
- * and add it public ip addr & public port.
- *
- * Returns: >0 tcp/udp checksum diff
- */
-static uint16_t ipa_nati_calc_tcp_udp_cksum(
-	uint32_t pub_ip_addr,
-	uint16_t pub_port,
-	uint32_t priv_ip_addr,
-	uint16_t priv_port)
-{
-	uint16_t ret = 0;
-	uint32_t cksum = 0;
-
-	IPADBG("In\n");
-
-	/* Add LSB(2 bytes) of public ip address to cksum */
-	cksum += (pub_ip_addr & 0xFFFF);
-
-	/* Add MSB(2 bytes) of public ip address to cksum
-		and check for carry forward(CF), if any add it
-	*/
-	cksum += (pub_ip_addr>>16);
-	if (cksum >> 16) {
-		cksum = (cksum & 0x0000FFFF);
-		cksum += 1;
-	}
-
-	/* Add public port to cksum and
-		 check for carry forward(CF), if any add it */
-	cksum += pub_port;
-	if (cksum >> 16) {
-		cksum = (cksum & 0x0000FFFF);
-		cksum += 1;
-	}
-
-	/* Calculate the 1's complement of private ip address */
-	priv_ip_addr = (~priv_ip_addr);
-
-	/* Add LSB(2 bytes) of private ip address to cksum
-		 and check for carry forward(CF), if any add it
-	*/
-	cksum += (priv_ip_addr & 0xFFFF);
-	if (cksum >> 16) {
-		cksum = (cksum & 0x0000FFFF);
-		cksum += 1;
-	}
-
-	/* Add MSB(2 bytes) of private ip address to cksum
-		 and check for carry forward(CF), if any add
-	*/
-	cksum += (priv_ip_addr>>16);
-	if (cksum >> 16) {
-		cksum = (cksum & 0x0000FFFF);
-		cksum += 1;
-	}
-
-	/* Calculate the 1's complement of private port */
-	priv_port = (~priv_port);
-
-	/* Add public port to cksum and
-	 check for carry forward(CF), if any add it */
-	cksum += priv_port;
-	if (cksum >> 16) {
-		cksum = (cksum & 0x0000FFFF);
-		cksum += 1;
-	}
-
-	/* return the LSB(2 bytes) of checksum */
-	ret = (uint16_t)cksum;
-
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-static int table_entry_copy_from_user(
-	void* entry,
-	void* user_data)
-{
-	uint32_t pub_ip_addr;
-
-	struct ipa_nat_rule*     nat_entry = (struct ipa_nat_rule*) entry;
-	const ipa_nat_ipv4_rule* user_rule = (const ipa_nat_ipv4_rule*) user_data;
-
-	IPADBG("In\n");
-
-	pub_ip_addr = pdns[user_rule->pdn_index].public_ip;
-
-	nat_entry->private_ip   = user_rule->private_ip;
-	nat_entry->private_port = user_rule->private_port;
-	nat_entry->protocol     = user_rule->protocol;
-	nat_entry->public_port  = user_rule->public_port;
-	nat_entry->target_ip    = user_rule->target_ip;
-	nat_entry->target_port  = user_rule->target_port;
-	nat_entry->pdn_index    = user_rule->pdn_index;
-	nat_entry->uc_activation_index = user_rule->uc_activation_index;
-	nat_entry->s = user_rule->s;
-	nat_entry->ucp = user_rule->ucp;
-	nat_entry->dst_only = user_rule->dst_only;
-	nat_entry->src_only = user_rule->src_only;
-
-	nat_entry->ip_chksum =
-		ipa_nati_calc_ip_cksum(pub_ip_addr, user_rule->private_ip);
-
-	if (IPPROTO_TCP == nat_entry->protocol ||
-		IPPROTO_UDP == nat_entry->protocol) {
-		nat_entry->tcp_udp_chksum = ipa_nati_calc_tcp_udp_cksum(
-			pub_ip_addr,
-			user_rule->public_port,
-			user_rule->private_ip,
-			user_rule->private_port);
-	}
-
-	IPADBG("Out\n");
-
-	return 0;
-}
-
-static int table_entry_head_insert(
-	void*      entry,
-	void*      user_data,
-	uint16_t*  dma_command_data)
-{
-	int  ret;
-	struct ipa_nat_rule* nat_entry = (struct ipa_nat_rule*) entry;
-
-	IPADBG("In\n");
-
-	IPADBG("entry(%p) user_data(%p) dma_command_data(%p)\n",
-		   entry,
-		   user_data,
-		   dma_command_data);
-
-	ret = table_entry_copy_from_user(entry, user_data);
-
-	if (ret) {
-		IPAERR("unable to copy from user a new entry\n");
-		goto bail;
-	}
-
-	*dma_command_data = 0;
-	((ipa_nat_flags*)dma_command_data)->enable = IPA_NAT_FLAG_ENABLE_BIT;
-	((ipa_nat_flags*)dma_command_data)->uc_activation_index =
-		nat_entry->uc_activation_index;
-	((ipa_nat_flags*)dma_command_data)->s = nat_entry->s;
-;
-
-bail:
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-static int table_entry_tail_insert(
-	void* entry,
-	void* user_data)
-{
-	struct ipa_nat_rule* nat_entry = (struct ipa_nat_rule*) entry;
-
-	int  ret;
-
-	IPADBG("In\n");
-
-	IPADBG("entry(%p) user_data(%p)\n",
-		   entry,
-		   user_data);
-
-	ret = table_entry_copy_from_user(entry, user_data);
-
-	if (ret) {
-		IPAERR("unable to copy from user a new entry\n");
-		goto bail;
-	}
-
-	nat_entry->enable = IPA_NAT_FLAG_ENABLE_BIT;
-
-bail:
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-static uint16_t table_entry_get_delete_head_dma_command_data(
-	void* head,
-	void* next_entry)
-{
-	IPADBG("In\n");
-
-	IPADBG("Out\n");
-
-	return IPA_NAT_INVALID_PROTO_FIELD_VALUE;
-}
-
-/*
- * ----------------------------------------------------------------------------
- * Private helpers for manipulating index tables
- * ----------------------------------------------------------------------------
- */
-static int index_table_entry_is_valid(
-	void* entry)
-{
-	struct ipa_nat_indx_tbl_rule* rule =
-		(struct ipa_nat_indx_tbl_rule*) entry;
-
-	int ret;
-
-	IPADBG("In\n");
-
-	ret = (rule->tbl_entry) ? 1 : 0;
-
-	IPADBG("enable(%d)\n", ret);
-
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-static uint16_t index_table_entry_get_next_index(
-	void* entry)
-{
-	uint16_t result;
-	struct ipa_nat_indx_tbl_rule* rule = (struct ipa_nat_indx_tbl_rule*)entry;
-
-	IPADBG("In\n");
-
-	result = rule->next_index;
-
-	IPADBG("Next entry of %pK is %d\n", entry, result);
-
-	IPADBG("Out\n");
-
-	return result;
-}
-
-static uint16_t index_table_entry_get_prev_index(
-	void* entry,
-	uint16_t entry_index,
-	void* meta,
-	uint16_t base_table_size)
-{
-	uint16_t result = 0;
-	struct ipa_nat_indx_tbl_meta_info* index_expn_table_meta =
-		(struct ipa_nat_indx_tbl_meta_info*)meta;
-
-	IPADBG("In\n");
-
-	if (entry_index >= base_table_size)
-		result = index_expn_table_meta[entry_index - base_table_size].prev_index;
-
-	IPADBG("Previous entry of %d is %d\n", entry_index, result);
-
-	IPADBG("Out\n");
-
-	return result;
-}
-
-static void index_table_entry_set_prev_index(
-	void*    entry,
-	uint16_t entry_index,
-	uint16_t prev_index,
-	void*    meta,
-	uint16_t base_table_size)
-{
-	struct ipa_nat_indx_tbl_meta_info* index_expn_table_meta =
-		(struct ipa_nat_indx_tbl_meta_info*) meta;
-
-	IPADBG("In\n");
-
-	IPADBG("Previous entry of %u is %u\n", entry_index, prev_index);
-
-	if ( entry_index >= base_table_size )
-	{
-		index_expn_table_meta[entry_index - base_table_size].prev_index = prev_index;
-	}
-	else if ( VALID_INDEX(prev_index) )
-	{
-		IPAERR("Base table entry %u can't has prev entry %u, but only %u",
-			   entry_index, prev_index, IPA_TABLE_INVALID_ENTRY);
-	}
-
-	IPADBG("Out\n");
-}
-
-static int index_table_entry_head_insert(
-	void*      entry,
-	void*      user_data,
-	uint16_t*  dma_command_data)
-{
-	IPADBG("In\n");
-
-	IPADBG("entry(%p) user_data(%p) dma_command_data(%p)\n",
-		   entry,
-		   user_data,
-		   dma_command_data);
-
-	*dma_command_data = *((uint16_t*)user_data);
-
-	IPADBG("Out\n");
-
-	return 0;
-}
-
-static int index_table_entry_tail_insert(
-	void* entry,
-	void* user_data)
-{
-	struct ipa_nat_indx_tbl_rule* rule_ptr =
-		(struct ipa_nat_indx_tbl_rule*) entry;
-
-	IPADBG("In\n");
-
-	IPADBG("entry(%p) user_data(%p)\n",
-		   entry,
-		   user_data);
-
-	rule_ptr->tbl_entry = *((uint16_t*)user_data);
-
-	IPADBG("Out\n");
-
-	return 0;
-}
-
-static uint16_t index_table_entry_get_delete_head_dma_command_data(
-	void* head,
-	void* next_entry)
-{
-	uint16_t result;
-	struct ipa_nat_indx_tbl_rule* rule =
-		(struct ipa_nat_indx_tbl_rule*)next_entry;
-
-	IPADBG("In\n");
-
-	result = rule->tbl_entry;
-
-	IPADBG("Out\n");
-
-	return result;
-}
-
-/*
- * ----------------------------------------------------------------------------
- * Private data and functions used by this file's API
- * ----------------------------------------------------------------------------
- */
-static ipa_table_entry_interface entry_interface = {
-	table_entry_is_valid,
-	table_entry_get_next_index,
-	table_entry_get_prev_index,
-	table_entry_set_prev_index,
-	table_entry_head_insert,
-	table_entry_tail_insert,
-	table_entry_get_delete_head_dma_command_data
-};
-
-static ipa_table_entry_interface index_entry_interface = {
-	index_table_entry_is_valid,
-	index_table_entry_get_next_index,
-	index_table_entry_get_prev_index,
-	index_table_entry_set_prev_index,
-	index_table_entry_head_insert,
-	index_table_entry_tail_insert,
-	index_table_entry_get_delete_head_dma_command_data
-};
-
-/**
- * ipa_nati_create_table_dma_cmd_helpers()
- *
- *   Creates dma_cmd_helpers for base and index tables in the received
- *   NAT table
- *
- * @nat_table: [in] NAT table
- * @table_indx: [in] The index of the NAT table
- *
- * A DMA command helper helps to generate the DMA command for one
- * specific field change. Each table has 3 different types of field
- * change: update_head, update_entry and delete_head. This function
- * creates the helpers for base and index tables and updates the
- * tables correspondingly.
- */
-static void ipa_nati_create_table_dma_cmd_helpers(
-	struct ipa_nat_ip4_table_cache* nat_table,
-	uint8_t table_indx)
-{
-	IPADBG("In\n");
-
-	/*
-	 * Create helpers for base table
-	 */
-	ipa_table_dma_cmd_helper_init(
-		&nat_table->table_dma_cmd_helpers[IPA_NAT_TABLE_FLAGS],
-		table_indx,
-		IPA_NAT_BASE_TBL,
-		IPA_NAT_EXPN_TBL,
-		nat_table->mem_desc.addr_offset + IPA_NAT_RULE_FLAG_FIELD_OFFSET);
-
-	ipa_table_dma_cmd_helper_init(
-		&nat_table->table_dma_cmd_helpers[IPA_NAT_TABLE_NEXT_INDEX],
-		table_indx,
-		IPA_NAT_BASE_TBL,
-		IPA_NAT_EXPN_TBL,
-		nat_table->mem_desc.addr_offset + IPA_NAT_RULE_NEXT_FIELD_OFFSET);
-
-	ipa_table_dma_cmd_helper_init(
-		&nat_table->table_dma_cmd_helpers[IPA_NAT_TABLE_PROTOCOL],
-		table_indx,
-		IPA_NAT_BASE_TBL,
-		IPA_NAT_EXPN_TBL,
-		nat_table->mem_desc.addr_offset + IPA_NAT_RULE_PROTO_FIELD_OFFSET);
-
-	/*
-	 * Create helpers for index table
-	 */
-	ipa_table_dma_cmd_helper_init(
-		&nat_table->table_dma_cmd_helpers[IPA_NAT_INDEX_TABLE_ENTRY],
-		table_indx,
-		IPA_NAT_INDX_TBL,
-		IPA_NAT_INDEX_EXPN_TBL,
-		nat_table->mem_desc.addr_offset + IPA_NAT_INDEX_RULE_NAT_INDEX_FIELD_OFFSET);
-
-	ipa_table_dma_cmd_helper_init(
-		&nat_table->table_dma_cmd_helpers[IPA_NAT_INDEX_TABLE_NEXT_INDEX],
-		table_indx,
-		IPA_NAT_INDX_TBL,
-		IPA_NAT_INDEX_EXPN_TBL,
-		nat_table->mem_desc.addr_offset + IPA_NAT_INDEX_RULE_NEXT_FIELD_OFFSET);
-
-	/*
-	 * Init helpers for base table
-	 */
-	nat_table->table.dma_help[HELP_UPDATE_HEAD] =
-		&nat_table->table_dma_cmd_helpers[IPA_NAT_TABLE_FLAGS];
-
-	nat_table->table.dma_help[HELP_UPDATE_ENTRY] =
-		&nat_table->table_dma_cmd_helpers[IPA_NAT_TABLE_NEXT_INDEX];
-
-	nat_table->table.dma_help[HELP_DELETE_HEAD] =
-		&nat_table->table_dma_cmd_helpers[IPA_NAT_TABLE_PROTOCOL];
-
-	/*
-	 * Init helpers for index table
-	 */
-	nat_table->index_table.dma_help[HELP_UPDATE_HEAD] =
-		&nat_table->table_dma_cmd_helpers[IPA_NAT_INDEX_TABLE_ENTRY];
-
-	nat_table->index_table.dma_help[HELP_UPDATE_ENTRY] =
-		&nat_table->table_dma_cmd_helpers[IPA_NAT_INDEX_TABLE_NEXT_INDEX];
-
-	nat_table->index_table.dma_help[HELP_DELETE_HEAD] =
-		&nat_table->table_dma_cmd_helpers[IPA_NAT_INDEX_TABLE_ENTRY];
-
-	IPADBG("Out\n");
-}
-
-/**
- * ipa_nati_create_table() - Creates a new IPv4 NAT table
- * @nat_table: [in] IPv4 NAT table
- * @public_ip_addr: [in] public IPv4 address
- * @number_of_entries: [in] number of NAT entries
- * @table_index: [in] the index of the IPv4 NAT table
- *
- * This function creates new IPv4 NAT table:
- * - Initializes table, index table, memory descriptor and
- *   table_dma_cmd_helpers structures
- * - Allocates the index expansion table meta data
- * - Allocates, maps and clears the memory for table and index table
- *
- * Returns:	0  On Success, negative on failure
- */
-static int ipa_nati_create_table(
-	struct ipa_nat_cache*           nat_cache_ptr,
-	struct ipa_nat_ip4_table_cache* nat_table,
-	uint32_t                        public_ip_addr,
-	uint16_t                        number_of_entries,
-	uint8_t                         table_index)
-{
-	int ret, size;
-	void* base_addr;
-
-#ifdef IPA_ON_R3PC
-	uint32_t nat_mem_offset = 0;
-#endif
-
-	IPADBG("In\n");
-
-	nat_table->public_addr = public_ip_addr;
-
-	ipa_table_init(
-		&nat_table->table,
-		IPA_NAT_TABLE_NAME,
-		nat_cache_ptr->nmi,
-		sizeof(struct ipa_nat_rule),
-		NULL,
-		0,
-		&entry_interface);
-
-	ret = ipa_table_calculate_entries_num(
-		&nat_table->table,
-		number_of_entries,
-		nat_cache_ptr->nmi);
-
-	if (ret) {
-		IPAERR(
-			"unable to calculate number of entries in "
-			"nat table %d, while required by user %d\n",
-			table_index, number_of_entries);
-		goto done;
-	}
-
-	/*
-	 * Allocate memory for NAT index expansion table meta data
-	 */
-	nat_table->index_expn_table_meta = (struct ipa_nat_indx_tbl_meta_info*)
-		calloc(nat_table->table.expn_table_entries,
-			   sizeof(struct ipa_nat_indx_tbl_meta_info));
-
-	if (nat_table->index_expn_table_meta == NULL) {
-		IPAERR(
-			"Fail to allocate ipv4 index expansion table meta with size %d\n",
-			nat_table->table.expn_table_entries *
-			sizeof(struct ipa_nat_indx_tbl_meta_info));
-		ret = -ENOMEM;
-		goto done;
-	}
-
-	ipa_table_init(
-		&nat_table->index_table,
-		IPA_NAT_INDEX_TABLE_NAME,
-		nat_cache_ptr->nmi,
-		sizeof(struct ipa_nat_indx_tbl_rule),
-		nat_table->index_expn_table_meta,
-		sizeof(struct ipa_nat_indx_tbl_meta_info),
-		&index_entry_interface);
-
-	nat_table->index_table.table_entries =
-		nat_table->table.table_entries;
-
-	nat_table->index_table.expn_table_entries =
-		nat_table->table.expn_table_entries;
-
-	nat_table->index_table.tot_tbl_ents =
-		nat_table->table.tot_tbl_ents;
-
-	size  = ipa_table_calculate_size(&nat_table->table);
-	size += ipa_table_calculate_size(&nat_table->index_table);
-
-	IPADBG("Nat Base and Index Table size: %d\n", size);
-
-	ipa_mem_descriptor_init(
-		&nat_table->mem_desc,
-		IPA_NAT_DEV_NAME,
-		size,
-		table_index,
-		IPA_IOC_ALLOC_NAT_TABLE,
-		IPA_IOC_DEL_NAT_TABLE,
-		true);  /* true here means do consider using sram */
-
-	ret = ipa_mem_descriptor_allocate_memory(
-		&nat_table->mem_desc,
-		nat_cache_ptr->ipa_desc->fd);
-
-	if (ret) {
-		IPAERR("unable to allocate nat memory descriptor Error: %d\n", ret);
-		goto bail_meta;
-	}
-
-	base_addr = nat_table->mem_desc.base_addr;
-
-#ifdef IPA_ON_R3PC
-	ret = ioctl(nat_cache_ptr->ipa_desc->fd,
-				IPA_IOC_GET_NAT_OFFSET,
-				&nat_mem_offset);
-	if (ret) {
-		IPAERR("unable to post ant offset cmd Error: %d IPA fd %d\n",
-			   ret, nat_cache_ptr->ipa_desc->fd);
-		goto bail_mem_desc;
-	}
-	base_addr += nat_mem_offset;
-#endif
-
-	base_addr =
-		ipa_table_calculate_addresses(&nat_table->table, base_addr);
-	ipa_table_calculate_addresses(&nat_table->index_table, base_addr);
-
-	ipa_table_reset(&nat_table->table);
-	ipa_table_reset(&nat_table->index_table);
-
-	ipa_nati_create_table_dma_cmd_helpers(nat_table, table_index);
-
-	goto done;
-
-#ifdef IPA_ON_R3PC
-bail_mem_desc:
-	ipa_mem_descriptor_delete(&nat_table->mem_desc, nat_cache_ptr->ipa_desc->fd);
-#endif
-
-bail_meta:
-	free(nat_table->index_expn_table_meta);
-	memset(nat_table, 0, sizeof(*nat_table));
-
-done:
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-static int ipa_nati_destroy_table(
-	struct ipa_nat_cache*           nat_cache_ptr,
-	struct ipa_nat_ip4_table_cache* nat_table)
-{
-	int ret;
-
-	IPADBG("In\n");
-
-	ret = ipa_mem_descriptor_delete(
-		&nat_table->mem_desc, nat_cache_ptr->ipa_desc->fd);
-
-	if (ret)
-		IPAERR("unable to delete NAT descriptor\n");
-
-	free(nat_table->index_expn_table_meta);
-
-	memset(nat_table, 0, sizeof(*nat_table));
-
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-static int ipa_nati_post_ipv4_init_cmd(
-	struct ipa_nat_cache*           nat_cache_ptr,
-	struct ipa_nat_ip4_table_cache* nat_table,
-	uint8_t                         tbl_index,
-	bool                            focus_change )
-{
-	struct ipa_ioc_v4_nat_init cmd;
-
-	char buf[1024];
-	int  ret;
-
-	IPADBG("In\n");
-
-	IPADBG("nat_cache_ptr(%p) nat_table(%p) tbl_index(%u) focus_change(%u)\n",
-		   nat_cache_ptr, nat_table, tbl_index, focus_change);
-
-	memset(&cmd, 0, sizeof(cmd));
-
-	cmd.tbl_index    = tbl_index;
-	cmd.focus_change = focus_change;
-
-	cmd.mem_type = nat_cache_ptr->nmi;
-
-	cmd.ipv4_rules_offset =
-		nat_table->mem_desc.addr_offset;
-
-	cmd.expn_rules_offset =
-		cmd.ipv4_rules_offset +
-		(nat_table->table.table_entries * sizeof(struct ipa_nat_rule));
-
-	cmd.index_offset =
-		cmd.expn_rules_offset +
-		(nat_table->table.expn_table_entries * sizeof(struct ipa_nat_rule));
-
-	cmd.index_expn_offset =
-		cmd.index_offset +
-		(nat_table->index_table.table_entries * sizeof(struct ipa_nat_indx_tbl_rule));
-
-	/*
-	 * Driverr/HW expected base table size to be power^2-1 due to H/W
-	 * hash calculation
-	 */
-	cmd.table_entries =
-		nat_table->table.table_entries - 1;
-	cmd.expn_table_entries =
-		nat_table->table.expn_table_entries;
-
-	cmd.ip_addr = nat_table->public_addr;
-
-	IPADBG("%s\n", ipa_ioc_v4_nat_init_as_str(&cmd, buf, sizeof(buf)));
-
-	ret = ioctl(nat_cache_ptr->ipa_desc->fd, IPA_IOC_V4_INIT_NAT, &cmd);
-
-	if (ret) {
-		IPAERR("unable to post init cmd Error: %d IPA fd %d\n",
-			   ret, nat_cache_ptr->ipa_desc->fd);
-		goto bail;
-	}
-
-	IPADBG("Posted IPA_IOC_V4_INIT_NAT to kernel successfully\n");
-
-bail:
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-static void ipa_nati_copy_second_index_entry_to_head(
-	struct ipa_nat_ip4_table_cache* nat_table,
-	ipa_table_iterator* index_table_iterator,
-	struct ipa_ioc_nat_dma_cmd* cmd)
-{
-	uint16_t index;
-	struct ipa_nat_rule* table;
-	struct ipa_nat_indx_tbl_rule* index_table_rule =
-		(struct ipa_nat_indx_tbl_rule*)index_table_iterator->next_entry;
-
-	IPADBG("In\n");
-
-	/*
-	 * The DMA command for field tbl_entry already added by the
-	 * index_table.ipa_table_create_delete_command()
-	 */
-	ipa_table_add_dma_cmd(
-		&nat_table->index_table,
-		HELP_UPDATE_ENTRY,
-		index_table_iterator->curr_entry,
-		index_table_iterator->curr_index,
-		index_table_rule->next_index,
-		cmd);
-
-	/* Change the indx_tbl_entry field in the related table rule */
-	if (index_table_rule->tbl_entry < nat_table->table.table_entries) {
-		index = index_table_rule->tbl_entry;
-		table = (struct ipa_nat_rule*)nat_table->table.table_addr;
-	} else {
-		index = index_table_rule->tbl_entry - nat_table->table.table_entries;
-		table = (struct ipa_nat_rule*)nat_table->table.expn_table_addr;
-	}
-
-	table[index].indx_tbl_entry = index_table_iterator->curr_index;
-
-	IPADBG("Out\n");
-}
-
-/**
- * dst_hash() - Find the index into ipv4 base table
- * @public_ip: [in] public_ip
- * @trgt_ip: [in] Target IP address
- * @trgt_port: [in]  Target port
- * @public_port: [in]  Public port
- * @proto: [in] Protocol (TCP/IP)
- * @size: [in] size of the ipv4 base Table
- *
- * This hash method is used to find the hash index of new nat
- * entry into ipv4 base table. In case of zero index, the
- * new entry will be stored into N-1 index where N is size of
- * ipv4 base table
- *
- * Returns: >0 index into ipv4 base table, negative on failure
- */
-static uint16_t dst_hash(
-	struct ipa_nat_cache* nat_cache_ptr,
-	uint32_t public_ip,
-	uint32_t trgt_ip,
-	uint16_t trgt_port,
-	uint16_t public_port,
-	uint8_t  proto,
-	uint16_t size)
-{
-	uint16_t hash =
-		((uint16_t)(trgt_ip))       ^
-		((uint16_t)(trgt_ip >> 16)) ^
-		(trgt_port)                 ^
-		(public_port)               ^
-		(proto);
-
-	IPADBG("In\n");
-
-	IPADBG("public_ip: 0x%08X public_port: 0x%04X\n", public_ip, public_port);
-	IPADBG("target_ip: 0x%08X target_port: 0x%04X\n", trgt_ip, trgt_port);
-	IPADBG("proto: 0x%02X size: 0x%04X\n", proto, size);
-
-	if (nat_cache_ptr->ipa_desc->ver >= IPA_HW_v4_0)
-		hash ^=
-			((uint16_t)(public_ip)) ^
-			((uint16_t)(public_ip >> 16));
-
-	/*
-	 * The size passed to hash function expected be power^2-1, while
-	 * the actual size is power^2, actual_size = size + 1
-	 */
-	hash = (hash & size);
-
-	/*
-	 * If the hash resulted to zero then set it to maximum value as
-	 * zero is unused entry in nat tables
-	 */
-	if (hash == 0) {
-		hash = size;
-	}
-
-	IPADBG("dst_hash returning value: %d\n", hash);
-
-	IPADBG("Out\n");
-
-	return hash;
-}
-
-/**
- * src_hash() - Find the index into ipv4 index base table
- * @priv_ip: [in] Private IP address
- * @priv_port: [in]  Private port
- * @trgt_ip: [in]  Target IP address
- * @trgt_port: [in] Target Port
- * @proto: [in]  Protocol (TCP/IP)
- * @size: [in] size of the ipv4 index base Table
- *
- * This hash method is used to find the hash index of new nat
- * entry into ipv4 index base table. In case of zero index, the
- * new entry will be stored into N-1 index where N is size of
- * ipv4 index base table
- *
- * Returns: >0 index into ipv4 index base table, negative on failure
- */
-static uint16_t src_hash(
-	uint32_t priv_ip,
-	uint16_t priv_port,
-	uint32_t trgt_ip,
-	uint16_t trgt_port,
-	uint8_t  proto,
-	uint16_t size)
-{
-	uint16_t hash =
-		((uint16_t)(priv_ip))       ^
-		((uint16_t)(priv_ip >> 16)) ^
-		(priv_port)                 ^
-		((uint16_t)(trgt_ip))       ^
-		((uint16_t)(trgt_ip >> 16)) ^
-		(trgt_port)                 ^
-		(proto);
-
-	IPADBG("In\n");
-
-	IPADBG("private_ip: 0x%08X private_port: 0x%04X\n", priv_ip, priv_port);
-	IPADBG(" target_ip: 0x%08X  target_port: 0x%04X\n", trgt_ip, trgt_port);
-	IPADBG("proto: 0x%02X size: 0x%04X\n", proto, size);
-
-	/*
-	 * The size passed to hash function expected be power^2-1, while
-	 * the actual size is power^2, actual_size = size + 1
-	 */
-	hash = (hash & size);
-
-	/*
-	 * If the hash resulted to zero then set it to maximum value as
-	 * zero is unused entry in nat tables
-	 */
-	if (hash == 0) {
-		hash = size;
-	}
-
-	IPADBG("src_hash returning value: %d\n", hash);
-
-	IPADBG("Out\n");
-
-	return hash;
-}
-
-static int ipa_nati_post_ipv4_dma_cmd(
-	struct ipa_nat_cache*       nat_cache_ptr,
-	struct ipa_ioc_nat_dma_cmd* cmd)
-{
-	char buf[4096];
-	int  ret = 0;
-
-	IPADBG("In\n");
-
-	cmd->mem_type = nat_cache_ptr->nmi;
-
-	IPADBG("%s\n", prep_ioc_nat_dma_cmd_4print(cmd, buf, sizeof(buf)));
-
-	if (ioctl(nat_cache_ptr->ipa_desc->fd, IPA_IOC_TABLE_DMA_CMD, cmd)) {
-		IPAERR("ioctl (IPA_IOC_TABLE_DMA_CMD) on fd %d has failed\n",
-			   nat_cache_ptr->ipa_desc->fd);
-		ret = -EIO;
-		goto bail;
-	}
-
-	IPADBG("Posted IPA_IOC_TABLE_DMA_CMD to kernel successfully\n");
-
-bail:
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-/*
- * ----------------------------------------------------------------------------
- * API functions exposed to the upper layers
- * ----------------------------------------------------------------------------
- */
-int ipa_nati_modify_pdn(
-	struct ipa_ioc_nat_pdn_entry *entry)
-{
-	struct ipa_nat_cache* nat_cache_ptr;
-	int ret = 0;
-
-	IPADBG("In\n");
-
-	nat_cache_ptr =
-		(ipv4_nat_cache[IPA_NAT_MEM_IN_DDR].ipa_desc) ?
-		&ipv4_nat_cache[IPA_NAT_MEM_IN_DDR]           :
-		&ipv4_nat_cache[IPA_NAT_MEM_IN_SRAM];
-
-	if ( nat_cache_ptr->ipa_desc == NULL )
-	{
-		IPAERR("Uninitialized cache file descriptor\n");
-		ret = -EIO;
-		goto done;
-	}
-
-	if (entry->public_ip == 0)
-		IPADBG("PDN %d public ip will be set  to 0\n", entry->pdn_index);
-
-	ret = ioctl(nat_cache_ptr->ipa_desc->fd, IPA_IOC_NAT_MODIFY_PDN, entry);
-
-	if ( ret ) {
-		IPAERR("unable to call modify pdn icotl\nindex %d, ip 0x%X, src_metdata 0x%X, dst_metadata 0x%X IPA fd %d\n",
-			   entry->pdn_index,
-			   entry->public_ip,
-			   entry->src_metadata,
-			   entry->dst_metadata,
-			   nat_cache_ptr->ipa_desc->fd);
-		goto done;
-	}
-
-	pdns[entry->pdn_index].public_ip    = entry->public_ip;
-	pdns[entry->pdn_index].dst_metadata = entry->dst_metadata;
-	pdns[entry->pdn_index].src_metadata = entry->src_metadata;
-
-	IPADBG("posted IPA_IOC_NAT_MODIFY_PDN to kernel successfully and stored in cache\n index %d, ip 0x%X, src_metdata 0x%X, dst_metadata 0x%X\n",
-		   entry->pdn_index,
-		   entry->public_ip,
-		   entry->src_metadata,
-		   entry->dst_metadata);
-done:
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-int ipa_nati_get_pdn_index(
-	uint32_t public_ip,
-	uint8_t *pdn_index)
-{
-	int i = 0;
-
-	for(i = 0; i < (IPA_MAX_PDN_NUM - 1); i++) {
-		if(pdns[i].public_ip == public_ip) {
-			IPADBG("ip 0x%X matches PDN index %d\n", public_ip, i);
-			*pdn_index = i;
-			return 0;
-		}
-	}
-
-	IPAERR("ip 0x%X does not match any PDN\n", public_ip);
-
-	return -EIO;
-}
-
-int ipa_nati_alloc_pdn(
-	ipa_nat_pdn_entry *pdn_info,
-	uint8_t *pdn_index)
-{
-	ipa_nat_pdn_entry zero_test;
-	struct ipa_ioc_nat_pdn_entry pdn_data;
-	int i, ret;
-
-	IPADBG("alloc PDN  for ip 0x%x\n", pdn_info->public_ip);
-
-	memset(&zero_test, 0, sizeof(zero_test));
-
-	if(num_pdns >= (IPA_MAX_PDN_NUM - 1)) {
-		IPAERR("exceeded max num of PDNs, num_pdns %d\n", num_pdns);
-		return -EIO;
-	}
-
-	for(i = 0; i < (IPA_MAX_PDN_NUM - 1); i++) {
-		if(pdns[i].public_ip == pdn_info->public_ip)
-		{
-			IPADBG("found the same pdn in index %d\n", i);
-			*pdn_index = i;
-			if((pdns[i].src_metadata != pdn_info->src_metadata) ||
-			   (pdns[i].dst_metadata != pdn_info->dst_metadata))
-			{
-				IPAERR("WARNING: metadata values don't match! [%d, %d], [%d, %d]\n\n",
-					   pdns[i].src_metadata, pdn_info->src_metadata,
-					   pdns[i].dst_metadata, pdn_info->dst_metadata);
-			}
-			return 0;
-		}
-
-		if(!memcmp((pdns + i), &zero_test, sizeof(ipa_nat_pdn_entry)))
-		{
-			IPADBG("found an empty pdn in index %d\n", i);
-			break;
-		}
-	}
-
-	if(i >= (IPA_MAX_PDN_NUM - 1))
-	{
-		IPAERR("couldn't find an empty entry while num is %d\n",
-			   num_pdns);
-		return -EIO;
-	}
-
-	pdn_data.pdn_index    = i;
-	pdn_data.public_ip    = pdn_info->public_ip;
-	pdn_data.src_metadata = pdn_info->src_metadata;
-	pdn_data.dst_metadata = pdn_info->dst_metadata;
-
-	ret = ipa_nati_modify_pdn(&pdn_data);
-	if(!ret)
-	{
-		num_pdns++;
-		*pdn_index = i;
-		IPADBG("modify num_pdns (%d)\n", num_pdns);
-	}
-
-	return ret;
-}
-
-int ipa_nati_get_pdn_cnt(void)
-{
-	return num_pdns;
-}
-
-int ipa_nati_dealloc_pdn(
-	uint8_t pdn_index)
-{
-	ipa_nat_pdn_entry zero_test;
-	struct ipa_ioc_nat_pdn_entry pdn_data;
-	int ret;
-
-	IPADBG(" trying to deallocate PDN index %d\n", pdn_index);
-
-	if(!num_pdns)
-	{
-		IPAERR("pdn table is already empty\n");
-		return -EIO;
-	}
-
-	memset(&zero_test, 0, sizeof(zero_test));
-
-	if(!memcmp((pdns + pdn_index), &zero_test, sizeof(ipa_nat_pdn_entry)))
-	{
-		IPAERR("pdn entry is a zero entry\n");
-		return -EIO;
-	}
-
-	IPADBG("PDN in index %d has ip 0x%X\n", pdn_index, pdns[pdn_index].public_ip);
-
-	pdn_data.pdn_index    = pdn_index;
-	pdn_data.src_metadata = 0;
-	pdn_data.dst_metadata = 0;
-	pdn_data.public_ip    = 0;
-
-	ret = ipa_nati_modify_pdn(&pdn_data);
-	if(ret)
-	{
-		IPAERR("failed modifying PDN\n");
-		return -EIO;
-	}
-
-	memset((pdns + pdn_index), 0, sizeof(ipa_nat_pdn_entry));
-
-	num_pdns--;
-
-	IPADBG("successfully removed pdn from index %d num_pdns %d\n", pdn_index, num_pdns);
-
-	return 0;
-}
-
-/*
- * ----------------------------------------------------------------------------
- * Previously public API functions, but have been hijacked (in
- * ipa_nat_statemach.c).  The new definitions that replaced these, now
- * call the functions below.
- * ----------------------------------------------------------------------------
- */
-int ipa_NATI_post_ipv4_init_cmd(
-	uint32_t tbl_hdl )
-{
-	enum ipa3_nat_mem_in            nmi;
-	struct ipa_nat_cache*           nat_cache_ptr;
-	struct ipa_nat_ip4_table_cache* nat_table;
-	int ret;
-
-	IPADBG("In\n");
-
-	BREAK_TBL_HDL(tbl_hdl, nmi, tbl_hdl);
-
-	if ( ! IPA_VALID_NAT_MEM_IN(nmi) ) {
-		IPAERR("Bad cache type argument passed\n");
-		ret = -EINVAL;
-		goto bail;
-	}
-
-	IPADBG("nmi(%s)\n", ipa3_nat_mem_in_as_str(nmi));
-
-	nat_cache_ptr = &ipv4_nat_cache[nmi];
-
-	if (pthread_mutex_lock(&nat_mutex)) {
-		IPAERR("unable to lock the nat mutex\n");
-		ret = -EINVAL;
-		goto bail;
-	}
-
-	if ( ! nat_cache_ptr->table_cnt ) {
-		IPAERR("No initialized table in NAT cache\n");
-		ret = -EINVAL;
-		goto unlock;
-	}
-
-	nat_table = &nat_cache_ptr->ip4_tbl[tbl_hdl - 1];
-
-	ret = ipa_nati_post_ipv4_init_cmd(
-		nat_cache_ptr,
-		nat_table,
-		tbl_hdl - 1,
-		true);
-
-	if (ret) {
-		IPAERR("unable to post nat_init command Error %d\n", ret);
-		goto unlock;
-	}
-
-	active_nat_cache_ptr = nat_cache_ptr;
-
-unlock:
-	if (pthread_mutex_unlock(&nat_mutex)) {
-		IPAERR("unable to unlock the nat mutex\n");
-		ret = (ret) ? ret : -EPERM;
-	}
-
-bail:
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-/**
- * ipa_NATI_add_ipv4_tbl() - Adds a new IPv4 NAT table
- * @ct: [in] the desired cache type to use
- * @public_ip_addr: [in] public IPv4 address
- * @number_of_entries: [in] number of NAT entries
- * @table_handle: [out] handle of new IPv4 NAT table
- *
- * This function creates new IPv4 NAT table and posts IPv4 NAT init command to HW
- *
- * Returns:	0  On Success, negative on failure
- */
-int ipa_NATI_add_ipv4_tbl(
-	enum ipa3_nat_mem_in nmi,
-	uint32_t             public_ip_addr,
-	uint16_t             number_of_entries,
-	uint32_t*            tbl_hdl )
-{
-	struct ipa_nat_cache*           nat_cache_ptr;
-	struct ipa_nat_ip4_table_cache* nat_table;
-	int ret = 0;
-
-	IPADBG("In\n");
-
-	*tbl_hdl = 0;
-
-	if ( ! IPA_VALID_NAT_MEM_IN(nmi) ) {
-		IPAERR("Bad cache type argument passed\n");
-		ret = -EINVAL;
-		goto bail;
-	}
-
-	IPADBG("nmi(%s)\n", ipa3_nat_mem_in_as_str(nmi));
-
-	nat_cache_ptr = &ipv4_nat_cache[nmi];
-
-	if (pthread_mutex_lock(&nat_mutex)) {
-		IPAERR("unable to lock the nat mutex\n");
-		ret = -EINVAL;
-		goto bail;
-	}
-
-	nat_cache_ptr->nmi = nmi;
-
-	if (nat_cache_ptr->table_cnt >= IPA_NAT_MAX_IP4_TBLS) {
-		IPAERR(
-			"Can't add addition NAT table. Maximum %d tables allowed\n",
-			IPA_NAT_MAX_IP4_TBLS);
-		ret = -EINVAL;
-		goto unlock;
-	}
-
-	if ( ! nat_cache_ptr->ipa_desc ) {
-		nat_cache_ptr->ipa_desc = ipa_descriptor_open();
-		if ( nat_cache_ptr->ipa_desc == NULL ) {
-			IPAERR("failed to open IPA driver file descriptor\n");
-			ret = -EIO;
-			goto unlock;
-		}
-	}
-
-	nat_table = &nat_cache_ptr->ip4_tbl[nat_cache_ptr->table_cnt];
-
-	ret = ipa_nati_create_table(
-		nat_cache_ptr,
-		nat_table,
-		public_ip_addr,
-		number_of_entries,
-		nat_cache_ptr->table_cnt);
-
-	if (ret) {
-		IPAERR("unable to create nat table Error: %d\n", ret);
-		goto failed_create_table;
-	}
-
-	/*
-	 * Initialize the ipa hw with nat table dimensions
-	 */
-	ret = ipa_nati_post_ipv4_init_cmd(
-		nat_cache_ptr,
-		nat_table,
-		nat_cache_ptr->table_cnt,
-		false);
-
-	if (ret) {
-		IPAERR("unable to post nat_init command Error %d\n", ret);
-		goto failed_post_init_cmd;
-	}
-
-	active_nat_cache_ptr = nat_cache_ptr;
-
-	/*
-	 * Store the initial public ip address in the cached pdn table
-	 * this is backward compatible for pre IPAv4 versions, we will
-	 * always use this ip as the single PDN address
-	 */
-	pdns[0].public_ip = public_ip_addr;
-	num_pdns = 1;
-
-	nat_cache_ptr->table_cnt++;
-
-	/*
-	 * Return table handle
-	 */
-	*tbl_hdl = MAKE_TBL_HDL(nat_cache_ptr->table_cnt, nmi);
-
-	IPADBG("tbl_hdl value(0x%08X) num_pdns (%d)\n", *tbl_hdl, num_pdns);
-
-	goto unlock;
-
-failed_post_init_cmd:
-	ipa_nati_destroy_table(nat_cache_ptr, nat_table);
-
-failed_create_table:
-	if (!nat_cache_ptr->table_cnt) {
-		ipa_descriptor_close(nat_cache_ptr->ipa_desc);
-		nat_cache_ptr->ipa_desc = NULL;
-	}
-
-unlock:
-	if (pthread_mutex_unlock(&nat_mutex)) {
-		IPAERR("unable to unlock the nat mutex\n");
-		ret = -EPERM;
-		goto bail;
-	}
-
-bail:
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-int ipa_NATI_del_ipv4_table(
-	uint32_t tbl_hdl )
-{
-	enum ipa3_nat_mem_in            nmi;
-	struct ipa_nat_cache*           nat_cache_ptr;
-	struct ipa_nat_ip4_table_cache* nat_table;
-
-	int ret;
-
-	IPADBG("In\n");
-
-	BREAK_TBL_HDL(tbl_hdl, nmi, tbl_hdl);
-
-	if ( ! IPA_VALID_NAT_MEM_IN(nmi) ) {
-		IPAERR("Bad cache type argument passed\n");
-		ret = -EINVAL;
-		goto bail;
-	}
-
-	IPADBG("nmi(%s)\n", ipa3_nat_mem_in_as_str(nmi));
-
-	nat_cache_ptr = &ipv4_nat_cache[nmi];
-
-	nat_table = &nat_cache_ptr->ip4_tbl[tbl_hdl - 1];
-
-	if (pthread_mutex_lock(&nat_mutex)) {
-		IPAERR("unable to lock the nat mutex\n");
-		ret = -EINVAL;
-		goto bail;
-	}
-
-	if (! nat_table->mem_desc.valid) {
-		IPAERR("invalid table handle %d\n", tbl_hdl);
-		ret = -EINVAL;
-		goto unlock;
-	}
-
-	ret = ipa_nati_destroy_table(nat_cache_ptr, nat_table);
-	if (ret) {
-		IPAERR("unable to delete NAT table with handle %d\n", tbl_hdl);
-		goto unlock;
-	}
-
-	if (! --nat_cache_ptr->table_cnt) {
-		ipa_descriptor_close(nat_cache_ptr->ipa_desc);
-		nat_cache_ptr->ipa_desc = NULL;
-	}
-
-unlock:
-	if (pthread_mutex_unlock(&nat_mutex)) {
-		IPAERR("unable to unlock the nat mutex\n");
-		ret = (ret) ? ret : -EPERM;
-	}
-
-bail:
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-int ipa_NATI_query_timestamp(
-	uint32_t  tbl_hdl,
-	uint32_t  rule_hdl,
-	uint32_t* time_stamp )
-{
-	enum ipa3_nat_mem_in            nmi;
-	struct ipa_nat_cache*           nat_cache_ptr;
-	struct ipa_nat_ip4_table_cache* nat_table;
-	struct ipa_nat_rule*            rule_ptr;
-
-	char buf[1024];
-	int  ret;
-
-	IPADBG("In\n");
-
-	BREAK_TBL_HDL(tbl_hdl, nmi, tbl_hdl);
-
-	if ( ! IPA_VALID_NAT_MEM_IN(nmi) ) {
-		IPAERR("Bad cache type argument passed\n");
-		ret = -EINVAL;
-		goto bail;
-	}
-
-	IPADBG("nmi(%s)\n", ipa3_nat_mem_in_as_str(nmi));
-
-	nat_cache_ptr = &ipv4_nat_cache[nmi];
-
-	nat_table = &nat_cache_ptr->ip4_tbl[tbl_hdl - 1];
-
-	if (pthread_mutex_lock(&nat_mutex)) {
-		IPAERR("unable to lock the nat mutex\n");
-		ret = -EINVAL;
-		goto bail;
-	}
-
-	if ( ! nat_table->mem_desc.valid ) {
-		IPAERR("invalid table handle %d\n", tbl_hdl);
-		ret = -EINVAL;
-		goto unlock;
-	}
-
-	ret = ipa_table_get_entry(
-		&nat_table->table,
-		rule_hdl,
-		(void**) &rule_ptr,
-		NULL);
-
-	if (ret) {
-		IPAERR("Unable to retrive the entry with "
-			   "handle=%u in NAT table with handle=0x%08X\n",
-			   rule_hdl, tbl_hdl);
-		goto unlock;
-	}
-
-	IPADBG("rule_hdl(0x%08X) -> %s\n",
-		   rule_hdl,
-		   prep_nat_rule_4print(rule_ptr, buf, sizeof(buf)));
-
-	*time_stamp = rule_ptr->time_stamp;
-
-unlock:
-	if (pthread_mutex_unlock(&nat_mutex)) {
-		IPAERR("unable to unlock the nat mutex\n");
-		ret = (ret) ? ret : -EPERM;
-	}
-
-bail:
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-int ipa_NATI_add_ipv4_rule(
-	uint32_t                 tbl_hdl,
-	const ipa_nat_ipv4_rule* clnt_rule,
-	uint32_t*                rule_hdl)
-{
-	uint32_t cmd_sz =
-		sizeof(struct ipa_ioc_nat_dma_cmd) +
-		(MAX_DMA_ENTRIES_FOR_ADD * sizeof(struct ipa_ioc_nat_dma_one));
-	char cmd_buf[cmd_sz];
-	struct ipa_ioc_nat_dma_cmd* cmd =
-		(struct ipa_ioc_nat_dma_cmd*) cmd_buf;
-
-	enum ipa3_nat_mem_in            nmi;
-	struct ipa_nat_cache*           nat_cache_ptr;
-	struct ipa_nat_ip4_table_cache* nat_table;
-	struct ipa_nat_rule*            rule;
-
-	uint16_t new_entry_index;
-	uint16_t new_index_tbl_entry_index;
-	uint32_t new_entry_handle;
-	char     buf[1024];
-
-	int ret = 0;
-
-	IPADBG("In\n");
-
-	memset(cmd_buf, 0, sizeof(cmd_buf));
-
-	if ( ! VALID_TBL_HDL(tbl_hdl) ||
-		 ! clnt_rule ||
-		 ! rule_hdl )
-	{
-		IPAERR("Bad arg: tbl_hdl(0x%08X) and/or clnt_rule(%p) and/or rule_hdl(%p)\n",
-			   tbl_hdl, clnt_rule, rule_hdl);
-		ret = -EINVAL;
-		goto done;
-	}
-
-	*rule_hdl = 0;
-
-	IPADBG("tbl_hdl(0x%08X)\n", tbl_hdl);
-
-	BREAK_TBL_HDL(tbl_hdl, nmi, tbl_hdl);
-
-	if ( ! IPA_VALID_NAT_MEM_IN(nmi) ) {
-		IPAERR("Bad cache type argument passed\n");
-		ret = -EINVAL;
-		goto done;
-	}
-
-	IPADBG("tbl_hdl(0x%08X) nmi(%s) %s\n",
-		   tbl_hdl,
-		   ipa3_nat_mem_in_as_str(nmi),
-		   prep_nat_ipv4_rule_4print(clnt_rule, buf, sizeof(buf)));
-
-	nat_cache_ptr = &ipv4_nat_cache[nmi];
-
-	nat_table = &nat_cache_ptr->ip4_tbl[tbl_hdl - 1];
-
-	if (clnt_rule->protocol == IPAHAL_NAT_INVALID_PROTOCOL) {
-		IPAERR("invalid parameter protocol=%d\n", clnt_rule->protocol);
-		ret = -EINVAL;
-		goto done;
-	}
-
-	/*
-	 * Verify that the rule's PDN is valid
-	 */
-	if (clnt_rule->pdn_index >= IPA_MAX_PDN_NUM ||
-		pdns[clnt_rule->pdn_index].public_ip == 0) {
-		IPAERR("invalid parameters, pdn index %d, public ip = 0x%X\n",
-			   clnt_rule->pdn_index, pdns[clnt_rule->pdn_index].public_ip);
-		ret = -EINVAL;
-		goto done;
-	}
-
-	if (pthread_mutex_lock(&nat_mutex)) {
-		IPAERR("unable to lock the nat mutex\n");
-		ret = -EINVAL;
-		goto done;
-	}
-
-	if (! nat_table->mem_desc.valid) {
-		IPAERR("invalid table handle %d\n", tbl_hdl);
-		ret = -EINVAL;
-		goto unlock;
-	}
-
-	/* src_only */
-	if (clnt_rule->src_only) {
-		new_entry_index = dst_hash(
-			nat_cache_ptr,
-			pdns[clnt_rule->pdn_index].public_ip,
-			clnt_rule->target_ip,
-			clnt_rule->target_port,
-			clnt_rule->public_port,
-			clnt_rule->protocol,
-			nat_table->table.table_entries - 1) + Hash_token;
-		new_entry_index = (new_entry_index & (nat_table->table.table_entries - 1));
-		if (new_entry_index == 0) {
-			new_entry_index = nat_table->table.table_entries - 1;
-		}
-		Hash_token++;
-	} else {
-	new_entry_index = dst_hash(
-		nat_cache_ptr,
-		pdns[clnt_rule->pdn_index].public_ip,
-		clnt_rule->target_ip,
-		clnt_rule->target_port,
-		clnt_rule->public_port,
-		clnt_rule->protocol,
-		nat_table->table.table_entries - 1);
-	}
-
-	ret = ipa_table_add_entry(
-		&nat_table->table,
-		(void*) clnt_rule,
-		&new_entry_index,
-		&new_entry_handle,
-		cmd);
-
-	if (ret) {
-		IPAERR("Failed to add a new NAT entry\n");
-		goto unlock;
-	}
-
-	/* dst_only */
-	if (clnt_rule->dst_only) {
-		new_index_tbl_entry_index =
-			src_hash(clnt_rule->private_ip,
-				 clnt_rule->private_port,
-				 clnt_rule->target_ip,
-				 clnt_rule->target_port,
-				 clnt_rule->protocol,
-				 nat_table->table.table_entries - 1) + Hash_token;
-		new_index_tbl_entry_index = (new_index_tbl_entry_index & (nat_table->table.table_entries - 1));
-		if (new_index_tbl_entry_index == 0) {
-			new_index_tbl_entry_index = nat_table->table.table_entries - 1;
-		}
-		Hash_token++;
-	} else {
-	new_index_tbl_entry_index =
-		src_hash(clnt_rule->private_ip,
-				 clnt_rule->private_port,
-				 clnt_rule->target_ip,
-				 clnt_rule->target_port,
-				 clnt_rule->protocol,
-				 nat_table->table.table_entries - 1);
-	}
-	ret = ipa_table_add_entry(
-		&nat_table->index_table,
-		(void*) &new_entry_index,
-		&new_index_tbl_entry_index,
-		NULL,
-		cmd);
-
-	if (ret) {
-		IPAERR("failed to add a new NAT index entry\n");
-		goto fail_add_index_entry;
-	}
-
-	rule = ipa_table_get_entry_by_index(
-		&nat_table->table,
-		new_entry_index);
-
-	if (rule == NULL) {
-		IPAERR("Failed to retrieve the entry in index %d for NAT table with handle=%d\n",
-			   new_entry_index, tbl_hdl);
-		ret = -EPERM;
-		goto bail;
-	}
-
-	rule->indx_tbl_entry = new_index_tbl_entry_index;
-
-	rule->redirect   = clnt_rule->redirect;
-	rule->enable     = clnt_rule->enable;
-	rule->time_stamp = clnt_rule->time_stamp;
-
-	IPADBG("new entry:%d, new index entry: %d\n",
-		   new_entry_index, new_index_tbl_entry_index);
-
-	IPADBG("rule_hdl(0x%08X) -> %s\n",
-		   new_entry_handle,
-		   prep_nat_rule_4print(rule, buf, sizeof(buf)));
-
-	ret = ipa_nati_post_ipv4_dma_cmd(nat_cache_ptr, cmd);
-
-	if (ret) {
-		IPAERR("unable to post dma command\n");
-		goto bail;
-	}
-
-	if (pthread_mutex_unlock(&nat_mutex)) {
-		IPAERR("unable to unlock the nat mutex\n");
-		ret = -EPERM;
-		goto done;
-	}
-
-	*rule_hdl = new_entry_handle;
-
-	IPADBG("rule_hdl value(%u)\n", *rule_hdl);
-
-	goto done;
-
-bail:
-	ipa_table_erase_entry(&nat_table->index_table, new_index_tbl_entry_index);
-
-fail_add_index_entry:
-	ipa_table_erase_entry(&nat_table->table, new_entry_index);
-
-unlock:
-	if (pthread_mutex_unlock(&nat_mutex))
-		IPAERR("unable to unlock the nat mutex\n");
-done:
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-int ipa_NATI_del_ipv4_rule(
-	uint32_t tbl_hdl,
-	uint32_t rule_hdl )
-{
-	uint32_t cmd_sz =
-		sizeof(struct ipa_ioc_nat_dma_cmd) +
-		(MAX_DMA_ENTRIES_FOR_DEL * sizeof(struct ipa_ioc_nat_dma_one));
-	char cmd_buf[cmd_sz];
-	struct ipa_ioc_nat_dma_cmd* cmd =
-		(struct ipa_ioc_nat_dma_cmd*) cmd_buf;
-
-	enum ipa3_nat_mem_in            nmi;
-	struct ipa_nat_cache*           nat_cache_ptr;
-	struct ipa_nat_ip4_table_cache* nat_table;
-	struct ipa_nat_rule*            table_rule;
-	struct ipa_nat_indx_tbl_rule*   index_table_rule;
-
-	ipa_table_iterator table_iterator;
-	ipa_table_iterator index_table_iterator;
-
-	uint16_t index;
-	char     buf[1024];
-	int      ret = 0;
-
-	IPADBG("In\n");
-
-	memset(cmd_buf, 0, sizeof(cmd_buf));
-
-	IPADBG("tbl_hdl(0x%08X) rule_hdl(%u)\n", tbl_hdl, rule_hdl);
-
-	BREAK_TBL_HDL(tbl_hdl, nmi, tbl_hdl);
-
-	if ( ! IPA_VALID_NAT_MEM_IN(nmi) ) {
-		IPAERR("Bad cache type argument passed\n");
-		ret = -EINVAL;
-		goto done;
-	}
-
-	IPADBG("nmi(%s)\n", ipa3_nat_mem_in_as_str(nmi));
-
-	nat_cache_ptr = &ipv4_nat_cache[nmi];
-
-	nat_table = &nat_cache_ptr->ip4_tbl[tbl_hdl - 1];
-
-	if (pthread_mutex_lock(&nat_mutex)) {
-		IPAERR("Unable to lock the nat mutex\n");
-		ret = -EINVAL;
-		goto done;
-	}
-
-	if (! nat_table->mem_desc.valid) {
-		IPAERR("Invalid table handle 0x%08X\n", tbl_hdl);
-		ret = -EINVAL;
-		goto unlock;
-	}
-
-	ret = ipa_table_get_entry(
-		&nat_table->table,
-		rule_hdl,
-		(void**) &table_rule,
-		&index);
-
-	if (ret) {
-		IPAERR("Unable to retrive the entry with rule_hdl=%u\n", rule_hdl);
-		goto unlock;
-	}
-
-	IPADBG("rule_hdl(0x%08X) -> %s\n",
-		   rule_hdl,
-		   prep_nat_rule_4print(table_rule, buf, sizeof(buf)));
-
-	ret = ipa_table_iterator_init(
-		&table_iterator,
-		&nat_table->table,
-		table_rule,
-		index);
-
-	if (ret) {
-		IPAERR("Unable to create iterator which points to the "
-			   "entry %u in NAT table with handle=0x%08X\n",
-			   index, tbl_hdl);
-		goto unlock;
-	}
-
-	index = table_rule->indx_tbl_entry;
-
-	index_table_rule = (struct ipa_nat_indx_tbl_rule*)
-		ipa_table_get_entry_by_index(&nat_table->index_table, index);
-
-	if (index_table_rule == NULL) {
-		IPAERR("Unable to retrieve the entry in index %u "
-			   "in NAT index table with handle=0x%08X\n",
-			   index, tbl_hdl);
-		ret = -EPERM;
-		goto unlock;
-	}
-
-	ret = ipa_table_iterator_init(
-		&index_table_iterator,
-		&nat_table->index_table,
-		index_table_rule,
-		index);
-
-	if (ret) {
-		IPAERR("Unable to create iterator which points to the "
-			   "entry %u in NAT index table with handle=0x%08X\n",
-			   index, tbl_hdl);
-		goto unlock;
-	}
-
-	ipa_table_create_delete_command(
-		&nat_table->index_table,
-		cmd,
-		&index_table_iterator);
-
-	if (ipa_table_iterator_is_head_with_tail(&index_table_iterator)) {
-
-		ipa_nati_copy_second_index_entry_to_head(
-			nat_table, &index_table_iterator, cmd);
-		/*
-		 * Iterate to the next entry which should be deleted
-		 */
-		ret = ipa_table_iterator_next(
-			&index_table_iterator, &nat_table->index_table);
-
-		if (ret) {
-			IPAERR("Unable to move the iterator to the next entry "
-				   "(points to the entry %u in NAT index table)\n",
-				   index);
-			goto unlock;
-		}
-	}
-
-	ipa_table_create_delete_command(
-		&nat_table->table,
-		cmd,
-		&table_iterator);
-
-	ret = ipa_nati_post_ipv4_dma_cmd(nat_cache_ptr, cmd);
-
-	if (ret) {
-		IPAERR("Unable to post dma command\n");
-		goto unlock;
-	}
-
-	if (! ipa_table_iterator_is_head_with_tail(&table_iterator)) {
-		/* The entry can be deleted */
-		uint8_t is_prev_empty =
-			(table_iterator.prev_entry != NULL &&
-			 ((struct ipa_nat_rule*)table_iterator.prev_entry)->protocol ==
-			 IPAHAL_NAT_INVALID_PROTOCOL);
-
-		ipa_table_delete_entry(
-			&nat_table->table, &table_iterator, is_prev_empty);
-	}
-
-	ipa_table_delete_entry(
-		&nat_table->index_table,
-		&index_table_iterator,
-		FALSE);
-
-	if (index_table_iterator.curr_index >= nat_table->index_table.table_entries)
-		nat_table->index_expn_table_meta[
-			index_table_iterator.curr_index - nat_table->index_table.table_entries].
-			prev_index = IPA_TABLE_INVALID_ENTRY;
-
-unlock:
-	if (pthread_mutex_unlock(&nat_mutex)) {
-		IPAERR("Unable to unlock the nat mutex\n");
-		ret = (ret) ? ret : -EPERM;
-	}
-
-done:
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-/*
- * ----------------------------------------------------------------------------
- * New function to get sram size.
- * ----------------------------------------------------------------------------
- */
-int ipa_nati_get_sram_size(
-	uint32_t* size_ptr)
-{
-	struct ipa_nat_cache* nat_cache_ptr =
-		&ipv4_nat_cache[IPA_NAT_MEM_IN_SRAM];
-	struct ipa_nat_in_sram_info nat_sram_info;
-	int ret;
-
-	IPADBG("In\n");
-
-	if (pthread_mutex_lock(&nat_mutex)) {
-		IPAERR("unable to lock the nat mutex\n");
-		ret = -EINVAL;
-		goto bail;
-	}
-
-	if ( ! nat_cache_ptr->ipa_desc ) {
-		nat_cache_ptr->ipa_desc = ipa_descriptor_open();
-		if ( nat_cache_ptr->ipa_desc == NULL ) {
-			IPAERR("failed to open IPA driver file descriptor\n");
-			ret = -EIO;
-			goto unlock;
-		}
-	}
-
-	memset(&nat_sram_info, 0, sizeof(nat_sram_info));
-
-	ret = ioctl(nat_cache_ptr->ipa_desc->fd,
-				IPA_IOC_GET_NAT_IN_SRAM_INFO,
-				&nat_sram_info);
-
-	if (ret) {
-		IPAERR("NAT_IN_SRAM_INFO ioctl failure %d on IPA fd %d\n",
-			   ret, nat_cache_ptr->ipa_desc->fd);
-		goto unlock;
-	}
-
-	if ( (*size_ptr = nat_sram_info.sram_mem_available_for_nat) == 0 )
-	{
-		IPAERR("sram_mem_available_for_nat is zero\n");
-		ret = -EINVAL;
-		goto unlock;
-	}
-
-unlock:
-	if (pthread_mutex_unlock(&nat_mutex)) {
-		IPAERR("unable to unlock the nat mutex\n");
-		ret = (ret) ? ret : -EPERM;
-	}
-
-bail:
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-/*
- * ----------------------------------------------------------------------------
- * Utility functions
- * ----------------------------------------------------------------------------
- */
-static int print_nat_rule(
-	ipa_table*      table_ptr,
-	uint32_t        rule_hdl,
-	void*           record_ptr,
-	uint16_t        record_index,
-	void*           meta_record_ptr,
-	uint16_t        meta_record_index,
-	void*           arb_data_ptr )
-{
-	enum ipa3_nat_mem_in nmi;
-	uint8_t              is_expn_tbl;
-	uint16_t             rule_index;
-
-	char buf[1024];
-
-	struct ipa_nat_rule* rule_ptr =
-		(struct ipa_nat_rule*) record_ptr;
-
-	if ( rule_ptr->protocol == IPA_NAT_INVALID_PROTO_FIELD_VALUE_IN_RULE )
-	{
-		goto bail;
-	}
-
-	BREAK_RULE_HDL(table_ptr, rule_hdl, nmi, is_expn_tbl, rule_index);
-
-	printf("  %s %s (0x%04X) (0x%08X) -> %s\n",
-		   (table_ptr->nmi == IPA_NAT_MEM_IN_DDR) ? "DDR" : "SRAM",
-		   (is_expn_tbl) ? "EXP " : "BASE",
-		   record_index,
-		   rule_hdl,
-		   prep_nat_rule_4print(rule_ptr, buf, sizeof(buf)));
-
-	fflush(stdout);
-
-	*((bool*) arb_data_ptr) = false;
-
-bail:
-	return 0;
-}
-
-static int print_meta_data(
-	ipa_table*      table_ptr,
-	uint32_t        rule_hdl,
-	void*           record_ptr,
-	uint16_t        record_index,
-	void*           meta_record_ptr,
-	uint16_t        meta_record_index,
-	void*           arb_data_ptr )
-{
-	struct ipa_nat_indx_tbl_rule* index_entry =
-		(struct ipa_nat_indx_tbl_rule *) record_ptr;
-
-	struct ipa_nat_indx_tbl_meta_info* mi_ptr =
-		(struct ipa_nat_indx_tbl_meta_info*) meta_record_ptr;
-
-	enum ipa3_nat_mem_in nmi;
-	uint8_t              is_expn_tbl;
-	uint16_t             rule_index;
-
-	BREAK_RULE_HDL(table_ptr, rule_hdl, nmi, is_expn_tbl, rule_index);
-
-	if ( mi_ptr )
-	{
-		printf("  %s %s Entry_Index=0x%04X Table_Entry=0x%04X -> "
-			   "Prev_Index=0x%04X Next_Index=0x%04X\n",
-			   (table_ptr->nmi == IPA_NAT_MEM_IN_DDR) ? "DDR" : "SRAM",
-			   (is_expn_tbl) ? "EXP " : "BASE",
-			   record_index,
-			   index_entry->tbl_entry,
-			   mi_ptr->prev_index,
-			   index_entry->next_index);
-	}
-	else
-	{
-		printf("  %s %s Entry_Index=0x%04X Table_Entry=0x%04X -> "
-			   "Prev_Index=0xXXXX Next_Index=0x%04X\n",
-			   (table_ptr->nmi == IPA_NAT_MEM_IN_DDR) ? "DDR" : "SRAM",
-			   (is_expn_tbl) ? "EXP " : "BASE",
-			   record_index,
-			   index_entry->tbl_entry,
-			   index_entry->next_index);
-	}
-
-	fflush(stdout);
-
-	*((bool*) arb_data_ptr) = false;
-
-	return 0;
-}
-
-void ipa_nat_dump_ipv4_table(
-	uint32_t tbl_hdl )
-{
-	bool empty;
-
-	if (pthread_mutex_lock(&nat_mutex)) {
-		IPAERR("unable to lock the nat mutex\n");
-		return;
-	}
-
-	printf("\nIPv4 active rules:\n");
-
-	empty = true;
-
-	ipa_nati_walk_ipv4_tbl(tbl_hdl, USE_NAT_TABLE, print_nat_rule, &empty);
-
-	if ( empty )
-	{
-		printf("  Empty\n");
-	}
-
-	printf("\nExpansion Index Table Meta Data:\n");
-
-	empty = true;
-
-	ipa_nati_walk_ipv4_tbl(tbl_hdl, USE_INDEX_TABLE, print_meta_data, &empty);
-
-	if ( empty )
-	{
-		printf("  Empty\n");
-	}
-
-	printf("\n");
-
-	if (pthread_mutex_unlock(&nat_mutex)) {
-		IPAERR("unable to unlock the nat mutex\n");
-	}
-}
-
-int ipa_NATI_clear_ipv4_tbl(
-	uint32_t tbl_hdl )
-{
-	enum ipa3_nat_mem_in            nmi;
-	struct ipa_nat_cache*           nat_cache_ptr;
-	struct ipa_nat_ip4_table_cache* nat_table;
-	int ret = 0;
-
-	IPADBG("In\n");
-
-	BREAK_TBL_HDL(tbl_hdl, nmi, tbl_hdl);
-
-	if ( ! IPA_VALID_NAT_MEM_IN(nmi) ) {
-		IPAERR("Bad cache type argument passed\n");
-		ret = -EINVAL;
-		goto bail;
-	}
-
-	IPADBG("nmi(%s)\n", ipa3_nat_mem_in_as_str(nmi));
-
-	nat_cache_ptr = &ipv4_nat_cache[nmi];
-
-	if (pthread_mutex_lock(&nat_mutex)) {
-		IPAERR("unable to lock the nat mutex\n");
-		ret = -EINVAL;
-		goto bail;
-	}
-
-	if ( ! nat_cache_ptr->table_cnt ) {
-		IPAERR("No initialized table in NAT cache\n");
-		ret = -EINVAL;
-		goto unlock;
-	}
-
-	nat_table = &nat_cache_ptr->ip4_tbl[tbl_hdl - 1];
-
-	ipa_table_reset(&nat_table->table);
-	nat_table->table.cur_tbl_cnt =
-		nat_table->table.cur_expn_tbl_cnt = 0;
-
-	ipa_table_reset(&nat_table->index_table);
-	nat_table->index_table.cur_tbl_cnt =
-		nat_table->index_table.cur_expn_tbl_cnt = 0;
-
-unlock:
-	if (pthread_mutex_unlock(&nat_mutex)) {
-		IPAERR("unable to unlock the nat mutex\n");
-		ret = (ret) ? ret : -EPERM;
-	}
-
-bail:
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-int ipa_nati_copy_ipv4_tbl(
-	uint32_t          src_tbl_hdl,
-	uint32_t          dst_tbl_hdl,
-	ipa_table_walk_cb copy_cb )
-{
-	int ret = 0;
-
-	IPADBG("In\n");
-
-	if ( ! copy_cb )
-	{
-		IPAERR("copy_cb is null\n");
-		ret = -EINVAL;
-		goto bail;
-	}
-
-	if (pthread_mutex_lock(&nat_mutex))
-	{
-		IPAERR("unable to lock the nat mutex\n");
-		ret = -EINVAL;
-		goto bail;
-	}
-
-	/*
-	 * Clear the destination table...
-	 */
-	ret = ipa_NATI_clear_ipv4_tbl(dst_tbl_hdl);
-
-	if ( ret == 0 )
-	{
-		/*
-		 * Now walk the source table and pass the valid records to the
-		 * user's copy callback...
-		 */
-		ret = ipa_NATI_walk_ipv4_tbl(
-			src_tbl_hdl, USE_NAT_TABLE, copy_cb, dst_tbl_hdl);
-
-		if ( ret != 0 )
-		{
-			IPAERR("ipa_table_walk returned non-zero (%d)\n", ret);
-			goto unlock;
-		}
-	}
-
-unlock:
-	if (pthread_mutex_unlock(&nat_mutex))
-	{
-		IPAERR("unable to unlock the nat mutex\n");
-		ret = (ret) ? ret : -EPERM;
-	}
-
-bail:
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-int ipa_NATI_walk_ipv4_tbl(
-	uint32_t          tbl_hdl,
-	WhichTbl2Use      which,
-	ipa_table_walk_cb walk_cb,
-	void*             arb_data_ptr )
-{
-	enum ipa3_nat_mem_in            nmi;
-	uint32_t                        broken_tbl_hdl;
-	struct ipa_nat_cache*           nat_cache_ptr;
-	struct ipa_nat_ip4_table_cache* nat_table;
-	ipa_table*                      ipa_tbl_ptr;
-
-	int ret = 0;
-
-	IPADBG("In\n");
-
-	if ( ! VALID_TBL_HDL(tbl_hdl) ||
-		 ! VALID_WHICHTBL2USE(which) ||
-		 ! walk_cb )
-	{
-		IPAERR("Bad arg: tbl_hdl(0x%08X) and/or WhichTbl2Use(%u) and/or walk_cb(%p)\n",
-			   tbl_hdl, which, walk_cb);
-		ret = -EINVAL;
-		goto bail;
-	}
-
-	if ( pthread_mutex_lock(&nat_mutex) )
-	{
-		IPAERR("unable to lock the nat mutex\n");
-		ret = -EINVAL;
-		goto bail;
-	}
-
-	/*
-	 * Now walk the table and pass the valid records to the user's
-	 * walk callback...
-	 */
-	BREAK_TBL_HDL(tbl_hdl, nmi, broken_tbl_hdl);
-
-	if ( ! IPA_VALID_NAT_MEM_IN(nmi) )
-	{
-		IPAERR("Bad cache type argument passed\n");
-		ret = -EINVAL;
-		goto unlock;
-	}
-
-	nat_cache_ptr = &ipv4_nat_cache[nmi];
-
-	if ( ! nat_cache_ptr->table_cnt )
-	{
-		IPAERR("No initialized table in NAT cache\n");
-		ret = -EINVAL;
-		goto unlock;
-	}
-
-	nat_table = &nat_cache_ptr->ip4_tbl[broken_tbl_hdl - 1];
-
-	ipa_tbl_ptr =
-		(which == USE_NAT_TABLE) ?
-		&nat_table->table     :
-		&nat_table->index_table;
-
-	ret = ipa_table_walk(ipa_tbl_ptr, 0, WHEN_SLOT_FILLED, walk_cb, arb_data_ptr);
-
-	if ( ret != 0 )
-	{
-		IPAERR("ipa_table_walk returned non-zero (%d)\n", ret);
-		goto unlock;
-	}
-
-unlock:
-	if ( pthread_mutex_unlock(&nat_mutex) )
-	{
-		IPAERR("unable to unlock the nat mutex\n");
-		ret = (ret) ? ret : -EPERM;
-	}
-
-bail:
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-typedef struct
-{
-	WhichTbl2Use        which;
-	uint32_t            tot_for_avg;
-	ipa_nati_tbl_stats* stats_ptr;
-} chain_stat_help;
-
-static int gen_chain_stats(
-	ipa_table*      table_ptr,
-	uint32_t        rule_hdl,
-	void*           record_ptr,
-	uint16_t        record_index,
-	void*           meta_record_ptr,
-	uint16_t        meta_record_index,
-	void*           arb_data_ptr )
-{
-	chain_stat_help* csh_ptr = (chain_stat_help*) arb_data_ptr;
-
-	enum ipa3_nat_mem_in nmi;
-	uint8_t              is_expn_tbl;
-	uint16_t             rule_index;
-
-	uint32_t             chain_len = 0;
-
-	BREAK_RULE_HDL(table_ptr, rule_hdl, nmi, is_expn_tbl, rule_index);
-
-	if ( is_expn_tbl )
-	{
-		return 1;
-	}
-
-	if ( csh_ptr->which == USE_NAT_TABLE )
-	{
-		struct ipa_nat_rule* list_elem_ptr =
-			(struct ipa_nat_rule*) record_ptr;
-
-		if ( list_elem_ptr->next_index )
-		{
-			chain_len = 1;
-
-			while ( list_elem_ptr->next_index )
-			{
-				chain_len++;
-
-				list_elem_ptr = GOTO_REC(table_ptr, list_elem_ptr->next_index);
-			}
-		}
-	}
-	else
-	{
-		struct ipa_nat_indx_tbl_rule* list_elem_ptr =
-			(struct ipa_nat_indx_tbl_rule*) record_ptr;
-
-		if ( list_elem_ptr->next_index )
-		{
-			chain_len = 1;
-
-			while ( list_elem_ptr->next_index )
-			{
-				chain_len++;
-
-				list_elem_ptr = GOTO_REC(table_ptr, list_elem_ptr->next_index);
-			}
-		}
-	}
-
-	if ( chain_len )
-	{
-		csh_ptr->stats_ptr->tot_chains += 1;
-
-		csh_ptr->tot_for_avg += chain_len;
-
-		if ( csh_ptr->stats_ptr->min_chain_len == 0 )
-		{
-			csh_ptr->stats_ptr->min_chain_len = chain_len;
-		}
-		else
-		{
-			csh_ptr->stats_ptr->min_chain_len =
-				min(csh_ptr->stats_ptr->min_chain_len, chain_len);
-		}
-
-		csh_ptr->stats_ptr->max_chain_len =
-			max(csh_ptr->stats_ptr->max_chain_len, chain_len);
-	}
-
-	return 0;
-}
-
-int ipa_NATI_ipv4_tbl_stats(
-	uint32_t            tbl_hdl,
-	ipa_nati_tbl_stats* nat_stats_ptr,
-	ipa_nati_tbl_stats* idx_stats_ptr )
-{
-	enum ipa3_nat_mem_in            nmi;
-	uint32_t                        broken_tbl_hdl;
-	struct ipa_nat_cache*           nat_cache_ptr;
-	struct ipa_nat_ip4_table_cache* nat_table;
-	ipa_table*                      ipa_tbl_ptr;
-
-	chain_stat_help                 csh;
-
-	int ret = 0;
-
-	IPADBG("In\n");
-
-	if ( ! VALID_TBL_HDL(tbl_hdl) ||
-		 ! nat_stats_ptr ||
-		 ! idx_stats_ptr )
-	{
-		IPAERR("Bad arg: "
-			   "tbl_hdl(0x%08X) and/or "
-			   "nat_stats_ptr(%p) and/or "
-			   "idx_stats_ptr(%p)\n",
-			   tbl_hdl,
-			   nat_stats_ptr,
-			   idx_stats_ptr );
-		ret = -EINVAL;
-		goto bail;
-	}
-
-	if ( pthread_mutex_lock(&nat_mutex) )
-	{
-		IPAERR("unable to lock the nat mutex\n");
-		ret = -EINVAL;
-		goto bail;
-	}
-
-	memset(nat_stats_ptr, 0, sizeof(ipa_nati_tbl_stats));
-	memset(idx_stats_ptr, 0, sizeof(ipa_nati_tbl_stats));
-
-	BREAK_TBL_HDL(tbl_hdl, nmi, broken_tbl_hdl);
-
-	if ( ! IPA_VALID_NAT_MEM_IN(nmi) )
-	{
-		IPAERR("Bad cache type argument passed\n");
-		ret = -EINVAL;
-		goto unlock;
-	}
-
-	nat_cache_ptr = &ipv4_nat_cache[nmi];
-
-	if ( ! nat_cache_ptr->table_cnt )
-	{
-		IPAERR("No initialized table in NAT cache\n");
-		ret = -EINVAL;
-		goto unlock;
-	}
-
-	nat_table = &nat_cache_ptr->ip4_tbl[broken_tbl_hdl - 1];
-
-	/*
-	 * Gather NAT table stats...
-	 */
-	ipa_tbl_ptr = &nat_table->table;
-
-	nat_stats_ptr->nmi                  = nmi;
-
-	nat_stats_ptr->tot_base_ents        = ipa_tbl_ptr->table_entries;
-	nat_stats_ptr->tot_expn_ents        = ipa_tbl_ptr->expn_table_entries;
-	nat_stats_ptr->tot_ents             =
-		nat_stats_ptr->tot_base_ents + nat_stats_ptr->tot_expn_ents;
-
-	nat_stats_ptr->tot_base_ents_filled = ipa_tbl_ptr->cur_tbl_cnt;
-	nat_stats_ptr->tot_expn_ents_filled = ipa_tbl_ptr->cur_expn_tbl_cnt;
-
-	memset(&csh, 0, sizeof(chain_stat_help));
-
-	csh.which     = USE_NAT_TABLE;
-	csh.stats_ptr = nat_stats_ptr;
-
-	ret = ipa_table_walk(
-		ipa_tbl_ptr, 0, WHEN_SLOT_FILLED, gen_chain_stats, &csh);
-
-	if ( ret < 0 )
-	{
-		IPAERR("Error gathering chain stats\n");
-		ret = -EINVAL;
-		goto unlock;
-	}
-
-	if ( csh.tot_for_avg && nat_stats_ptr->tot_chains )
-	{
-		nat_stats_ptr->avg_chain_len =
-			(float) csh.tot_for_avg / (float) nat_stats_ptr->tot_chains;
-	}
-
-	/*
-	 * Now lets gather index table stats...
-	 */
-	ipa_tbl_ptr = &nat_table->index_table;
-
-	idx_stats_ptr->nmi                  = nmi;
-
-	idx_stats_ptr->tot_base_ents        = ipa_tbl_ptr->table_entries;
-	idx_stats_ptr->tot_expn_ents        = ipa_tbl_ptr->expn_table_entries;
-	idx_stats_ptr->tot_ents             =
-		idx_stats_ptr->tot_base_ents + idx_stats_ptr->tot_expn_ents;
-
-	idx_stats_ptr->tot_base_ents_filled = ipa_tbl_ptr->cur_tbl_cnt;
-	idx_stats_ptr->tot_expn_ents_filled = ipa_tbl_ptr->cur_expn_tbl_cnt;
-
-	memset(&csh, 0, sizeof(chain_stat_help));
-
-	csh.which     = USE_INDEX_TABLE;
-	csh.stats_ptr = idx_stats_ptr;
-
-	ret = ipa_table_walk(
-		ipa_tbl_ptr, 0, WHEN_SLOT_FILLED, gen_chain_stats, &csh);
-
-	if ( ret < 0 )
-	{
-		IPAERR("Error gathering chain stats\n");
-		ret = -EINVAL;
-		goto unlock;
-	}
-
-	if ( csh.tot_for_avg && idx_stats_ptr->tot_chains )
-	{
-		idx_stats_ptr->avg_chain_len =
-			(float) csh.tot_for_avg / (float) idx_stats_ptr->tot_chains;
-	}
-
-	ret = 0;
-
-unlock:
-	if ( pthread_mutex_unlock(&nat_mutex) )
-	{
-		IPAERR("unable to unlock the nat mutex\n");
-		ret = (ret) ? ret : -EPERM;
-	}
-
-bail:
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-int ipa_nati_vote_clock(
-    enum ipa_app_clock_vote_type vote_type )
-{
-	struct ipa_nat_cache* nat_cache_ptr =
-		&ipv4_nat_cache[IPA_NAT_MEM_IN_SRAM];
-
-	int ret = 0;
-
-	IPADBG("In\n");
-
-	if ( ! nat_cache_ptr->ipa_desc ) {
-		nat_cache_ptr->ipa_desc = ipa_descriptor_open();
-		if ( nat_cache_ptr->ipa_desc == NULL ) {
-			IPAERR("failed to open IPA driver file descriptor\n");
-			ret = -EIO;
-			goto bail;
-		}
-	}
-
-	ret = ioctl(nat_cache_ptr->ipa_desc->fd,
-				IPA_IOC_APP_CLOCK_VOTE,
-				vote_type);
-
-	if (ret) {
-		IPAERR("APP_CLOCK_VOTE ioctl failure %d on IPA fd %d\n",
-			   ret, nat_cache_ptr->ipa_desc->fd);
-		goto bail;
-	}
-
-bail:
-	IPADBG("Out\n");
-
-	return ret;
-}
diff --git a/ipanat/src/ipa_nat_map.cpp b/ipanat/src/ipa_nat_map.cpp
deleted file mode 100644
index 46778b2..0000000
--- a/ipanat/src/ipa_nat_map.cpp
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- * Copyright (c) 2019 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include <map>
-#include <iterator>
-
-#include "ipa_nat_utils.h"
-
-#include "ipa_nat_map.h"
-
-static std::map<uint32_t, uint32_t> map_array[MAP_NUM_MAX];
-
-/******************************************************************************/
-
-int ipa_nat_map_add(
-	ipa_which_map which,
-	uint32_t      key,
-	uint32_t      val )
-{
-	int ret_val = 0;
-
-	std::pair<std::map<uint32_t, uint32_t>::iterator, bool> ret;
-
-	IPADBG("In\n");
-
-	if ( ! VALID_IPA_USE_MAP(which) )
-	{
-		IPAERR("Bad arg which(%u)\n", which);
-		ret_val = -1;
-		goto bail;
-	}
-
-	IPADBG("[%s] key(%u) -> val(%u)\n",
-		   ipa_which_map_as_str(which), key, val);
-
-	ret = map_array[which].insert(std::pair<uint32_t, uint32_t>(key, val));
-
-	if ( ret.second == false )
-	{
-		IPAERR("[%s] key(%u) already exists in map\n",
-			   ipa_which_map_as_str(which),
-			   key);
-		ret_val = -1;
-	}
-
-bail:
-	IPADBG("Out\n");
-
-	return ret_val;
-}
-
-/******************************************************************************/
-
-int ipa_nat_map_find(
-	ipa_which_map which,
-	uint32_t      key,
-	uint32_t*     val_ptr )
-{
-	int ret_val = 0;
-
-	std::map<uint32_t, uint32_t>::iterator it;
-
-	IPADBG("In\n");
-
-	if ( ! VALID_IPA_USE_MAP(which) )
-	{
-		IPAERR("Bad arg which(%u)\n", which);
-		ret_val = -1;
-		goto bail;
-	}
-
-	IPADBG("[%s] key(%u)\n",
-		   ipa_which_map_as_str(which), key);
-
-	it = map_array[which].find(key);
-
-	if ( it == map_array[which].end() )
-	{
-		IPAERR("[%s] key(%u) not found in map\n",
-			   ipa_which_map_as_str(which),
-			   key);
-		ret_val = -1;
-	}
-	else
-	{
-		if ( val_ptr )
-		{
-			*val_ptr = it->second;
-			IPADBG("[%s] key(%u) -> val(%u)\n",
-				   ipa_which_map_as_str(which),
-				   key, *val_ptr);
-		}
-	}
-
-bail:
-	IPADBG("Out\n");
-
-	return ret_val;
-}
-
-/******************************************************************************/
-
-int ipa_nat_map_del(
-	ipa_which_map which,
-	uint32_t      key,
-	uint32_t*     val_ptr )
-{
-	int ret_val = 0;
-
-	std::map<uint32_t, uint32_t>::iterator it;
-
-	IPADBG("In\n");
-
-	if ( ! VALID_IPA_USE_MAP(which) )
-	{
-		IPAERR("Bad arg which(%u)\n", which);
-		ret_val = -1;
-		goto bail;
-	}
-
-	IPADBG("[%s] key(%u)\n",
-		   ipa_which_map_as_str(which), key);
-
-	it = map_array[which].find(key);
-
-	if ( it == map_array[which].end() )
-	{
-		IPAERR("[%s] key(%u) not found in map\n",
-			   ipa_which_map_as_str(which),
-			   key);
-		ret_val = -1;
-	}
-	else
-	{
-		if ( val_ptr )
-		{
-			*val_ptr = it->second;
-			IPADBG("[%s] key(%u) -> val(%u)\n",
-				   ipa_which_map_as_str(which),
-				   key, *val_ptr);
-		}
-		map_array[which].erase(it);
-	}
-
-bail:
-	IPADBG("Out\n");
-
-	return ret_val;
-}
-
-int ipa_nat_map_clear(
-	ipa_which_map which )
-{
-	int ret_val = 0;
-
-	IPADBG("In\n");
-
-	if ( ! VALID_IPA_USE_MAP(which) )
-	{
-		IPAERR("Bad arg which(%u)\n", which);
-		ret_val = -1;
-		goto bail;
-	}
-
-	map_array[which].clear();
-
-bail:
-	IPADBG("Out\n");
-
-	return ret_val;
-}
-
-int ipa_nat_map_dump(
-	ipa_which_map which )
-{
-	std::map<uint32_t, uint32_t>::iterator it;
-
-	int ret_val = 0;
-
-	IPADBG("In\n");
-
-	if ( ! VALID_IPA_USE_MAP(which) )
-	{
-		IPAERR("Bad arg which(%u)\n", which);
-		ret_val = -1;
-		goto bail;
-	}
-
-	printf("Dumping: %s\n", ipa_which_map_as_str(which));
-
-	for ( it  = map_array[which].begin();
-		  it != map_array[which].end();
-		  it++ )
-	{
-		printf("  Key[%u|0x%08X] -> Value[%u|0x%08X]\n",
-			   it->first,
-			   it->first,
-			   it->second,
-			   it->second);
-	}
-
-bail:
-	IPADBG("Out\n");
-
-	return ret_val;
-}
diff --git a/ipanat/src/ipa_nat_statemach.c b/ipanat/src/ipa_nat_statemach.c
deleted file mode 100644
index 2e77082..0000000
--- a/ipanat/src/ipa_nat_statemach.c
+++ /dev/null
@@ -1,2671 +0,0 @@
-/*
- * Copyright (c) 2019-2021 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * Changes from Qualcomm Innovation Center are provided under the following license:
- *
- * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted (subject to the limitations in the
- * disclaimer below) provided that the following conditions are met:
- *
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *
- *     * Neither the name of Qualcomm Innovation Center, Inc. nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
- * GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
- * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
- * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
- * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
- */
-#include <errno.h>
-#include <pthread.h>
-
-#include "ipa_nat_drv.h"
-#include "ipa_nat_drvi.h"
-
-#include "ipa_nat_map.h"
-
-#include "ipa_nat_statemach.h"
-
-#undef PRCNT_OF
-#define PRCNT_OF(v) \
-	((.25) * (v))
-
-#undef  CHOOSE_MEM_SUB
-#define CHOOSE_MEM_SUB() \
-	(nati_obj.curr_state == NATI_STATE_HYBRID) ? \
-	SRAM_SUB : \
-	DDR_SUB
-
-#undef  CHOOSE_MAPS
-#define CHOOSE_MAPS(o2n, n2o) \
-	do { \
-		uint32_t sub = CHOOSE_MEM_SUB(); \
-		o2n = nati_obj.map_pairs[sub].orig2new_map; \
-		n2o = nati_obj.map_pairs[sub].new2orig_map; \
-	} while (0)
-
-#undef  CHOOSE_CNTR
-#define CHOOSE_CNTR() \
-	&(nati_obj.tot_rules_in_table[CHOOSE_MEM_SUB()])
-
-#undef  CHOOSE_SW_STATS
-#define CHOOSE_SW_STATS() \
-	&(nati_obj.sw_stats[CHOOSE_MEM_SUB()])
-
-/*
- * BACKROUND INFORMATION
- *
- * As it relates to why this file exists...
- *
- * In the past, a NAT table API was presented to upper layer
- * applications.  Said API mananged low level details of NAT table
- * creation, manipulation, and destruction.  The API
- * managed/manipulated NAT tables that lived exclusively in DDR. DDR
- * based tables are fine, but lead to uneeded bus accesses to/from DDR
- * by the IPA while doing its NAT duties. These accesses cause NAT to
- * take longer than necessary.
- *
- * If the DDR bus accesses could be eliminated by storing the table in
- * the IPA's internal memory (ie. SRAM), the IPA's IP V4 NAT could be
- * sped up. This leads us to the following description of this file's
- * intent.
- *
- * The purpose and intent of this file is to hijack the API described
- * above, but in a way that allows the tables to live in both SRAM and
- * DDR.  The details of whether SRAM or DDR is being used is hidden
- * from the application.  More specifically, the API will allow the
- * following to occur completely tranparent to the application using
- * the API.
- *
- *   (1) NAT tables can live exclusively in DDR (traditional and
- *       historically like before)
- *
- *   (2) NAT tables can live simultaneously in SRAM and DDR.  SRAM
- *       initially being used by the IPA, but both being kept in sync.
- *       When SRAM becomes too full, a switch to DDR will occur.
- *
- *   (3) The same as (2) above, but after the switch to DDR occurs,
- *       we'll have the ability to switch back to SRAM if/when DDR
- *       table entry deletions take us to a small enough entry
- *       count. An entry count that when met, allows us to switch back
- *       using SRAM again.
- *
- * As above, all of these details will just magically happen unknown
- * to the application using the API.  The implementation is done via a
- * state machine.
- */
-
-/*
- * The following will be used to keep state machine state for and
- * between API calls...
- */
-static ipa_nati_obj nati_obj = {
-	.prev_state          = NATI_STATE_NULL,
-	.curr_state          = NATI_STATE_NULL,
-	.hold_state          = false,
-	.state_to_hold       = NATI_STATE_NULL,
-	.ddr_tbl_hdl         = 0,
-	.sram_tbl_hdl        = 0,
-	.tot_slots_in_sram   = 0,
-	.back_to_sram_thresh = 0,
-	/*
-	 * Remember:
-	 *   tot_rules_in_table[0] for ddr, and
-	 *   tot_rules_in_table[1] for sram
-	 */
-	.tot_rules_in_table  = { 0, 0 },
-	/*
-	 * Remember:
-	 *   map_pairs[0] for ddr, and
-	 *   map_pairs[1] for sram
-	 */
-	.map_pairs = { {MAP_NUM_00, MAP_NUM_01}, {MAP_NUM_02, MAP_NUM_03} },
-	/*
-	 * Remember:
-	 *   sw_stats[0] for ddr, and
-	 *   sw_stats[1] for sram
-	 */
-	.sw_stats = { {0, 0}, {0, 0} },
-};
-
-/*
- * The following needed to protect nati_obj above, as well as a number
- * of data stuctures within the file ipa_nat_drvi.c
- */
-pthread_mutex_t nat_mutex;
-static bool     nat_mutex_init = false;
-
-static inline int mutex_init(void)
-{
-	static pthread_mutexattr_t nat_mutex_attr;
-
-	int ret = 0;
-
-	IPADBG("In\n");
-
-	ret = pthread_mutexattr_init(&nat_mutex_attr);
-
-	if ( ret != 0 )
-	{
-		IPAERR("pthread_mutexattr_init() failed: ret(%d)\n", ret );
-		goto bail;
-	}
-
-	ret = pthread_mutexattr_settype(
-		&nat_mutex_attr, PTHREAD_MUTEX_RECURSIVE);
-
-	if ( ret != 0 )
-	{
-		IPAERR("pthread_mutexattr_settype() failed: ret(%d)\n",
-			   ret );
-		goto bail;
-	}
-
-	ret = pthread_mutex_init(&nat_mutex, &nat_mutex_attr);
-
-	if ( ret != 0 )
-	{
-		IPAERR("pthread_mutex_init() failed: ret(%d)\n",
-			   ret );
-		goto bail;
-	}
-
-	nat_mutex_init = true;
-
-bail:
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-/*
- * Function for taking/locking the mutex...
- */
-static int take_mutex()
-{
-	int ret;
-
-	if ( nat_mutex_init )
-	{
-again:
-		ret = pthread_mutex_lock(&nat_mutex);
-	}
-	else
-	{
-		ret = mutex_init();
-
-		if ( ret == 0 )
-		{
-			goto again;
-		}
-	}
-
-	if ( ret != 0 )
-	{
-		IPAERR("Unable to lock the %s nat mutex\n",
-			   (nat_mutex_init) ? "initialized" : "uninitialized");
-	}
-
-	return ret;
-}
-
-/*
- * Function for giving/unlocking the mutex...
- */
-static int give_mutex()
-{
-	int ret = (nat_mutex_init) ? pthread_mutex_unlock(&nat_mutex) : -1;
-
-	if ( ret != 0 )
-	{
-		IPAERR("Unable to unlock the %s nat mutex\n",
-			   (nat_mutex_init) ? "initialized" : "uninitialized");
-	}
-
-	return ret;
-}
-
-/*
- * ****************************************************************************
- *
- * HIJACKED API FUNCTIONS START HERE
- *
- * ****************************************************************************
- */
-int ipa_nati_add_ipv4_tbl(
-	uint32_t    public_ip_addr,
-	const char* mem_type_ptr,
-	uint16_t    number_of_entries,
-	uint32_t*   tbl_hdl)
-{
-	arb_t* args[] = {
-		(arb_t*)(arb_t)public_ip_addr,
-		(arb_t*)(arb_t)number_of_entries,
-		(arb_t*) tbl_hdl,
-		(arb_t*) mem_type_ptr,
-	};
-
-	int ret;
-
-	IPADBG("In\n");
-
-	ret = ipa_nati_statemach(&nati_obj, NATI_TRIG_ADD_TABLE, args);
-
-	if ( ret == 0 )
-	{
-		IPADBG("tbl_hdl val(0x%08X)\n", *tbl_hdl);
-	}
-
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-int ipa_nati_del_ipv4_table(
-	uint32_t tbl_hdl)
-{
-	arb_t* args[] = {
-		(arb_t*)(arb_t)tbl_hdl,
-	};
-
-	int ret;
-
-	IPADBG("In\n");
-
-	ret = ipa_nati_statemach(&nati_obj, NATI_TRIG_DEL_TABLE, args);
-
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-int ipa_nati_clear_ipv4_tbl(
-	uint32_t tbl_hdl )
-{
-	arb_t* args[] = {
-		(arb_t*)(arb_t)tbl_hdl,
-	};
-
-	int ret;
-
-	IPADBG("In\n");
-
-	ret = ipa_nati_statemach(&nati_obj, NATI_TRIG_CLR_TABLE, args);
-
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-int ipa_nati_walk_ipv4_tbl(
-	uint32_t          tbl_hdl,
-	WhichTbl2Use      which,
-	ipa_table_walk_cb walk_cb,
-	void*             arb_data_ptr )
-{
-	arb_t* args[] = {
-		(arb_t*)(arb_t)tbl_hdl,
-		(arb_t*)(arb_t)which,
-		(arb_t*) walk_cb,
-		(arb_t*) arb_data_ptr,
-	};
-
-	int ret;
-
-	IPADBG("In\n");
-
-	ret = ipa_nati_statemach(&nati_obj, NATI_TRIG_WLK_TABLE, args);
-
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-int ipa_nati_ipv4_tbl_stats(
-	uint32_t            tbl_hdl,
-	ipa_nati_tbl_stats* nat_stats_ptr,
-	ipa_nati_tbl_stats* idx_stats_ptr )
-{
-	arb_t* args[] = {
-		(arb_t*)(arb_t)tbl_hdl,
-		(arb_t*) nat_stats_ptr,
-		(arb_t*) idx_stats_ptr,
-	};
-
-	int ret;
-
-	IPADBG("In\n");
-
-	ret = ipa_nati_statemach(&nati_obj, NATI_TRIG_TBL_STATS, args);
-
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-int ipa_nati_add_ipv4_rule(
-	uint32_t                 tbl_hdl,
-	const ipa_nat_ipv4_rule* clnt_rule,
-	uint32_t*                rule_hdl )
-{
-	arb_t* args[] = {
-		(arb_t*)(arb_t)tbl_hdl,
-		(arb_t*) clnt_rule,
-		(arb_t*) rule_hdl,
-	};
-
-	int ret;
-
-	IPADBG("In\n");
-
-	ret = ipa_nati_statemach(&nati_obj, NATI_TRIG_ADD_RULE, args);
-
-	if ( ret == 0 )
-	{
-		IPADBG("rule_hdl val(%u)\n", *rule_hdl);
-	}
-
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-int ipa_nati_del_ipv4_rule(
-	uint32_t tbl_hdl,
-	uint32_t rule_hdl )
-{
-	arb_t* args[] = {
-		(arb_t*)(arb_t)tbl_hdl,
-		(arb_t*)(arb_t)rule_hdl,
-	};
-
-	int ret;
-
-	IPADBG("In\n");
-
-	ret = ipa_nati_statemach(&nati_obj, NATI_TRIG_DEL_RULE, args);
-
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-int ipa_nati_query_timestamp(
-	uint32_t  tbl_hdl,
-	uint32_t  rule_hdl,
-	uint32_t* time_stamp)
-{
-	arb_t* args[] = {
-		(arb_t*)(arb_t)tbl_hdl,
-		(arb_t*)(arb_t)rule_hdl,
-		(arb_t*) time_stamp,
-	};
-
-	int ret;
-
-	IPADBG("In\n");
-
-	ret = ipa_nati_statemach(&nati_obj, NATI_TRIG_GET_TSTAMP, args);
-
-	if ( ret == 0 )
-	{
-		IPADBG("time_stamp val(0x%08X)\n", *time_stamp);
-	}
-
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-int ipa_nat_switch_to(
-	enum ipa3_nat_mem_in nmi,
-	bool                 hold_state )
-{
-	int ret = -1;
-
-	IPADBG("In - current state %s\n",
-		   ipa_nati_state_as_str(nati_obj.curr_state));
-
-	if ( ! IPA_VALID_NAT_MEM_IN(nmi) )
-	{
-		IPAERR("Bad nmi(%s)\n", ipa3_nat_mem_in_as_str(nmi));
-
-		ret = -1;
-
-		goto bail;
-	}
-
-	ret = take_mutex();
-
-	if ( ret != 0 )
-	{
-		goto bail;
-	}
-
-	/*
-	 * Are we here before the state machine has been started?
-	 */
-	if ( IN_UNSTARTED_STATE() )
-	{
-		nati_obj.hold_state = hold_state;
-
-		nati_obj.state_to_hold =
-			(nmi == IPA_NAT_MEM_IN_DDR) ?
-			NATI_STATE_DDR_ONLY         :
-			NATI_STATE_SRAM_ONLY;
-
-		IPADBG(
-			"Initial state will be %s before table init and it %s be held\n",
-			ipa_nati_state_as_str(nati_obj.state_to_hold),
-			(hold_state) ? "will" : "will not");
-
-		ret = 0;
-
-		goto unlock;
-	}
-
-	/*
-	 * Are we here after we've already started in hybrid state?
-	 */
-	if ( IN_HYBRID_STATE() )
-	{
-		ret = 0;
-
-		if ( COMPATIBLE_NMI_4SWITCH(nmi) )
-		{
-			ret = ipa_nati_statemach(&nati_obj, NATI_TRIG_TBL_SWITCH, 0);
-		}
-
-		if ( ret == 0 )
-		{
-			nati_obj.hold_state = hold_state;
-
-			if ( hold_state )
-			{
-				nati_obj.state_to_hold = GEN_HOLD_STATE();
-			}
-
-			IPADBG(
-				"Current state is %s and it %s be held\n",
-				ipa_nati_state_as_str(nati_obj.curr_state),
-				(hold_state) ? "will" : "will not");
-		}
-
-		goto unlock;
-	}
-
-	/*
-	 * We've gotten here because we're not in an unstarted state, nor
-	 * are we in hybrid state. This means we're either in
-	 * NATI_STATE_DDR_ONLY or NATI_STATE_SRAM_ONLY
-	 *
-	 * Let's see what's being attempted and if it's OK...
-	 */
-	if ( hold_state )
-	{
-		if ( COMPATIBLE_NMI_4SWITCH(nmi) )
-		{
-			/*
-			 * If we've gotten here, it means that the requested nmi,
-			 * the current state, and the hold are compatible...
-			 */
-			nati_obj.state_to_hold = GEN_HOLD_STATE();
-			nati_obj.hold_state    = hold_state;
-
-			IPADBG(
-				"Requesting to hold memory type %s at "
-				"current state %s will be done\n",
-				ipa3_nat_mem_in_as_str(nmi),
-				ipa_nati_state_as_str(nati_obj.curr_state));
-
-			ret = 0;
-
-			goto unlock;
-		}
-		else
-		{
-			/*
-			 * The requested nmi, the current state, and the hold are
-			 * not compatible...
-			 */
-			IPAERR(
-				"Requesting to hold memory type %s and "
-				"current state %s are incompatible\n",
-				ipa3_nat_mem_in_as_str(nmi),
-				ipa_nati_state_as_str(nati_obj.curr_state));
-
-			ret = -1;
-
-			goto unlock;
-		}
-	}
-
-	/*
-	 * If we've gotten here, it's because the holding of state is no
-	 * longer desired...
-	 */
-	nati_obj.state_to_hold = NATI_STATE_NULL;
-	nati_obj.hold_state    = hold_state;
-
-	IPADBG("Holding of state is no longer desired\n");
-
-	ret = 0;
-
-unlock:
-	ret = give_mutex();
-
-bail:
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-bool ipa_nat_is_sram_supported(void)
-{
-	return VALID_TBL_HDL(nati_obj.sram_tbl_hdl);
-}
-
-/******************************************************************************/
-/*
- * FUNCTION: migrate_rule
- *
- * PARAMS:
- *
- *   table_ptr         (IN) The table being walked
- *
- *   tbl_rule_hdl      (IN) The nat rule's handle from the source table
- *
- *   record_ptr        (IN) The nat rule record from the source table
- *
- *   record_index      (IN) The record above's index in the table being walked
- *
- *   meta_record_ptr   (IN) If meta data in table, this will be it
- *
- *   meta_record_index (IN) The record above's index in the table being walked
- *
- *   arb_data_ptr      (IN) The destination table handle
- *
- * DESCRIPTION:
- *
- *   This routine is intended to copy records from a source table to a
- *   destination table.
-
- *   It is used in union with the ipa_nati_copy_ipv4_tbl() API call
- *   below.
- *
- *   It is compatible with the ipa_table_walk() API.
- *
- *   In the context of the ipa_nati_copy_ipv4_tbl(), the arguments
- *   passed in are as enumerated above.
- *
- * AN IMPORTANT NOTE ON RULE HANDLES WHEN IN MYBRID MODE
- *
- *   The rule_hdl is used to find a rule in the nat table.  It is, in
- *   effect, an index into the table.  The applcation above us retains
- *   it for future manipulation of the rule in the table.
- *
- *   In hybrid mode, a rule can and will move between SRAM and DDR.
- *   Because of this, its handle will change.  The application has
- *   only the original handle and doesn't know of the new handle.  A
- *   mapping, used in hybrid mode, will maintain a relationship
- *   between the original handle and the rule's current real handle...
- *
- *   To help you get a mindset of how this is done:
- *
- *     The original handle will map (point) to the new and new handle
- *     will map (point) back to original.
- *
- * NOTE WELL: There are two sets of maps.  One for each memory type...
- *
- * RETURNS:
- *
- *   Returns 0 on success, non-zero on failure
- */
-static int migrate_rule(
-	ipa_table*      table_ptr,
-	uint32_t        tbl_rule_hdl,
-	void*           record_ptr,
-	uint16_t        record_index,
-	void*           meta_record_ptr,
-	uint16_t        meta_record_index,
-	void*           arb_data_ptr )
-{
-	struct ipa_nat_rule* nat_rule_ptr = (struct ipa_nat_rule*) record_ptr;
-	uint32_t             dst_tbl_hdl  = (uint32_t) arb_data_ptr;
-
-	ipa_nat_ipv4_rule    v4_rule;
-
-	uint32_t             orig_rule_hdl;
-	uint32_t             new_rule_hdl;
-
-	uint32_t             src_orig2new_map, src_new2orig_map;
-	uint32_t             dst_orig2new_map, dst_new2orig_map;
-	uint32_t*            cnt_ptr;
-
-	const char*          mig_dir_ptr;
-
-	char                 buf[1024];
-	int                  ret;
-
-	IPADBG("In\n");
-
-	IPADBG("tbl_mem_type(%s) tbl_rule_hdl(%u) -> %s\n",
-		   ipa3_nat_mem_in_as_str(table_ptr->nmi),
-		   tbl_rule_hdl,
-		   prep_nat_rule_4print(nat_rule_ptr, buf, sizeof(buf)));
-
-	IPADBG("dst_tbl_hdl(0x%08X)\n", dst_tbl_hdl);
-
-	/*
-	 * What is the type of the source table?
-	 */
-	if ( table_ptr->nmi == IPA_NAT_MEM_IN_SRAM )
-	{
-		mig_dir_ptr = "SRAM -> DDR";
-
-		src_orig2new_map = nati_obj.map_pairs[SRAM_SUB].orig2new_map;
-		src_new2orig_map = nati_obj.map_pairs[SRAM_SUB].new2orig_map;
-
-		dst_orig2new_map = nati_obj.map_pairs[DDR_SUB].orig2new_map;
-		dst_new2orig_map = nati_obj.map_pairs[DDR_SUB].new2orig_map;
-
-		cnt_ptr          = &(nati_obj.tot_rules_in_table[DDR_SUB]);
-	}
-	else
-	{
-		mig_dir_ptr = "DDR -> SRAM";
-
-		src_orig2new_map = nati_obj.map_pairs[DDR_SUB].orig2new_map;
-		src_new2orig_map = nati_obj.map_pairs[DDR_SUB].new2orig_map;
-
-		dst_orig2new_map = nati_obj.map_pairs[SRAM_SUB].orig2new_map;
-		dst_new2orig_map = nati_obj.map_pairs[SRAM_SUB].new2orig_map;
-
-		cnt_ptr          = &(nati_obj.tot_rules_in_table[SRAM_SUB]);
-	}
-
-	if ( nat_rule_ptr->protocol == IPA_NAT_INVALID_PROTO_FIELD_VALUE_IN_RULE )
-	{
-		IPADBG("%s: Special \"first rule in list\" case. "
-			   "Rule's enabled bit on, but protocol implies deleted\n",
-			   mig_dir_ptr);
-		ret = 0;
-		goto bail;
-	}
-
-	ret = ipa_nat_map_find(src_new2orig_map, tbl_rule_hdl, &orig_rule_hdl);
-
-	if ( ret != 0 )
-	{
-		IPAERR("%s: ipa_nat_map_find(src_new2orig_map) fail\n", mig_dir_ptr);
-		goto bail;
-	}
-
-	memset(&v4_rule, 0, sizeof(v4_rule));
-
-	v4_rule.private_ip   = nat_rule_ptr->private_ip;
-	v4_rule.private_port = nat_rule_ptr->private_port;
-	v4_rule.protocol     = nat_rule_ptr->protocol;
-	v4_rule.public_port  = nat_rule_ptr->public_port;
-	v4_rule.target_ip    = nat_rule_ptr->target_ip;
-	v4_rule.target_port  = nat_rule_ptr->target_port;
-	v4_rule.pdn_index    = nat_rule_ptr->pdn_index;
-	v4_rule.redirect     = nat_rule_ptr->redirect;
-	v4_rule.enable       = nat_rule_ptr->enable;
-	v4_rule.time_stamp   = nat_rule_ptr->time_stamp;
-	v4_rule.uc_activation_index = nat_rule_ptr->uc_activation_index;
-	v4_rule.s = nat_rule_ptr->s;
-	v4_rule.ucp = nat_rule_ptr->ucp;
-	v4_rule.dst_only = nat_rule_ptr->dst_only;
-	v4_rule.src_only = nat_rule_ptr->src_only;
-
-	ret = ipa_NATI_add_ipv4_rule(dst_tbl_hdl, &v4_rule, &new_rule_hdl);
-
-	if ( ret != 0 )
-	{
-		IPAERR("%s: ipa_NATI_add_ipv4_rule() fail\n", mig_dir_ptr);
-		goto bail;
-	}
-
-	(*cnt_ptr)++;
-
-	/*
-	 * The following is needed to maintain the original handle and
-	 * have it point to the new handle.
-	 *
-	 * Remember, original handle points to new and the new handle
-	 * points back to original.
-	 */
-	ret = ipa_nat_map_add(dst_orig2new_map, orig_rule_hdl, new_rule_hdl);
-
-	if ( ret != 0 )
-	{
-		IPAERR("%s: ipa_nat_map_add(dst_orig2new_map) fail\n", mig_dir_ptr);
-		goto bail;
-	}
-
-	ret = ipa_nat_map_add(dst_new2orig_map, new_rule_hdl, orig_rule_hdl);
-
-	if ( ret != 0 )
-	{
-		IPAERR("%s: ipa_nat_map_add(dst_new2orig_map) fail\n", mig_dir_ptr);
-		goto bail;
-	}
-
-	IPADBG("orig_rule_hdl(0x%08X) new_rule_hdl(0x%08X)\n",
-		   orig_rule_hdl, new_rule_hdl);
-
-bail:
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-/*
- * ****************************************************************************
- *
- * STATE MACHINE CODE BEGINS HERE
- *
- * ****************************************************************************
- */
-static int _smUndef(
-	ipa_nati_obj*    nati_obj_ptr,
-	ipa_nati_trigger trigger,
-	arb_t*           arb_data_ptr ); /* forward declaration */
-
-/******************************************************************************/
-/*
- * FUNCTION: _smDelTbl
- *
- * PARAMS:
- *
- *   nati_obj_ptr (IN) A pointer to an initialized nati object
- *
- *   trigger      (IN) The trigger to run through the state machine
- *
- *   arb_data_ptr (IN) Whatever you like
- *
- * DESCRIPTION:
- *
- *   The following will cause the destruction of the DDR based NAT
- *   table.
- *
- * RETURNS:
- *
- *   zero on success, otherwise non-zero
- */
-static int _smDelTbl(
-	ipa_nati_obj*    nati_obj_ptr,
-	ipa_nati_trigger trigger,
-	arb_t*           arb_data_ptr )
-{
-	arb_t**  args = arb_data_ptr;
-
-	uint32_t tbl_hdl = (uint32_t) args[0];
-
-	int ret;
-
-	IPADBG("In\n");
-
-	IPADBG("tbl_hdl(0x%08X)\n", tbl_hdl);
-
-	ret = ipa_NATI_del_ipv4_table(tbl_hdl);
-
-	if ( ret == 0 && ! IN_HYBRID_STATE() )
-	{
-		/*
-		 * The following will create the preferred "initial state" for
-		 * restart...
-		 */
-		BACK2_UNSTARTED_STATE();
-	}
-
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-/******************************************************************************/
-/*
- * FUNCTION: _smFirstTbl
- *
- * PARAMS:
- *
- *   nati_obj_ptr (IN) A pointer to an initialized nati object
- *
- *   trigger      (IN) The trigger to run through the state machine
- *
- *   arb_data_ptr (IN) Whatever you like
- *
- * DESCRIPTION:
- *
- *   The following will cause the creation of the very first NAT table(s)
- *   before any others have ever been created...
- *
- * RETURNS:
- *
- *   zero on success, otherwise non-zero
- */
-static int _smFirstTbl(
-	ipa_nati_obj*    nati_obj_ptr,
-	ipa_nati_trigger trigger,
-	arb_t*           arb_data_ptr )
-{
-	arb_t**   args = arb_data_ptr;
-
-	uint32_t    public_ip_addr    = (uint32_t)    args[0];
-	uint16_t    number_of_entries = (uint16_t)    args[1];
-	uint32_t*   tbl_hdl_ptr       = (uint32_t*)   args[2];
-	const char* mem_type_ptr      = (const char*) args[3];
-
-	int ret;
-
-	IPADBG("In\n");
-
-	/*
-	 * This is the first time in here.  Let the ipacm's XML config (or
-	 * state_to_hold) drive initial state...
-	 */
-	SET_NATIOBJ_STATE(
-		nati_obj_ptr,
-		(nati_obj_ptr->hold_state && nati_obj_ptr->state_to_hold) ?
-		nati_obj_ptr->state_to_hold                               :
-		mem_type_str_to_ipa_nati_state(mem_type_ptr));
-
-	ret = ipa_nati_statemach(nati_obj_ptr, NATI_TRIG_ADD_TABLE, args);
-
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-/******************************************************************************/
-/*
- * FUNCTION: _smAddDdrTbl
- *
- * PARAMS:
- *
- *   nati_obj_ptr (IN) A pointer to an initialized nati object
- *
- *   trigger      (IN) The trigger to run through the state machine
- *
- *   arb_data_ptr (IN) Whatever you like
- *
- * DESCRIPTION:
- *
- *   The following will cause the creation of a NAT table in DDR.
- *
- * RETURNS:
- *
- *   zero on success, otherwise non-zero
- */
-static int _smAddDdrTbl(
-	ipa_nati_obj*    nati_obj_ptr,
-	ipa_nati_trigger trigger,
-	arb_t*           arb_data_ptr )
-{
-	arb_t**   args = arb_data_ptr;
-
-	uint32_t  public_ip_addr    = (uint32_t)  args[0];
-	uint16_t  number_of_entries = (uint16_t)  args[1];
-	uint32_t* tbl_hdl_ptr       = (uint32_t*) args[2];
-
-	int ret;
-
-	IPADBG("In\n");
-
-	IPADBG("public_ip_addr(0x%08X) number_of_entries(%u) tbl_hdl_ptr(%p)\n",
-		   public_ip_addr, number_of_entries, tbl_hdl_ptr);
-
-	ret = ipa_NATI_add_ipv4_tbl(
-		IPA_NAT_MEM_IN_DDR,
-		public_ip_addr,
-		number_of_entries,
-		&nati_obj_ptr->ddr_tbl_hdl);
-
-	if ( ret == 0 )
-	{
-		*tbl_hdl_ptr = nati_obj_ptr->ddr_tbl_hdl;
-
-		IPADBG("DDR table creation successful: tbl_hdl(0x%08X)\n",
-			   *tbl_hdl_ptr);
-	}
-
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-/******************************************************************************/
-/*
- * FUNCTION: _smAddSramTbl
- *
- * PARAMS:
- *
- *   nati_obj_ptr (IN) A pointer to an initialized nati object
- *
- *   trigger      (IN) The trigger to run through the state machine
- *
- *   arb_data_ptr (IN) Whatever you like
- *
- * DESCRIPTION:
- *
- *   The following will cause the creation of a NAT table in SRAM.
- *
- * RETURNS:
- *
- *   zero on success, otherwise non-zero
- */
-static int _smAddSramTbl(
-	ipa_nati_obj*    nati_obj_ptr,
-	ipa_nati_trigger trigger,
-	arb_t*           arb_data_ptr )
-{
-	arb_t**   args = arb_data_ptr;
-
-	uint32_t  public_ip_addr    = (uint32_t)  args[0];
-	uint16_t  number_of_entries = (uint16_t)  args[1];
-	uint32_t* tbl_hdl_ptr       = (uint32_t*) args[2];
-
-	uint32_t  sram_size = 0;
-
-	int ret;
-
-	IPADBG("In\n");
-
-	IPADBG("public_ip_addr(0x%08X) tbl_hdl_ptr(%p)\n",
-		   public_ip_addr, tbl_hdl_ptr);
-
-	ret = ipa_nati_get_sram_size(&sram_size);
-
-	if ( ret == 0 )
-	{
-		ret = ipa_calc_num_sram_table_entries(
-			sram_size,
-			sizeof(struct ipa_nat_rule),
-			sizeof(struct ipa_nat_indx_tbl_rule),
-			&nati_obj_ptr->tot_slots_in_sram);
-
-		if ( ret == 0 )
-		{
-			nati_obj_ptr->back_to_sram_thresh =
-				PRCNT_OF(nati_obj_ptr->tot_slots_in_sram);
-
-			IPADBG("sram_size(%u or 0x%x) tot_slots_in_sram(%u) back_to_sram_thresh(%u)\n",
-				   sram_size,
-				   sram_size,
-				   nati_obj_ptr->tot_slots_in_sram,
-				   nati_obj_ptr->back_to_sram_thresh);
-
-			IPADBG("Voting clock on for sram table creation\n");
-
-			if ( (ret = ipa_nat_vote_clock(IPA_APP_CLK_VOTE)) != 0 )
-			{
-				IPAERR("Voting clock on failed\n");
-				goto done;
-			}
-
-			ret = ipa_NATI_add_ipv4_tbl(
-				IPA_NAT_MEM_IN_SRAM,
-				public_ip_addr,
-				nati_obj_ptr->tot_slots_in_sram,
-				&nati_obj_ptr->sram_tbl_hdl);
-
-			if ( ipa_nat_vote_clock(IPA_APP_CLK_DEVOTE) != 0 )
-			{
-				IPAWARN("Voting clock off failed\n");
-			}
-
-			if ( ret == 0 )
-			{
-				*tbl_hdl_ptr = nati_obj_ptr->sram_tbl_hdl;
-
-				IPADBG("SRAM table creation successful: tbl_hdl(0x%08X)\n",
-					   *tbl_hdl_ptr);
-			}
-		}
-	}
-
-done:
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-/******************************************************************************/
-/*
- * FUNCTION: _smAddSramAndDdrTbl
- *
- * PARAMS:
- *
- *   nati_obj_ptr (IN) A pointer to an initialized nati object
- *
- *   trigger      (IN) The trigger to run through the state machine
- *
- *   arb_data_ptr (IN) Whatever you like
- *
- * DESCRIPTION:
- *
- *   The following will cause the creation of NAT tables in both DDR
- *   and in SRAM.
- *
- * RETURNS:
- *
- *   zero on success, otherwise non-zero
- */
-static int _smAddSramAndDdrTbl(
-	ipa_nati_obj*    nati_obj_ptr,
-	ipa_nati_trigger trigger,
-	arb_t*           arb_data_ptr )
-{
-	arb_t**   args = arb_data_ptr;
-
-	uint32_t  public_ip_addr    = (uint32_t)  args[0];
-	uint16_t  number_of_entries = (uint16_t)  args[1];
-	uint32_t* tbl_hdl_ptr       = (uint32_t*) args[2];
-
-	uint32_t tbl_hdl;
-
-	int ret;
-
-	IPADBG("In\n");
-
-	nati_obj_ptr->tot_rules_in_table[SRAM_SUB] = 0;
-	nati_obj_ptr->tot_rules_in_table[DDR_SUB]  = 0;
-
-	ipa_nat_map_clear(nati_obj_ptr->map_pairs[SRAM_SUB].orig2new_map);
-	ipa_nat_map_clear(nati_obj_ptr->map_pairs[SRAM_SUB].new2orig_map);
-	ipa_nat_map_clear(nati_obj_ptr->map_pairs[DDR_SUB].orig2new_map);
-	ipa_nat_map_clear(nati_obj_ptr->map_pairs[DDR_SUB].new2orig_map);
-
-	ret = _smAddSramTbl(nati_obj_ptr, trigger, arb_data_ptr);
-
-	if ( ret == 0 )
-	{
-		if ( nati_obj_ptr->tot_slots_in_sram >= number_of_entries )
-		{
-			/*
-			 * The number of slots in SRAM can accommodate what was
-			 * being requested for DDR, hence no need to use DDR and
-			 * we will continue by using SRAM only...
-			 */
-			SET_NATIOBJ_STATE(nati_obj_ptr, NATI_STATE_SRAM_ONLY);
-		}
-		else
-		{
-			/*
-			 * SRAM not big enough. Let's create secondary DDR based
-			 * table...
-			 */
-			arb_t*   new_args[] = {
-				(arb_t*)(arb_t)public_ip_addr,
-				(arb_t*)(arb_t)number_of_entries,
-				(arb_t*) &tbl_hdl,  /* to protect app's table handle above */
-			};
-
-			ret = _smAddDdrTbl(nati_obj_ptr, trigger, new_args);
-
-			if ( ret == 0 )
-			{
-				/*
-				 * The following will tell the IPA to change focus to
-				 * SRAM...
-				 */
-				ret = ipa_nati_statemach(nati_obj_ptr, NATI_TRIG_GOTO_SRAM, 0);
-			}
-		}
-	}
-	else
-	{
-		/*
-		 * SRAM table creation in HYBRID mode failed.  Can we fall
-		 * back to DDR only?  We need to try and see what happens...
-		 */
-		ret = _smAddDdrTbl(nati_obj_ptr, trigger, arb_data_ptr);
-
-		if ( ret == 0 )
-		{
-			SET_NATIOBJ_STATE(nati_obj_ptr, NATI_STATE_DDR_ONLY);
-		}
-	}
-
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-/******************************************************************************/
-/*
- * FUNCTION: _smDelSramAndDdrTbl
- *
- * PARAMS:
- *
- *   nati_obj_ptr (IN) A pointer to an initialized nati object
- *
- *   trigger      (IN) The trigger to run through the state machine
- *
- *   arb_data_ptr (IN) Whatever you like
- *
- * DESCRIPTION:
- *
- *   The following will cause the destruction of the SRAM, then DDR
- *   based NAT tables.
- *
- * RETURNS:
- *
- *   zero on success, otherwise non-zero
- */
-static int _smDelSramAndDdrTbl(
-	ipa_nati_obj*    nati_obj_ptr,
-	ipa_nati_trigger trigger,
-	arb_t*           arb_data_ptr )
-{
-	int ret;
-
-	IPADBG("In\n");
-
-	nati_obj_ptr->tot_rules_in_table[SRAM_SUB] = 0;
-	nati_obj_ptr->tot_rules_in_table[DDR_SUB]  = 0;
-
-	ipa_nat_map_clear(nati_obj_ptr->map_pairs[SRAM_SUB].orig2new_map);
-	ipa_nat_map_clear(nati_obj_ptr->map_pairs[SRAM_SUB].new2orig_map);
-	ipa_nat_map_clear(nati_obj_ptr->map_pairs[DDR_SUB].orig2new_map);
-	ipa_nat_map_clear(nati_obj_ptr->map_pairs[DDR_SUB].new2orig_map);
-
-	ret = _smDelTbl(nati_obj_ptr, trigger, arb_data_ptr);
-
-	if ( ret == 0 )
-	{
-		arb_t* new_args[] = {
-			(arb_t*)(arb_t)nati_obj_ptr->ddr_tbl_hdl,
-		};
-
-		ret = _smDelTbl(nati_obj_ptr, trigger, new_args);
-	}
-
-	if ( ret == 0 )
-	{
-		/*
-		 * The following will create the preferred "initial state" for
-		 * restart...
-		 */
-		BACK2_UNSTARTED_STATE();
-	}
-
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-/******************************************************************************/
-/*
- * FUNCTION: _smClrTbl
- *
- * PARAMS:
- *
- *   nati_obj_ptr (IN) A pointer to an initialized nati object
- *
- *   trigger      (IN) The trigger to run through the state machine
- *
- *   arb_data_ptr (IN) Whatever you like
- *
- * DESCRIPTION:
- *
- *   The following will cause the clearing of a table.
- *
- * RETURNS:
- *
- *   zero on success, otherwise non-zero
- */
-static int _smClrTbl(
-	ipa_nati_obj*    nati_obj_ptr,
-	ipa_nati_trigger trigger,
-	arb_t*           arb_data_ptr )
-{
-	arb_t**  args = arb_data_ptr;
-
-	uint32_t tbl_hdl = (uint32_t) args[0];
-
-	enum ipa3_nat_mem_in nmi;
-	uint32_t             unused_hdl, sub;
-
-	int ret;
-
-	IPADBG("In\n");
-
-	IPADBG("tbl_hdl(0x%08X)\n", tbl_hdl);
-
-	BREAK_TBL_HDL(tbl_hdl, nmi, unused_hdl);
-
-	if ( ! IPA_VALID_NAT_MEM_IN(nmi) ) {
-		IPAERR("Bad cache type\n");
-		ret = -EINVAL;
-		goto bail;
-	}
-
-	sub = (nmi == IPA_NAT_MEM_IN_SRAM) ? SRAM_SUB : DDR_SUB;
-
-	nati_obj_ptr->tot_rules_in_table[sub] = 0;
-
-	ipa_nat_map_clear(nati_obj.map_pairs[sub].orig2new_map);
-	ipa_nat_map_clear(nati_obj.map_pairs[sub].new2orig_map);
-
-	ret = ipa_NATI_clear_ipv4_tbl(tbl_hdl);
-
-bail:
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-/******************************************************************************/
-/*
- * FUNCTION: _smClrTblHybrid
- *
- * PARAMS:
- *
- *   nati_obj_ptr (IN) A pointer to an initialized nati object
- *
- *   trigger      (IN) The trigger to run through the state machine
- *
- *   arb_data_ptr (IN) Whatever you like
- *
- * DESCRIPTION:
- *
- *   The following will cause the clearing of the appropriate hybrid
- *   table.
- *
- * RETURNS:
- *
- *   zero on success, otherwise non-zero
- */
-static int _smClrTblHybrid(
-	ipa_nati_obj*    nati_obj_ptr,
-	ipa_nati_trigger trigger,
-	arb_t*           arb_data_ptr )
-{
-	arb_t**  args = arb_data_ptr;
-
-	uint32_t tbl_hdl = (uint32_t) args[0];
-
-	arb_t*   new_args[] = {
-		(arb_t*)(arb_t)(nati_obj_ptr->curr_state == NATI_STATE_HYBRID) ?
-		         tbl_hdl :
-		         nati_obj_ptr->ddr_tbl_hdl,
-	};
-
-	int ret;
-
-	IPADBG("In\n");
-
-	ret = _smClrTbl(nati_obj_ptr, trigger, new_args);
-
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-/******************************************************************************/
-/*
- * FUNCTION: _smWalkTbl
- *
- * PARAMS:
- *
- *   nati_obj_ptr (IN) A pointer to an initialized nati object
- *
- *   trigger      (IN) The trigger to run through the state machine
- *
- *   arb_data_ptr (IN) Whatever you like
- *
- * DESCRIPTION:
- *
- *   The following will cause the walk of a table.
- *
- * RETURNS:
- *
- *   zero on success, otherwise non-zero
- */
-static int _smWalkTbl(
-	ipa_nati_obj*    nati_obj_ptr,
-	ipa_nati_trigger trigger,
-	arb_t*           arb_data_ptr )
-{
-	arb_t** args = arb_data_ptr;
-
-	uint32_t          tbl_hdl = (uint32_t)          args[0];
-	WhichTbl2Use      which   = (WhichTbl2Use)      args[1];
-	ipa_table_walk_cb walk_cb = (ipa_table_walk_cb) args[2];
-	arb_t*            wadp    = (arb_t*)            args[3];
-
-	int ret;
-
-	IPADBG("In\n");
-
-	IPADBG("tbl_hdl(0x%08X)\n", tbl_hdl);
-
-	ret = ipa_NATI_walk_ipv4_tbl(tbl_hdl, which, walk_cb, wadp);
-
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-/******************************************************************************/
-/*
- * FUNCTION: _smWalkTblHybrid
- *
- * PARAMS:
- *
- *   nati_obj_ptr (IN) A pointer to an initialized nati object
- *
- *   trigger      (IN) The trigger to run through the state machine
- *
- *   arb_data_ptr (IN) Whatever you like
- *
- * DESCRIPTION:
- *
- *   The following will cause the walk of the appropriate hybrid
- *   table.
- *
- * RETURNS:
- *
- *   zero on success, otherwise non-zero
- */
-static int _smWalkTblHybrid(
-	ipa_nati_obj*    nati_obj_ptr,
-	ipa_nati_trigger trigger,
-	arb_t*           arb_data_ptr )
-{
-	arb_t** args = arb_data_ptr;
-
-	uint32_t          tbl_hdl = (uint32_t)          args[0];
-	WhichTbl2Use      which   = (WhichTbl2Use)      args[1];
-	ipa_table_walk_cb walk_cb = (ipa_table_walk_cb) args[2];
-	arb_t*            wadp    = (arb_t*)            args[3];
-
-	arb_t* new_args[] = {
-		(arb_t*)(arb_t)(nati_obj_ptr->curr_state == NATI_STATE_HYBRID) ?
-		         tbl_hdl :
-		         nati_obj_ptr->ddr_tbl_hdl,
-		(arb_t*) which,
-		(arb_t*) walk_cb,
-		(arb_t*) wadp,
-	};
-
-	int ret;
-
-	IPADBG("In\n");
-
-	ret = _smWalkTbl(nati_obj_ptr, trigger, new_args);
-
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-/******************************************************************************/
-/*
- * FUNCTION: _smStatTbl
- *
- * PARAMS:
- *
- *   nati_obj_ptr (IN) A pointer to an initialized nati object
- *
- *   trigger      (IN) The trigger to run through the state machine
- *
- *   arb_data_ptr (IN) Whatever you like
- *
- * DESCRIPTION:
- *
- *   The following will get size/usage stats for a table.
- *
- * RETURNS:
- *
- *   zero on success, otherwise non-zero
- */
-static int _smStatTbl(
-	ipa_nati_obj*    nati_obj_ptr,
-	ipa_nati_trigger trigger,
-	arb_t*           arb_data_ptr )
-{
-	arb_t** args = arb_data_ptr;
-
-	uint32_t            tbl_hdl       = (uint32_t)            args[0];
-	ipa_nati_tbl_stats* nat_stats_ptr = (ipa_nati_tbl_stats*) args[1];
-	ipa_nati_tbl_stats* idx_stats_ptr = (ipa_nati_tbl_stats*) args[2];
-
-	int ret;
-
-	IPADBG("In\n");
-
-	IPADBG("tbl_hdl(0x%08X)\n", tbl_hdl);
-
-	ret = ipa_NATI_ipv4_tbl_stats(tbl_hdl, nat_stats_ptr, idx_stats_ptr);
-
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-/******************************************************************************/
-/*
- * FUNCTION: _smStatTblHybrid
- *
- * PARAMS:
- *
- *   nati_obj_ptr (IN) A pointer to an initialized nati object
- *
- *   trigger      (IN) The trigger to run through the state machine
- *
- *   arb_data_ptr (IN) Whatever you like
- *
- * DESCRIPTION:
- *
- *   The following will cause the retrieval of table size/usage stats
- *   for the appropriate hybrid table.
- *
- * RETURNS:
- *
- *   zero on success, otherwise non-zero
- */
-static int _smStatTblHybrid(
-	ipa_nati_obj*    nati_obj_ptr,
-	ipa_nati_trigger trigger,
-	arb_t*           arb_data_ptr )
-{
-	arb_t** args = arb_data_ptr;
-
-	uint32_t            tbl_hdl       = (uint32_t)            args[0];
-	ipa_nati_tbl_stats* nat_stats_ptr = (ipa_nati_tbl_stats*) args[1];
-	ipa_nati_tbl_stats* idx_stats_ptr = (ipa_nati_tbl_stats*) args[2];
-
-	arb_t* new_args[] = {
-		(arb_t*)(arb_t)(nati_obj_ptr->curr_state == NATI_STATE_HYBRID) ?
-		         tbl_hdl :
-		         nati_obj_ptr->ddr_tbl_hdl,
-		(arb_t*) nat_stats_ptr,
-		(arb_t*) idx_stats_ptr,
-	};
-
-	int ret;
-
-	IPADBG("In\n");
-
-	ret = _smStatTbl(nati_obj_ptr, trigger, new_args);
-
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-/******************************************************************************/
-/*
- * FUNCTION: _smAddRuleToTbl
- *
- * PARAMS:
- *
- *   nati_obj_ptr (IN) A pointer to an initialized nati object
- *
- *   trigger      (IN) The trigger to run through the state machine
- *
- *   arb_data_ptr (IN) Whatever you like
- *
- * DESCRIPTION:
- *
- *   The following will cause the addtion of a NAT rule into the DDR
- *   based table.
- *
- * RETURNS:
- *
- *   zero on success, otherwise non-zero
- */
-static int _smAddRuleToTbl(
-	ipa_nati_obj*    nati_obj_ptr,
-	ipa_nati_trigger trigger,
-	arb_t*           arb_data_ptr )
-{
-	arb_t** args = arb_data_ptr;
-
-	uint32_t           tbl_hdl   = (uint32_t)           args[0];
-	ipa_nat_ipv4_rule* clnt_rule = (ipa_nat_ipv4_rule*) args[1];
-	uint32_t*          rule_hdl  = (uint32_t*)          args[2];
-
-	char buf[1024];
-
-	int ret;
-
-	IPADBG("In\n");
-
-	IPADBG("tbl_hdl(0x%08X) clnt_rule_ptr(%p) rule_hdl_ptr(%p) %s\n",
-		   tbl_hdl, clnt_rule, rule_hdl,
-		   prep_nat_ipv4_rule_4print(clnt_rule, buf, sizeof(buf)));
-
-	clnt_rule->redirect = clnt_rule->enable = clnt_rule->time_stamp = 0;
-
-	ret = ipa_NATI_add_ipv4_rule(tbl_hdl, clnt_rule, rule_hdl);
-
-	if ( ret == 0 )
-	{
-		uint32_t* cnt_ptr = CHOOSE_CNTR();
-
-		(*cnt_ptr)++;
-
-		IPADBG("rule_hdl value(%u or 0x%08X)\n",
-			   *rule_hdl, *rule_hdl);
-	}
-
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-/******************************************************************************/
-/*
- * FUNCTION: _smDelRuleFromTbl
- *
- * PARAMS:
- *
- *   nati_obj_ptr (IN) A pointer to an initialized nati object
- *
- *   trigger      (IN) The trigger to run through the state machine
- *
- *   arb_data_ptr (IN) Whatever you like
- *
- * DESCRIPTION:
- *
- *   The following will cause the deletion of a NAT rule from the DDR
- *   based table.
- *
- * RETURNS:
- *
- *   zero on success, otherwise non-zero
- */
-static int _smDelRuleFromTbl(
-	ipa_nati_obj*    nati_obj_ptr,
-	ipa_nati_trigger trigger,
-	arb_t*           arb_data_ptr )
-{
-	arb_t**  args = arb_data_ptr;
-
-	uint32_t tbl_hdl  = (uint32_t) args[0];
-	uint32_t rule_hdl = (uint32_t) args[1];
-
-	int ret;
-
-	IPADBG("In\n");
-
-	IPADBG("tbl_hdl(0x%08X) rule_hdl(%u)\n", tbl_hdl, rule_hdl);
-
-	ret = ipa_NATI_del_ipv4_rule(tbl_hdl, rule_hdl);
-
-	if ( ret == 0 )
-	{
-		uint32_t* cnt_ptr = CHOOSE_CNTR();
-
-		(*cnt_ptr)--;
-	}
-
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-/******************************************************************************/
-/*
- * FUNCTION: _smAddRuleHybrid
- *
- * PARAMS:
- *
- *   nati_obj_ptr (IN) A pointer to an initialized nati object
- *
- *   trigger      (IN) The trigger to run through the state machine
- *
- *   arb_data_ptr (IN) Whatever you like
- *
- * DESCRIPTION:
- *
- *   The following will cause the addition of a NAT rule into either
- *   the SRAM or DDR based table.
- *
- *   *** !!! HOWEVER *** REMEMBER !!! ***
- *
- *   We're here because we're in a HYBRID state...with the potential
- *   moving between SRAM and DDR.  THIS HAS IMLICATIONS AS IT RELATES
- *   TO RULE MAPPING.
- *
- * RETURNS:
- *
- *   zero on success, otherwise non-zero
- */
-static int _smAddRuleHybrid(
-	ipa_nati_obj*    nati_obj_ptr,
-	ipa_nati_trigger trigger,
-	arb_t*           arb_data_ptr )
-{
-	arb_t** args = arb_data_ptr;
-
-	uint32_t           tbl_hdl   = (uint32_t)           args[0];
-	ipa_nat_ipv4_rule* clnt_rule = (ipa_nat_ipv4_rule*) args[1];
-	uint32_t*          rule_hdl  = (uint32_t*)          args[2];
-
-	arb_t*             new_args[] = {
-		(arb_t*)(arb_t)(nati_obj_ptr->curr_state == NATI_STATE_HYBRID) ?
-		         tbl_hdl :
-		         nati_obj_ptr->ddr_tbl_hdl,
-		(arb_t*) clnt_rule,
-		(arb_t*) rule_hdl,
-	};
-
-	uint32_t orig2new_map, new2orig_map;
-
-	int ret;
-
-	IPADBG("In\n");
-
-	ret = _smAddRuleToTbl(nati_obj_ptr, trigger, new_args);
-
-	if ( ret == 0 )
-	{
-		/*
-		 * The rule_hdl is used to find a rule in the nat table.  It
-		 * is, in effect, an index into the table.  The applcation
-		 * above us retains it for future manipulation of the rule in
-		 * the table.
-		 *
-		 * In hybrid mode, a rule can and will move between SRAM and
-		 * DDR.  Because of this, its handle will change.  The
-		 * application has only the original handle and doesn't know
-		 * of the new handle.  A mapping, used in hybrid mode, will
-		 * maintain a relationship between the original handle and the
-		 * rule's current real handle...
-		 *
-		 * To help you get a mindset of how this is done:
-		 *
-		 *   The original handle will map (point) to the new and new
-		 *   handle will map (point) back to original.
-		 *
-		 * NOTE WELL: There are two sets of maps.  One for each memory
-		 *            type...
-		 */
-		CHOOSE_MAPS(orig2new_map, new2orig_map);
-
-		ret = ipa_nat_map_add(orig2new_map, *rule_hdl, *rule_hdl);
-
-		if ( ret == 0 )
-		{
-			ret = ipa_nat_map_add(new2orig_map, *rule_hdl, *rule_hdl);
-		}
-	}
-	else
-	{
-		if ( nati_obj_ptr->curr_state == NATI_STATE_HYBRID
-			 &&
-			 ! nati_obj_ptr->hold_state )
-		{
-			/*
-			 * In hybrid mode, we always start in SRAM...hence
-			 * NATI_STATE_HYBRID implies SRAM.  The rule addition
-			 * above did not work, meaning the SRAM table is full,
-			 * hence let's jump to DDR...
-			 *
-			 * The following will focus us on DDR and cause the copy
-			 * of data from SRAM to DDR.
-			 */
-			IPAINFO("Add of rule failed...attempting table switch\n");
-
-			ret = ipa_nati_statemach(nati_obj_ptr, NATI_TRIG_TBL_SWITCH, 0);
-
-			if ( ret == 0 )
-			{
-				SET_NATIOBJ_STATE(nati_obj_ptr, NATI_STATE_HYBRID_DDR);
-
-				/*
-				 * Now add the rule to DDR...
-				 */
-				ret = ipa_nati_statemach(nati_obj_ptr, trigger, arb_data_ptr);
-			}
-		}
-	}
-
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-/******************************************************************************/
-/*
- * FUNCTION: _smDelRuleHybrid
- *
- * PARAMS:
- *
- *   nati_obj_ptr (IN) A pointer to an initialized nati object
- *
- *   trigger      (IN) The trigger to run through the state machine
- *
- *   arb_data_ptr (IN) Whatever you like
- *
- * DESCRIPTION:
- *
- *   The following will cause the deletion of a NAT rule from either
- *   the SRAM or DDR based table.
- *
- *   *** !!! HOWEVER *** REMEMBER !!! ***
- *
- *   We're here because we're in a HYBRID state...with the potential
- *   moving between SRAM and DDR.  THIS HAS IMLICATIONS AS IT RELATES
- *   TO RULE MAPPING.
- *
- * RETURNS:
- *
- *   zero on success, otherwise non-zero
- */
-static int _smDelRuleHybrid(
-	ipa_nati_obj*    nati_obj_ptr,
-	ipa_nati_trigger trigger,
-	arb_t*           arb_data_ptr )
-{
-	arb_t**  args = arb_data_ptr;
-
-	uint32_t tbl_hdl       = (uint32_t) args[0];
-	uint32_t orig_rule_hdl = (uint32_t) args[1];
-
-	uint32_t new_rule_hdl;
-
-	uint32_t orig2new_map,  new2orig_map;
-
-	int      ret;
-
-	IPADBG("In\n");
-
-	CHOOSE_MAPS(orig2new_map, new2orig_map);
-
-	/*
-	 * The rule_hdl is used to find a rule in the nat table.  It is,
-	 * in effect, an index into the table.  The applcation above us
-	 * retains it for future manipulation of the rule in the table.
-	 *
-	 * In hybrid mode, a rule can and will move between SRAM and DDR.
-	 * Because of this, its handle will change.  The application has
-	 * only the original handle and doesn't know of the new handle.  A
-	 * mapping, used in hybrid mode, will maintain a relationship
-	 * between the original handle and the rule's current real
-	 * handle...
-	 *
-	 * To help you get a mindset of how this is done:
-	 *
-	 *   The original handle will map (point) to the new and new
-	 *   handle will map (point) back to original.
-	 *
-	 * NOTE WELL: There are two sets of maps.  One for each memory
-	 *            type...
-	 */
-	ret = ipa_nat_map_del(orig2new_map, orig_rule_hdl, &new_rule_hdl);
-
-	if ( ret == 0 )
-	{
-		arb_t* new_args[]  = {
-			(arb_t*)(arb_t)(nati_obj_ptr->curr_state == NATI_STATE_HYBRID) ?
-			        tbl_hdl :
-			        nati_obj_ptr->ddr_tbl_hdl,
-			(arb_t*)(arb_t)new_rule_hdl,
-		};
-
-		IPADBG("orig_rule_hdl(0x%08X) -> new_rule_hdl(0x%08X)\n",
-			   orig_rule_hdl, new_rule_hdl);
-
-		ipa_nat_map_del(new2orig_map, new_rule_hdl, NULL);
-
-		ret = _smDelRuleFromTbl(nati_obj_ptr, trigger, new_args);
-
-		if ( ret == 0 && nati_obj_ptr->curr_state == NATI_STATE_HYBRID_DDR )
-		{
-			/*
-			 * We need to check when/if we can go back to SRAM.
-			 *
-			 * How/why can we go back?
-			 *
-			 *   Given enough deletions, and when we get to a user
-			 *   defined threshold (ie. a percentage of what SRAM can
-			 *   hold), we can pop back to using SRAM.
-			 */
-			uint32_t* cnt_ptr = CHOOSE_CNTR();
-
-			if ( *cnt_ptr <= nati_obj_ptr->back_to_sram_thresh
-				 &&
-				 ! nati_obj_ptr->hold_state )
-			{
-				/*
-				 * The following will focus us on SRAM and cause the copy
-				 * of data from DDR to SRAM.
-				 */
-				IPAINFO("Switch back to SRAM threshold has been reached -> "
-						"Total rules in DDR(%u) <= SRAM THRESH(%u)\n",
-						*cnt_ptr,
-						nati_obj_ptr->back_to_sram_thresh);
-
-				ret = ipa_nati_statemach(nati_obj_ptr, NATI_TRIG_TBL_SWITCH, 0);
-
-				if ( ret == 0 )
-				{
-					SET_NATIOBJ_STATE(nati_obj_ptr, NATI_STATE_HYBRID);
-				}
-				else
-				{
-					/*
-					 * The following will force us stay in DDR for
-					 * now, but the next delete will trigger the
-					 * switch logic above to run again...perhaps it
-					 * will work then.
-					 */
-					ret = 0;
-				}
-			}
-		}
-	}
-
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-/******************************************************************************/
-/*
- * FUNCTION: _smGoToDdr
- *
- * PARAMS:
- *
- *   nati_obj_ptr (IN) A pointer to an initialized nati object
- *
- *   trigger      (IN) The trigger to run through the state machine
- *
- *   arb_data_ptr (IN) Whatever you like
- *
- * DESCRIPTION:
- *
- *   The following will cause the IPA to use the DDR based NAT
- *   table...
- *
- * RETURNS:
- *
- *   zero on success, otherwise non-zero
- */
-static int _smGoToDdr(
-	ipa_nati_obj*    nati_obj_ptr,
-	ipa_nati_trigger trigger,
-	arb_t*           arb_data_ptr )
-{
-	int ret;
-
-	IPADBG("In\n");
-
-	ret = ipa_NATI_post_ipv4_init_cmd(nati_obj_ptr->ddr_tbl_hdl);
-
-	if ( ret == 0 )
-	{
-		SET_NATIOBJ_STATE(nati_obj_ptr, NATI_STATE_HYBRID_DDR);
-	}
-
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-/******************************************************************************/
-/*
- * FUNCTION: _smGoToSram
- *
- * PARAMS:
- *
- *   nati_obj_ptr (IN) A pointer to an initialized nati object
- *
- *   trigger      (IN) The trigger to run through the state machine
- *
- *   arb_data_ptr (IN) Whatever you like
- *
- * DESCRIPTION:
- *
- *   The following will cause the IPA to use the SRAM based NAT
- *   table...
- *
- * RETURNS:
- *
- *   zero on success, otherwise non-zero
- */
-static int _smGoToSram(
-	ipa_nati_obj*    nati_obj_ptr,
-	ipa_nati_trigger trigger,
-	arb_t*           arb_data_ptr )
-{
-	int ret;
-
-	IPADBG("In\n");
-
-	ret = ipa_NATI_post_ipv4_init_cmd(nati_obj_ptr->sram_tbl_hdl);
-
-	if ( ret == 0 )
-	{
-		SET_NATIOBJ_STATE(nati_obj_ptr, NATI_STATE_HYBRID);
-	}
-
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-/******************************************************************************/
-/*
- * FUNCTION: _smSwitchFromDdrToSram
- *
- * PARAMS:
- *
- *   nati_obj_ptr (IN) A pointer to an initialized nati object
- *
- *   trigger      (IN) The trigger to run through the state machine
- *
- *   arb_data_ptr (IN) Whatever you like
- *
- * DESCRIPTION:
- *
- *   The following will cause a copy of the DDR table to SRAM and then
- *   will make the IPA use the SRAM...
- *
- * RETURNS:
- *
- *   zero on success, otherwise non-zero
- */
-static int _smSwitchFromDdrToSram(
-	ipa_nati_obj*    nati_obj_ptr,
-	ipa_nati_trigger trigger,
-	arb_t*           arb_data_ptr )
-{
-	nati_switch_stats* sw_stats_ptr = CHOOSE_SW_STATS();
-
-	uint32_t*          cnt_ptr      = CHOOSE_CNTR();
-
-	ipa_nati_tbl_stats nat_stats, idx_stats;
-
-	const char*        mem_type;
-
-	uint64_t           start, stop;
-
-	int                stats_ret, ret;
-
-	bool               collect_stats = (bool) arb_data_ptr;
-
-	IPADBG("In\n");
-
-	stats_ret = (collect_stats) ?
-		ipa_NATI_ipv4_tbl_stats(
-			nati_obj_ptr->ddr_tbl_hdl, &nat_stats, &idx_stats) :
-		-1;
-
-	currTimeAs(TimeAsNanSecs, &start);
-
-	/*
-	 * First, switch focus to SRAM...
-	 */
-	ret = ipa_nati_statemach(nati_obj_ptr, NATI_TRIG_GOTO_SRAM, 0);
-
-	if ( ret == 0 )
-	{
-		/*
-		 * Clear destination counter...
-		 */
-		nati_obj_ptr->tot_rules_in_table[SRAM_SUB] = 0;
-
-		/*
-		 * Clear destination SRAM maps...
-		 */
-		ipa_nat_map_clear(nati_obj.map_pairs[SRAM_SUB].orig2new_map);
-		ipa_nat_map_clear(nati_obj.map_pairs[SRAM_SUB].new2orig_map);
-
-		/*
-		 * Now copy DDR's content to SRAM...
-		 */
-		ret = ipa_nati_copy_ipv4_tbl(
-			nati_obj_ptr->ddr_tbl_hdl,
-			nati_obj_ptr->sram_tbl_hdl,
-			migrate_rule);
-
-		currTimeAs(TimeAsNanSecs, &stop);
-
-		if ( ret == 0 )
-		{
-			sw_stats_ptr->pass += 1;
-
-			IPADBG("Transistion from DDR to SRAM took %f microseconds\n",
-				   (float) (stop - start) / 1000.0);
-		}
-		else
-		{
-			sw_stats_ptr->fail += 1;
-		}
-
-		IPADBG("Transistion pass/fail counts (DDR to SRAM) PASS: %u FAIL: %u\n",
-			   sw_stats_ptr->pass,
-			   sw_stats_ptr->fail);
-
-		if ( stats_ret == 0 )
-		{
-			mem_type = ipa3_nat_mem_in_as_str(nat_stats.nmi);
-
-			/*
-			 * NAT table stats...
-			 */
-			IPADBG("Able to add (%u) records to %s "
-				   "NAT table of size (%u) or (%f) percent\n",
-				   *cnt_ptr,
-				   mem_type,
-				   nat_stats.tot_ents,
-				   ((float) *cnt_ptr / (float) nat_stats.tot_ents) * 100.0);
-
-			IPADBG("Able to add (%u) records to %s "
-				   "NAT BASE table of size (%u) or (%f) percent\n",
-				   nat_stats.tot_base_ents_filled,
-				   mem_type,
-				   nat_stats.tot_base_ents,
-				   ((float) nat_stats.tot_base_ents_filled /
-					(float) nat_stats.tot_base_ents) * 100.0);
-
-			IPADBG("Able to add (%u) records to %s "
-				   "NAT EXPN table of size (%u) or (%f) percent\n",
-				   nat_stats.tot_expn_ents_filled,
-				   mem_type,
-				   nat_stats.tot_expn_ents,
-				   ((float) nat_stats.tot_expn_ents_filled /
-					(float) nat_stats.tot_expn_ents) * 100.0);
-
-			IPADBG("%s NAT table chains: tot_chains(%u) min_len(%u) max_len(%u) avg_len(%f)\n",
-				   mem_type,
-				   nat_stats.tot_chains,
-				   nat_stats.min_chain_len,
-				   nat_stats.max_chain_len,
-				   nat_stats.avg_chain_len);
-
-			/*
-			 * INDEX table stats...
-			 */
-			IPADBG("Able to add (%u) records to %s "
-				   "IDX table of size (%u) or (%f) percent\n",
-				   *cnt_ptr,
-				   mem_type,
-				   idx_stats.tot_ents,
-				   ((float) *cnt_ptr / (float) idx_stats.tot_ents) * 100.0);
-
-			IPADBG("Able to add (%u) records to %s "
-				   "IDX BASE table of size (%u) or (%f) percent\n",
-				   idx_stats.tot_base_ents_filled,
-				   mem_type,
-				   idx_stats.tot_base_ents,
-				   ((float) idx_stats.tot_base_ents_filled /
-					(float) idx_stats.tot_base_ents) * 100.0);
-
-			IPADBG("Able to add (%u) records to %s "
-				   "IDX EXPN table of size (%u) or (%f) percent\n",
-				   idx_stats.tot_expn_ents_filled,
-				   mem_type,
-				   idx_stats.tot_expn_ents,
-				   ((float) idx_stats.tot_expn_ents_filled /
-					(float) idx_stats.tot_expn_ents) * 100.0);
-
-			IPADBG("%s IDX table chains: tot_chains(%u) min_len(%u) max_len(%u) avg_len(%f)\n",
-				   mem_type,
-				   idx_stats.tot_chains,
-				   idx_stats.min_chain_len,
-				   idx_stats.max_chain_len,
-				   idx_stats.avg_chain_len);
-		}
-	}
-
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-/******************************************************************************/
-/*
- * FUNCTION: _smSwitchFromSramToDdr
- *
- * PARAMS:
- *
- *   nati_obj_ptr (IN) A pointer to an initialized nati object
- *
- *   trigger      (IN) The trigger to run through the state machine
- *
- *   arb_data_ptr (IN) Whatever you like
- *
- * DESCRIPTION:
- *
- *   The following will cause a copy of the SRAM table to DDR and then
- *   will make the IPA use the DDR...
- *
- * RETURNS:
- *
- *   zero on success, otherwise non-zero
- */
-static int _smSwitchFromSramToDdr(
-	ipa_nati_obj*    nati_obj_ptr,
-	ipa_nati_trigger trigger,
-	arb_t*           arb_data_ptr )
-{
-	nati_switch_stats* sw_stats_ptr = CHOOSE_SW_STATS();
-
-	uint32_t*          cnt_ptr      = CHOOSE_CNTR();
-
-	ipa_nati_tbl_stats nat_stats, idx_stats;
-
-	const char*        mem_type;
-
-	uint64_t           start, stop;
-
-	int                stats_ret, ret;
-
-	bool               collect_stats = (bool) arb_data_ptr;
-
-	IPADBG("In\n");
-
-	stats_ret = (collect_stats) ?
-		ipa_NATI_ipv4_tbl_stats(
-			nati_obj_ptr->sram_tbl_hdl, &nat_stats, &idx_stats) :
-		-1;
-
-	currTimeAs(TimeAsNanSecs, &start);
-
-	/*
-	 * First, switch focus to DDR...
-	 */
-	ret = ipa_nati_statemach(nati_obj_ptr, NATI_TRIG_GOTO_DDR, 0);
-
-	if ( ret == 0 )
-	{
-		/*
-		 * Clear destination counter...
-		 */
-		nati_obj_ptr->tot_rules_in_table[DDR_SUB] = 0;
-
-		/*
-		 * Clear destination DDR maps...
-		 */
-		ipa_nat_map_clear(nati_obj.map_pairs[DDR_SUB].orig2new_map);
-		ipa_nat_map_clear(nati_obj.map_pairs[DDR_SUB].new2orig_map);
-
-		/*
-		 * Now copy SRAM's content to DDR...
-		 */
-		ret = ipa_nati_copy_ipv4_tbl(
-			nati_obj_ptr->sram_tbl_hdl,
-			nati_obj_ptr->ddr_tbl_hdl,
-			migrate_rule);
-
-		currTimeAs(TimeAsNanSecs, &stop);
-
-		if ( ret == 0 )
-		{
-			sw_stats_ptr->pass += 1;
-
-			IPADBG("Transistion from SRAM to DDR took %f microseconds\n",
-				   (float) (stop - start) / 1000.0);
-		}
-		else
-		{
-			sw_stats_ptr->fail += 1;
-		}
-
-		IPADBG("Transistion pass/fail counts (SRAM to DDR) PASS: %u FAIL: %u\n",
-			   sw_stats_ptr->pass,
-			   sw_stats_ptr->fail);
-
-		if ( stats_ret == 0 )
-		{
-			mem_type = ipa3_nat_mem_in_as_str(nat_stats.nmi);
-
-			/*
-			 * NAT table stats...
-			 */
-			IPADBG("Able to add (%u) records to %s "
-				   "NAT table of size (%u) or (%f) percent\n",
-				   *cnt_ptr,
-				   mem_type,
-				   nat_stats.tot_ents,
-				   ((float) *cnt_ptr / (float) nat_stats.tot_ents) * 100.0);
-
-			IPADBG("Able to add (%u) records to %s "
-				   "NAT BASE table of size (%u) or (%f) percent\n",
-				   nat_stats.tot_base_ents_filled,
-				   mem_type,
-				   nat_stats.tot_base_ents,
-				   ((float) nat_stats.tot_base_ents_filled /
-					(float) nat_stats.tot_base_ents) * 100.0);
-
-			IPADBG("Able to add (%u) records to %s "
-				   "NAT EXPN table of size (%u) or (%f) percent\n",
-				   nat_stats.tot_expn_ents_filled,
-				   mem_type,
-				   nat_stats.tot_expn_ents,
-				   ((float) nat_stats.tot_expn_ents_filled /
-					(float) nat_stats.tot_expn_ents) * 100.0);
-
-			IPADBG("%s NAT table chains: tot_chains(%u) min_len(%u) max_len(%u) avg_len(%f)\n",
-				   mem_type,
-				   nat_stats.tot_chains,
-				   nat_stats.min_chain_len,
-				   nat_stats.max_chain_len,
-				   nat_stats.avg_chain_len);
-
-			/*
-			 * INDEX table stats...
-			 */
-			IPADBG("Able to add (%u) records to %s "
-				   "IDX table of size (%u) or (%f) percent\n",
-				   *cnt_ptr,
-				   mem_type,
-				   idx_stats.tot_ents,
-				   ((float) *cnt_ptr / (float) idx_stats.tot_ents) * 100.0);
-
-			IPADBG("Able to add (%u) records to %s "
-				   "IDX BASE table of size (%u) or (%f) percent\n",
-				   idx_stats.tot_base_ents_filled,
-				   mem_type,
-				   idx_stats.tot_base_ents,
-				   ((float) idx_stats.tot_base_ents_filled /
-					(float) idx_stats.tot_base_ents) * 100.0);
-
-			IPADBG("Able to add (%u) records to %s "
-				   "IDX EXPN table of size (%u) or (%f) percent\n",
-				   idx_stats.tot_expn_ents_filled,
-				   mem_type,
-				   idx_stats.tot_expn_ents,
-				   ((float) idx_stats.tot_expn_ents_filled /
-					(float) idx_stats.tot_expn_ents) * 100.0);
-
-			IPADBG("%s IDX table chains: tot_chains(%u) min_len(%u) max_len(%u) avg_len(%f)\n",
-				   mem_type,
-				   idx_stats.tot_chains,
-				   idx_stats.min_chain_len,
-				   idx_stats.max_chain_len,
-				   idx_stats.avg_chain_len);
-		}
-	}
-
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-/******************************************************************************/
-/*
- * FUNCTION: _smGetTmStmp
- *
- * PARAMS:
- *
- *   nati_obj_ptr (IN) A pointer to an initialized nati object
- *
- *   trigger      (IN) The trigger to run through the state machine
- *
- *   arb_data_ptr (IN) Whatever you like
- *
- * DESCRIPTION:
- *
- *   Retrieve rule's timestamp from NAT table.
- *
- * RETURNS:
- *
- *   zero on success, otherwise non-zero
- */
-static int _smGetTmStmp(
-	ipa_nati_obj*    nati_obj_ptr,
-	ipa_nati_trigger trigger,
-	arb_t*           arb_data_ptr )
-{
-	arb_t** args = arb_data_ptr;
-
-	uint32_t  tbl_hdl    = (uint32_t)  args[0];
-	uint32_t  rule_hdl   = (uint32_t)  args[1];
-	uint32_t* time_stamp = (uint32_t*) args[2];
-
-	int ret;
-
-	IPADBG("In\n");
-
-	IPADBG("tbl_hdl(0x%08X) rule_hdl(%u) time_stamp_ptr(%p)\n",
-		   tbl_hdl, rule_hdl, time_stamp);
-
-	ret = ipa_NATI_query_timestamp(tbl_hdl, rule_hdl, time_stamp);
-
-	if ( ret == 0 )
-	{
-		IPADBG("time_stamp(0x%08X)\n", *time_stamp);
-	}
-
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-/******************************************************************************/
-/*
- * FUNCTION: _smGetTmStmpHybrid
- *
- * PARAMS:
- *
- *   nati_obj_ptr (IN) A pointer to an initialized nati object
- *
- *   trigger      (IN) The trigger to run through the state machine
- *
- *   arb_data_ptr (IN) Whatever you like
- *
- * DESCRIPTION:
- *
- *   Retrieve rule's timestamp from the state approriate NAT table.
- *
- * RETURNS:
- *
- *   zero on success, otherwise non-zero
- */
-static int _smGetTmStmpHybrid(
-	ipa_nati_obj*    nati_obj_ptr,
-	ipa_nati_trigger trigger,
-	arb_t*           arb_data_ptr )
-{
-	arb_t** args = arb_data_ptr;
-
-	uint32_t  tbl_hdl       = (uint32_t)  args[0];
-	uint32_t  orig_rule_hdl = (uint32_t)  args[1];
-	uint32_t* time_stamp    = (uint32_t*) args[2];
-
-	uint32_t  new_rule_hdl;
-
-	uint32_t  orig2new_map, new2orig_map;
-
-	int       ret;
-
-	IPADBG("In\n");
-
-	CHOOSE_MAPS(orig2new_map, new2orig_map);
-
-	ret = ipa_nat_map_find(orig2new_map, orig_rule_hdl, &new_rule_hdl);
-
-	if ( ret == 0 )
-	{
-		arb_t* new_args[] = {
-			(arb_t*)(arb_t)(nati_obj_ptr->curr_state == NATI_STATE_HYBRID) ?
-			         tbl_hdl :
-			         nati_obj_ptr->ddr_tbl_hdl,
-			(arb_t*)(arb_t)new_rule_hdl,
-			(arb_t*) time_stamp,
-		};
-
-		ret = _smGetTmStmp(nati_obj_ptr, trigger, new_args);
-	}
-
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-/******************************************************************************/
-/*
- * The following table relates a nati object's state and a transition
- * trigger to a callback...
- */
-static nati_statemach_tuple
-_state_mach_tbl[NATI_STATE_LAST+1][NATI_TRIG_LAST+1] =
-{
-	{
-		SM_ROW( NATI_STATE_NULL,       NATI_TRIG_NULL,       _smUndef ),
-		SM_ROW( NATI_STATE_NULL,       NATI_TRIG_ADD_TABLE,  _smFirstTbl ),
-		SM_ROW( NATI_STATE_NULL,       NATI_TRIG_DEL_TABLE,  _smUndef ),
-		SM_ROW( NATI_STATE_NULL,       NATI_TRIG_CLR_TABLE,  _smUndef ),
-		SM_ROW( NATI_STATE_NULL,       NATI_TRIG_WLK_TABLE,  _smUndef ),
-		SM_ROW( NATI_STATE_NULL,       NATI_TRIG_TBL_STATS,  _smUndef ),
-		SM_ROW( NATI_STATE_NULL,       NATI_TRIG_ADD_RULE,   _smUndef ),
-		SM_ROW( NATI_STATE_NULL,       NATI_TRIG_DEL_RULE,   _smUndef ),
-		SM_ROW( NATI_STATE_NULL,       NATI_TRIG_TBL_SWITCH, _smUndef ),
-		SM_ROW( NATI_STATE_NULL,       NATI_TRIG_GOTO_DDR,   _smUndef ),
-		SM_ROW( NATI_STATE_NULL,       NATI_TRIG_GOTO_SRAM,  _smUndef ),
-		SM_ROW( NATI_STATE_NULL,       NATI_TRIG_GET_TSTAMP, _smUndef ),
-		SM_ROW( NATI_STATE_NULL,       NATI_TRIG_LAST,       _smUndef ),
-	},
-
-	{
-		SM_ROW( NATI_STATE_DDR_ONLY,   NATI_TRIG_NULL,       _smUndef ),
-		SM_ROW( NATI_STATE_DDR_ONLY,   NATI_TRIG_ADD_TABLE,  _smAddDdrTbl ),
-		SM_ROW( NATI_STATE_DDR_ONLY,   NATI_TRIG_DEL_TABLE,  _smDelTbl ),
-		SM_ROW( NATI_STATE_DDR_ONLY,   NATI_TRIG_CLR_TABLE,  _smClrTbl ),
-		SM_ROW( NATI_STATE_DDR_ONLY,   NATI_TRIG_WLK_TABLE,  _smWalkTbl ),
-		SM_ROW( NATI_STATE_DDR_ONLY,   NATI_TRIG_TBL_STATS,  _smStatTbl ),
-		SM_ROW( NATI_STATE_DDR_ONLY,   NATI_TRIG_ADD_RULE,   _smAddRuleToTbl ),
-		SM_ROW( NATI_STATE_DDR_ONLY,   NATI_TRIG_DEL_RULE,   _smDelRuleFromTbl ),
-		SM_ROW( NATI_STATE_DDR_ONLY,   NATI_TRIG_TBL_SWITCH, _smUndef ),
-		SM_ROW( NATI_STATE_DDR_ONLY,   NATI_TRIG_GOTO_DDR,   _smUndef ),
-		SM_ROW( NATI_STATE_DDR_ONLY,   NATI_TRIG_GOTO_SRAM,  _smUndef ),
-		SM_ROW( NATI_STATE_DDR_ONLY,   NATI_TRIG_GET_TSTAMP, _smGetTmStmp ),
-		SM_ROW( NATI_STATE_DDR_ONLY,   NATI_TRIG_LAST,       _smUndef ),
-	},
-
-	{
-		SM_ROW( NATI_STATE_SRAM_ONLY,  NATI_TRIG_NULL,       _smUndef ),
-		SM_ROW( NATI_STATE_SRAM_ONLY,  NATI_TRIG_ADD_TABLE,  _smAddSramTbl ),
-		SM_ROW( NATI_STATE_SRAM_ONLY,  NATI_TRIG_DEL_TABLE,  _smDelTbl ),
-		SM_ROW( NATI_STATE_SRAM_ONLY,  NATI_TRIG_CLR_TABLE,  _smClrTbl ),
-		SM_ROW( NATI_STATE_SRAM_ONLY,  NATI_TRIG_WLK_TABLE,  _smWalkTbl ),
-		SM_ROW( NATI_STATE_SRAM_ONLY,  NATI_TRIG_TBL_STATS,  _smStatTbl ),
-		SM_ROW( NATI_STATE_SRAM_ONLY,  NATI_TRIG_ADD_RULE,   _smAddRuleToTbl ),
-		SM_ROW( NATI_STATE_SRAM_ONLY,  NATI_TRIG_DEL_RULE,   _smDelRuleFromTbl ),
-		SM_ROW( NATI_STATE_SRAM_ONLY,  NATI_TRIG_TBL_SWITCH, _smUndef ),
-		SM_ROW( NATI_STATE_SRAM_ONLY,  NATI_TRIG_GOTO_DDR,   _smUndef ),
-		SM_ROW( NATI_STATE_SRAM_ONLY,  NATI_TRIG_GOTO_SRAM,  _smUndef ),
-		SM_ROW( NATI_STATE_SRAM_ONLY,  NATI_TRIG_GET_TSTAMP, _smGetTmStmp ),
-		SM_ROW( NATI_STATE_SRAM_ONLY,  NATI_TRIG_LAST,       _smUndef ),
-	},
-
-	{
-		SM_ROW( NATI_STATE_HYBRID,     NATI_TRIG_NULL,       _smUndef ),
-		SM_ROW( NATI_STATE_HYBRID,     NATI_TRIG_ADD_TABLE,  _smAddSramAndDdrTbl ),
-		SM_ROW( NATI_STATE_HYBRID,     NATI_TRIG_DEL_TABLE,  _smDelSramAndDdrTbl ),
-		SM_ROW( NATI_STATE_HYBRID,     NATI_TRIG_CLR_TABLE,  _smClrTblHybrid ),
-		SM_ROW( NATI_STATE_HYBRID,     NATI_TRIG_WLK_TABLE,  _smWalkTblHybrid ),
-		SM_ROW( NATI_STATE_HYBRID,     NATI_TRIG_TBL_STATS,  _smStatTblHybrid ),
-		SM_ROW( NATI_STATE_HYBRID,     NATI_TRIG_ADD_RULE,   _smAddRuleHybrid ),
-		SM_ROW( NATI_STATE_HYBRID,     NATI_TRIG_DEL_RULE,   _smDelRuleHybrid ),
-		SM_ROW( NATI_STATE_HYBRID,     NATI_TRIG_TBL_SWITCH, _smSwitchFromSramToDdr ),
-		SM_ROW( NATI_STATE_HYBRID,     NATI_TRIG_GOTO_DDR,   _smGoToDdr ),
-		SM_ROW( NATI_STATE_HYBRID,     NATI_TRIG_GOTO_SRAM,  _smGoToSram ),
-		SM_ROW( NATI_STATE_HYBRID,     NATI_TRIG_GET_TSTAMP, _smGetTmStmpHybrid ),
-		SM_ROW( NATI_STATE_HYBRID,     NATI_TRIG_LAST,       _smUndef ),
-	},
-
-	{
-		SM_ROW( NATI_STATE_HYBRID_DDR, NATI_TRIG_NULL,       _smUndef ),
-		SM_ROW( NATI_STATE_HYBRID_DDR, NATI_TRIG_ADD_TABLE,  _smUndef ),
-		SM_ROW( NATI_STATE_HYBRID_DDR, NATI_TRIG_DEL_TABLE,  _smDelSramAndDdrTbl ),
-		SM_ROW( NATI_STATE_HYBRID_DDR, NATI_TRIG_CLR_TABLE,  _smClrTblHybrid ),
-		SM_ROW( NATI_STATE_HYBRID_DDR, NATI_TRIG_WLK_TABLE,  _smWalkTblHybrid ),
-		SM_ROW( NATI_STATE_HYBRID_DDR, NATI_TRIG_TBL_STATS,  _smStatTblHybrid ),
-		SM_ROW( NATI_STATE_HYBRID_DDR, NATI_TRIG_ADD_RULE,   _smAddRuleHybrid ),
-		SM_ROW( NATI_STATE_HYBRID_DDR, NATI_TRIG_DEL_RULE,   _smDelRuleHybrid ),
-		SM_ROW( NATI_STATE_HYBRID_DDR, NATI_TRIG_TBL_SWITCH, _smSwitchFromDdrToSram ),
-		SM_ROW( NATI_STATE_HYBRID_DDR, NATI_TRIG_GOTO_DDR,   _smGoToDdr ),
-		SM_ROW( NATI_STATE_HYBRID_DDR, NATI_TRIG_GOTO_SRAM,  _smGoToSram ),
-		SM_ROW( NATI_STATE_HYBRID_DDR, NATI_TRIG_GET_TSTAMP, _smGetTmStmpHybrid ),
-		SM_ROW( NATI_STATE_HYBRID_DDR, NATI_TRIG_LAST,       _smUndef ),
-	},
-
-	{
-		SM_ROW( NATI_STATE_LAST,       NATI_TRIG_NULL,       _smUndef ),
-		SM_ROW( NATI_STATE_LAST,       NATI_TRIG_ADD_TABLE,  _smUndef ),
-		SM_ROW( NATI_STATE_LAST,       NATI_TRIG_DEL_TABLE,  _smUndef ),
-		SM_ROW( NATI_STATE_LAST,       NATI_TRIG_CLR_TABLE,  _smUndef ),
-		SM_ROW( NATI_STATE_LAST,       NATI_TRIG_WLK_TABLE,  _smUndef ),
-		SM_ROW( NATI_STATE_LAST,       NATI_TRIG_TBL_STATS,  _smUndef ),
-		SM_ROW( NATI_STATE_LAST,       NATI_TRIG_ADD_RULE,   _smUndef ),
-		SM_ROW( NATI_STATE_LAST,       NATI_TRIG_DEL_RULE,   _smUndef ),
-		SM_ROW( NATI_STATE_LAST,       NATI_TRIG_TBL_SWITCH, _smUndef ),
-		SM_ROW( NATI_STATE_LAST,       NATI_TRIG_GOTO_DDR,   _smUndef ),
-		SM_ROW( NATI_STATE_LAST,       NATI_TRIG_GOTO_SRAM,  _smUndef ),
-		SM_ROW( NATI_STATE_LAST,       NATI_TRIG_GET_TSTAMP, _smUndef ),
-		SM_ROW( NATI_STATE_LAST,       NATI_TRIG_LAST,       _smUndef ),
-	},
-};
-
-/******************************************************************************/
-/*
- * FUNCTION: _smUndef
- *
- * PARAMS:
- *
- *   nati_obj_ptr (IN) A pointer to an initialized nati object
- *
- *   trigger      (IN) The trigger to run through the state machine
- *
- *   arb_data_ptr (IN) Whatever you like
- *
- * DESCRIPTION:
- *
- *   The following does nothing, except report an undefined action for
- *   a particular state/trigger combo...
- *
- * RETURNS:
- *
- *   zero on success, otherwise non-zero
- */
-static int _smUndef(
-	ipa_nati_obj*    nati_obj_ptr,
-	ipa_nati_trigger trigger,
-	arb_t*           arb_data_ptr )
-{
-	IPAERR("CB(%s): undefined action for STATE(%s) with TRIGGER(%s)\n",
-		   _state_mach_tbl[nati_obj_ptr->curr_state][trigger].sm_cb_as_str,
-		   _state_mach_tbl[nati_obj_ptr->curr_state][trigger].state_as_str,
-		   _state_mach_tbl[nati_obj_ptr->curr_state][trigger].trigger_as_str);
-
-	return -1;
-}
-
-/******************************************************************************/
-/*
- * FUNCTION: ipa_nati_statemach
- *
- * PARAMS:
- *
- *   nati_obj_ptr (IN) A pointer to an initialized nati object
- *
- *   trigger      (IN) The trigger to run through the state machine
- *
- *   arb_data_ptr (IN) Anything you like.  Will be passed, untouched,
- *                     to the state/trigger callback function.
- *
- * DESCRIPTION:
- *
- *   This function allows a nati object and a trigger to be run
- *   through the state machine.
- *
- * RETURNS:
- *
- *   zero on success, otherwise non-zero
- */
-int ipa_nati_statemach(
-	ipa_nati_obj*    nati_obj_ptr,
-	ipa_nati_trigger trigger,
-	arb_t*           arb_data_ptr )
-{
-	const char* ss_ptr  = _state_mach_tbl[nati_obj_ptr->curr_state][trigger].state_as_str;
-	const char* ts_ptr  = _state_mach_tbl[nati_obj_ptr->curr_state][trigger].trigger_as_str;
-	const char* cbs_ptr = _state_mach_tbl[nati_obj_ptr->curr_state][trigger].sm_cb_as_str;
-
-	bool vote = false;
-
-	int ret;
-
-	IPADBG("In\n");
-
-	ret = take_mutex();
-
-	if ( ret != 0 )
-	{
-		goto bail;
-	}
-
-	IPADBG("STATE(%s) TRIGGER(%s) CB(%s)\n", ss_ptr, ts_ptr, cbs_ptr);
-
-	vote = VOTE_REQUIRED(trigger);
-
-	if ( vote )
-	{
-		IPADBG("Voting clock on STATE(%s) TRIGGER(%s)\n",
-			   ss_ptr, ts_ptr);
-
-		if ( ipa_nat_vote_clock(IPA_APP_CLK_VOTE) != 0 )
-		{
-			IPAERR("Voting failed STATE(%s) TRIGGER(%s)\n", ss_ptr, ts_ptr);
-			ret = -EINVAL;
-			goto unlock;
-		}
-	}
-
-	ret = _state_mach_tbl[nati_obj_ptr->curr_state][trigger].sm_cb(
-		nati_obj_ptr, trigger, arb_data_ptr);
-
-	if ( vote )
-	{
-		IPADBG("Voting clock off STATE(%s) TRIGGER(%s)\n",
-			   ss_ptr, ts_ptr);
-
-		if ( ipa_nat_vote_clock(IPA_APP_CLK_DEVOTE) != 0 )
-		{
-			IPAERR("Voting failed STATE(%s) TRIGGER(%s)\n", ss_ptr, ts_ptr);
-		}
-	}
-
-unlock:
-	ret = give_mutex();
-
-bail:
-	IPADBG("Out\n");
-
-	return ret;
-}
diff --git a/ipanat/src/ipa_nat_utils.c b/ipanat/src/ipa_nat_utils.c
deleted file mode 100644
index a8fdff6..0000000
--- a/ipanat/src/ipa_nat_utils.c
+++ /dev/null
@@ -1,215 +0,0 @@
-/*
- * Copyright (c) 2013, 2018-2019 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include "ipa_nat_utils.h"
-#include <sys/ioctl.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <pthread.h>
-
-#define IPA_MAX_MSG_LEN 4096
-
-static char dbg_buff[IPA_MAX_MSG_LEN];
-
-#if !defined(MSM_IPA_TESTS) && !defined(USE_GLIB) && !defined(FEATURE_IPA_ANDROID)
-size_t strlcpy(char* dst, const char* src, size_t size)
-{
-	size_t i;
-
-	if (size == 0)
-		return strlen(src);
-
-	for (i = 0; i < (size - 1) && src[i] != '\0'; ++i)
-		dst[i] = src[i];
-
-	dst[i] = '\0';
-
-	return i + strlen(src + i);
-}
-#endif
-
-ipa_descriptor* ipa_descriptor_open(void)
-{
-	ipa_descriptor* desc_ptr;
-	int res = 0;
-
-	IPADBG("In\n");
-
-	desc_ptr = calloc(1, sizeof(ipa_descriptor));
-
-	if ( desc_ptr == NULL )
-	{
-		IPAERR("Unable to allocate ipa_descriptor\n");
-		goto bail;
-	}
-
-	desc_ptr->fd = open(IPA_DEV_NAME, O_RDONLY);
-
-	if (desc_ptr->fd < 0)
-	{
-		IPAERR("Unable to open ipa device\n");
-		goto free;
-	}
-
-	res = ioctl(desc_ptr->fd, IPA_IOC_GET_HW_VERSION, &desc_ptr->ver);
-
-	if (res == 0)
-	{
-		IPADBG("IPA version is %d\n", desc_ptr->ver);
-	}
-	else
-	{
-		IPAERR("Unable to get IPA version. Error %d\n", res);
-		desc_ptr->ver = IPA_HW_None;
-	}
-
-	goto bail;
-
-free:
-	free(desc_ptr);
-	desc_ptr = NULL;
-
-bail:
-	IPADBG("Out\n");
-
-	return desc_ptr;
-}
-
-void ipa_descriptor_close(
-	ipa_descriptor* desc_ptr)
-{
-	IPADBG("In\n");
-
-	if ( desc_ptr )
-	{
-		if ( desc_ptr->fd >= 0)
-		{
-			close(desc_ptr->fd);
-		}
-		free(desc_ptr);
-	}
-
-	IPADBG("Out\n");
-}
-
-void ipa_read_debug_info(
-	const char* debug_file_path)
-{
-	size_t result;
-	FILE* debug_file;
-
-	debug_file = fopen(debug_file_path, "r");
-	if (debug_file == NULL)
-	{
-		printf("Failed to open %s\n", debug_file_path);
-		return;
-	}
-
-	for (;;)
-	{
-		result = fread(dbg_buff, sizeof(char), IPA_MAX_MSG_LEN, debug_file);
-		if (!result)
-			break;
-
-		if (result < IPA_MAX_MSG_LEN)
-		{
-			if (ferror(debug_file))
-			{
-				printf("Failed to read from %s\n", debug_file_path);
-				break;
-			}
-
-			dbg_buff[result] = '\0';
-		}
-		else
-		{
-			dbg_buff[IPA_MAX_MSG_LEN - 1] = '\0';
-		}
-
-
-		printf("%s", dbg_buff);
-
-		if (feof(debug_file))
-			break;
-	}
-	fclose(debug_file);
-}
-
-void log_nat_message(char *msg)
-{
-	 return;
-}
-
-int currTimeAs(
-	TimeAs_t  timeAs,
-	uint64_t* valPtr )
-{
-	struct timespec timeSpec;
-
-	int ret = 0;
-
-	if ( ! VALID_TIMEAS(timeAs) || ! valPtr )
-	{
-		IPAERR("Bad arg: timeAs (%u) and/or valPtr (%p)\n",
-			   timeAs, valPtr );
-		ret = -1;
-		goto bail;
-	}
-
-	memset(&timeSpec, 0, sizeof(timeSpec));
-
-	if ( clock_gettime(CLOCK_MONOTONIC, &timeSpec) != 0 )
-	{
-		IPAERR("Can't get system clock time\n" );
-		ret = -1;
-		goto bail;
-	}
-
-	switch( timeAs )
-	{
-	case TimeAsNanSecs:
-		*valPtr =
-			(uint64_t) (SECS2NanSECS((uint64_t) timeSpec.tv_sec) +
-						((uint64_t) timeSpec.tv_nsec));
-		break;
-	case TimeAsMicSecs:
-		*valPtr =
-			(uint64_t) (SECS2MicSECS((uint64_t) timeSpec.tv_sec) +
-						((uint64_t) timeSpec.tv_nsec / 1000));
-		break;
-	case TimeAsMilSecs:
-		*valPtr =
-			(uint64_t) (SECS2MilSECS((uint64_t) timeSpec.tv_sec) +
-						((uint64_t) timeSpec.tv_nsec / 1000000));
-		break;
-	}
-
-bail:
-	return ret;
-}
diff --git a/ipanat/src/ipa_table.c b/ipanat/src/ipa_table.c
deleted file mode 100644
index 0d415b7..0000000
--- a/ipanat/src/ipa_table.c
+++ /dev/null
@@ -1,1333 +0,0 @@
-/*
- * Copyright (c) 2018-2020 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include "ipa_table.h"
-#include "ipa_nat_utils.h"
-
-#include <errno.h>
-
-#define IPA_BASE_TABLE_PERCENTAGE       .8
-#define IPA_EXPANSION_TABLE_PERCENTAGE  .2
-
-#define IPA_BASE_TABLE_PCNT_4SRAM      1.00
-#define IPA_EXPANSION_TABLE_PCNT_4SRAM 0.43
-
-/*
- * The table number of entries is limited by Entry ID structure
- * above. The base table max entries is limited by index into table
- * bits number.
- *
- * The table max ents number is: (base table max ents / base table percentage)
- *
- * IPA_TABLE_MAX_ENTRIES = 2^(index into table) / IPA_BASE_TABLE_PERCENTAGE
- */
-
-static int InsertHead(
-	ipa_table*                  table,
-	void*                       rec_ptr,   /* empty record in table */
-	uint16_t                    rec_index, /* index of record above */
-	void*                       user_data,
-	struct ipa_ioc_nat_dma_cmd* cmd );
-
-static int InsertTail(
-	ipa_table*                  table,
-	void*                       rec_ptr,       /* occupied record at index below */
-	uint16_t*                   rec_index_ptr, /* pointer to index of record above */
-	void*                       user_data,
-	struct ipa_ioc_nat_dma_cmd* cmd );
-
-static uint16_t MakeEntryHdl(
-	ipa_table* tbl,
-	uint16_t   tbl_entry );
-
-static int FindExpnTblFreeEntry(
-	ipa_table* table,
-	void**     free_entry,
-	uint16_t*  entry_index );
-
-static int Get2PowerTightUpperBound(
-	uint16_t num);
-
-static int GetEvenTightUpperBound(
-	uint16_t num);
-
-void ipa_table_init(
-	ipa_table*           table,
-	const char*          table_name,
-	enum ipa3_nat_mem_in nmi,
-	int                  entry_size,
-	void*                meta,
-	int                  meta_entry_size,
-	ipa_table_entry_interface* entry_interface )
-{
-	IPADBG("In\n");
-
-	memset(table, 0, sizeof(ipa_table));
-
-	strlcpy(table->name, table_name, IPA_RESOURCE_NAME_MAX);
-
-	table->nmi             = nmi;
-	table->entry_size      = entry_size;
-	table->meta            = meta;
-	table->meta_entry_size = meta_entry_size;
-	table->entry_interface = entry_interface;
-
-	IPADBG("Table %s with entry size %d has been initialized\n",
-		   table->name, table->entry_size);
-
-	IPADBG("Out\n");
-}
-
-int ipa_table_calculate_entries_num(
-	ipa_table*           table,
-	uint16_t             number_of_entries,
-	enum ipa3_nat_mem_in nmi)
-{
-	uint16_t table_entries, expn_table_entries;
-	float btp, etp;
-	int result = 0;
-
-	IPADBG("In\n");
-
-	if (number_of_entries > IPA_TABLE_MAX_ENTRIES)
-	{
-		IPAERR("Required number of %s entries %d exceeds the maximum %d\n",
-			table->name, number_of_entries, IPA_TABLE_MAX_ENTRIES);
-		result = -EINVAL;
-		goto bail;
-	}
-
-	if ( nmi == IPA_NAT_MEM_IN_SRAM )
-	{
-		btp = IPA_BASE_TABLE_PCNT_4SRAM;
-		etp = IPA_EXPANSION_TABLE_PCNT_4SRAM;
-	}
-	else
-	{
-		btp = IPA_BASE_TABLE_PERCENTAGE;
-		etp = IPA_EXPANSION_TABLE_PERCENTAGE;
-	}
-
-	table_entries      = Get2PowerTightUpperBound(number_of_entries * btp);
-	expn_table_entries = GetEvenTightUpperBound(number_of_entries * etp);
-
-	table->tot_tbl_ents = table_entries + expn_table_entries;
-
-	if ( table->tot_tbl_ents > IPA_TABLE_MAX_ENTRIES )
-	{
-		IPAERR("Required number of %s entries %u "
-			   "(user provided %u) exceeds the maximum %u\n",
-			   table->name,
-			   table->tot_tbl_ents,
-			   number_of_entries,
-			   IPA_TABLE_MAX_ENTRIES);
-		result = -EINVAL;
-		goto bail;
-	}
-
-	table->table_entries      = table_entries;
-	table->expn_table_entries = expn_table_entries;
-
-	IPADBG("Num of %s entries:%u expn entries:%u total entries:%u\n",
-		   table->name,
-		   table->table_entries,
-		   table->expn_table_entries,
-		   table->tot_tbl_ents);
-
-bail:
-	IPADBG("Out\n");
-
-	return result;
-}
-
-int ipa_table_calculate_size(ipa_table* table)
-{
-	int size = table->entry_size * (table->table_entries + table->expn_table_entries);
-
-	IPADBG("In\n");
-
-	IPADBG("%s size: %d\n", table->name, size);
-
-	IPADBG("Out\n");
-
-	return size;
-}
-
-uint8_t* ipa_table_calculate_addresses(
-	ipa_table* table,
-	uint8_t*   base_addr)
-{
-	uint8_t* result = NULL;
-
-	IPADBG("In\n");
-
-	table->table_addr = base_addr;
-	table->expn_table_addr =
-		table->table_addr + table->entry_size * table->table_entries;
-
-	IPADBG("Table %s addresses: table_addr %pK expn_table_addr %pK\n",
-		   table->name, table->table_addr, table->expn_table_addr);
-
-	result = table->expn_table_addr + table->entry_size * table->expn_table_entries;
-
-	IPADBG("Out\n");
-
-	return result;
-}
-
-void ipa_table_reset(
-	ipa_table* table)
-{
-	uint32_t i,tot;
-
-	IPADBG("In\n");
-
-	IPADBG("memset %s table to 0, %pK\n", table->name, table->table_addr);
-	tot = table->entry_size * table->table_entries;
-	for (i = 0; i < tot; i++)
-		table->table_addr[i] = '\0';
-
-	IPADBG("memset %s expn table to 0, %pK\n", table->name, table->expn_table_addr);
-	tot = table->entry_size * table->expn_table_entries;
-	for (i = 0; i < tot; i++)
-		table->expn_table_addr[i] = '\0';
-
-	IPADBG("Out\n");
-}
-
-int ipa_table_add_entry(
-	ipa_table* table,
-	void*      user_data,
-	uint16_t*  rec_index_ptr,
-	uint32_t*  rule_hdl,
-	struct ipa_ioc_nat_dma_cmd* cmd )
-{
-	void* rec_ptr;
-	int ret = 0, occupied;
-
-	IPADBG("In\n");
-
-	rec_ptr = GOTO_REC(table, *rec_index_ptr);
-
-	/*
-	 * Check whether there is any collision
-	 */
-	occupied = table->entry_interface->entry_is_valid(rec_ptr);
-
-	if ( ! occupied )
-	{
-		IPADBG("Collision free (in %s) ... found open slot\n", table->name);
-		ret = InsertHead(table, rec_ptr, *rec_index_ptr, user_data, cmd);
-	}
-	else
-	{
-		IPADBG("Collision (in %s) ... will probe for open slot\n", table->name);
-		ret = InsertTail(table, rec_ptr, rec_index_ptr, user_data, cmd);
-	}
-
-	if (ret)
-		goto bail;
-
-	IPADBG("New Entry Index %u in %s\n", *rec_index_ptr, table->name);
-
-	if ( rule_hdl ) {
-		*rule_hdl = MakeEntryHdl(table, *rec_index_ptr);
-		IPADBG("rule_hdl value(%u)\n", *rule_hdl);
-	}
-
-bail:
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-void ipa_table_create_delete_command(
-	ipa_table* table,
-	struct ipa_ioc_nat_dma_cmd* cmd,
-	ipa_table_iterator* iterator)
-{
-	IPADBG("In\n");
-
-	IPADBG("Delete rule at index(0x%04X) in %s\n",
-		   iterator->curr_index,
-		   table->name);
-
-	if ( ! VALID_INDEX(iterator->prev_index) )
-	{
-		/*
-		 * The following two assigns (ie. the defaults), will cause
-		 * the enabled bit in the record to be set to 0.
-		 */
-		uint16_t      data = 0;
-		dma_help_type ht   = HELP_UPDATE_HEAD;
-
-		if ( VALID_INDEX(iterator->next_index) )
-		{
-			/*
-			 * NOTE WELL HERE:
-			 *
-			 * This record is the first in a chain/list of
-			 * records. Delete means something different in this
-			 * context.
-			 *
-			 * The code below will cause the change of the protocol
-			 * field in the rule record to 0xFF.  It does not set the
-			 * enable bit in the record to 0.  This is done in special
-			 * cases when the record being deleted is the first in a
-			 * list of records.
-			 *
-			 * What does this mean?  It means that the record is
-			 * functionally deleted, but not really deleted.  Why?
-			 * Because the IPA will no longer use it because of the
-			 * bad protocol (ie. functionally deleted), but these
-			 * higher level APIs still see it as "enabled."
-			 *
-			 * This all means that deleted really means two things: 1)
-			 * Not enabled, and 2) Not a valid record.  APIs that walk
-			 * the table...looking for enabled records (ie. the
-			 * enabled bit)....now have to be a bit smarter to see the
-			 * bad protocol as well.
-			 */
-			data = table->entry_interface->
-				entry_get_delete_head_dma_command_data(
-					iterator->curr_entry, iterator->next_entry);
-
-			ht = HELP_DELETE_HEAD;
-		}
-
-		ipa_table_add_dma_cmd(table,
-							  ht,
-							  iterator->curr_entry,
-							  iterator->curr_index,
-							  data,
-							  cmd);
-	}
-	else
-	{
-		ipa_table_add_dma_cmd(table,
-							  HELP_UPDATE_ENTRY,
-							  iterator->prev_entry,
-							  iterator->prev_index,
-							  iterator->next_index,
-							  cmd);
-	}
-
-	IPADBG("Out\n");
-}
-
-void ipa_table_delete_entry(
-	ipa_table*          table,
-	ipa_table_iterator* iterator,
-	uint8_t             is_prev_empty)
-{
-	IPADBG("In\n");
-
-	if ( VALID_INDEX(iterator->next_index) )
-	{
-		/*
-		 * Update the next entry's prev_index field with current
-		 * entry's prev_index
-		 */
-		table->entry_interface->entry_set_prev_index(
-			iterator->next_entry,
-			iterator->next_index,
-			iterator->prev_index,
-			table->meta,
-			table->table_entries);
-	}
-	else if (is_prev_empty)
-	{
-		if (iterator->prev_entry == NULL)
-		{
-			IPAERR("failed to delete of an empty head %d while delete the next entry %d in %s",
-				   iterator->prev_index, iterator->curr_index, table->name);
-		}
-		else
-		{
-			/*
-			 * Delete an empty head rule after the whole tail was deleted
-			 */
-			IPADBG("deleting the dead node %d for %s\n",
-				   iterator->prev_index, table->name);
-
-			memset(iterator->prev_entry, 0, table->entry_size);
-
-			--table->cur_tbl_cnt;
-		}
-	}
-
-	ipa_table_erase_entry(table, iterator->curr_index);
-
-	IPADBG("Out\n");
-}
-
-void ipa_table_erase_entry(
-	ipa_table* table,
-	uint16_t   index)
-{
-	void* entry = GOTO_REC(table, index);
-
-	IPADBG("In\n");
-
-	IPADBG("table(%p) index(%u)\n", table, index);
-
-	memset(entry, 0, table->entry_size);
-
-	if ( index < table->table_entries )
-	{
-		--table->cur_tbl_cnt;
-	}
-	else
-	{
-		--table->cur_expn_tbl_cnt;
-	}
-
-	IPADBG("Out\n");
-}
-
-/**
- * ipa_table_get_entry() - returns a table entry according to the received entry handle
- * @table: [in] the table
- * @entry_handle: [in] entry handle
- * @entry: [out] the retrieved entry
- * @entry_index: [out] absolute index of the retrieved entry
- *
- * Parse the entry handle to retrieve the entry and its index
- *
- * Returns: 0 on success, negative on failure
- */
-int ipa_table_get_entry(
-	ipa_table* table,
-	uint32_t   entry_handle,
-	void**     entry,
-	uint16_t*  entry_index )
-{
-	enum ipa3_nat_mem_in nmi;
-	uint8_t              is_expn_tbl;
-	uint16_t             rec_index;
-
-	int ret = 0;
-
-	IPADBG("In\n");
-
-	IPADBG("table(%p) entry_handle(%u) entry(%p) entry_index(%p)\n",
-		   table, entry_handle, entry, entry_index);
-
-	/*
-	 * Retrieve the memory and table type as well as the index
-	 */
-	BREAK_RULE_HDL(table, entry_handle, nmi, is_expn_tbl, rec_index);
-
-	if ( is_expn_tbl )
-	{
-		IPADBG("Retrieving entry from expansion table\n");
-	}
-	else
-	{
-		IPADBG("Retrieving entry from base (non-expansion) table\n");
-	}
-
-	if ( rec_index >= table->tot_tbl_ents )
-	{
-		IPAERR("The entry handle's record index (%u) exceeds table size (%u)\n",
-			   rec_index, table->tot_tbl_ents);
-		ret = -EINVAL;
-		goto bail;
-	}
-
-	*entry = GOTO_REC(table, rec_index);
-
-	if ( entry_index )
-	{
-		*entry_index = rec_index;
-	}
-
-bail:
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-void* ipa_table_get_entry_by_index(
-	ipa_table* table,
-	uint16_t   rec_index )
-{
-	void*    result = NULL;
-
-	IPADBG("In\n");
-
-	IPADBG("table(%p) rec_index(%u)\n",
-		   table,
-		   rec_index);
-
-	if ( ! rec_index || rec_index >= table->tot_tbl_ents )
-	{
-		IPAERR("Invalid record index (%u): It's "
-			   "either zero or exceeds table size (%u)\n",
-			   rec_index, table->tot_tbl_ents);
-		goto bail;
-	}
-
-	result = GOTO_REC(table, rec_index);
-
-bail:
-	IPADBG("Out\n");
-
-	return result;
-}
-
-void ipa_table_dma_cmd_helper_init(
-	ipa_table_dma_cmd_helper* dma_cmd_helper,
-	uint8_t table_indx,
-	ipa_table_dma_type table_type,
-	ipa_table_dma_type expn_table_type,
-	uint32_t offset)
-{
-	IPADBG("In\n");
-
-	dma_cmd_helper->offset = offset;
-	dma_cmd_helper->table_indx = table_indx;
-	dma_cmd_helper->table_type = table_type;
-	dma_cmd_helper->expn_table_type = expn_table_type;
-
-	IPADBG("Out\n");
-}
-
-void ipa_table_dma_cmd_generate(
-	ipa_table_dma_cmd_helper* dma_cmd_helper,
-	uint8_t is_expn,
-	uint32_t entry_offset,
-	uint16_t data,
-	struct ipa_ioc_nat_dma_cmd* cmd)
-{
-	struct ipa_ioc_nat_dma_one* dma = &cmd->dma[cmd->entries];
-
-	IPADBG("In\n");
-
-	IPADBG("is_expn(0x%02X) entry_offset(0x%08X) data(0x%04X)\n",
-		   is_expn, entry_offset, data);
-
-	dma->table_index = dma_cmd_helper->table_indx;
-
-	/*
-	 * DMA parameter base_addr is the table type (see the IPA
-	 * architecture document)
-	 */
-	dma->base_addr =
-		(is_expn) ?
-		dma_cmd_helper->expn_table_type :
-		dma_cmd_helper->table_type;
-
-	dma->offset = dma_cmd_helper->offset + entry_offset;
-
-	dma->data = data;
-
-	IPADBG("dma_entry[%u](table_index(0x%02X) "
-		   "base_addr(0x%02X) data(0x%04X) offset(0x%08X))\n",
-		   cmd->entries,
-		   dma->table_index,
-		   dma->base_addr,
-		   dma->data,
-		   dma->offset);
-
-	cmd->entries++;
-
-	IPADBG("Out\n");
-}
-
-int ipa_table_iterator_init(
-	ipa_table_iterator* iterator,
-	ipa_table*          table,
-	void*               curr_entry,
-	uint16_t            curr_index)
-{
-	int occupied;
-
-	int ret = 0;
-
-	IPADBG("In\n");
-
-	memset(iterator, 0, sizeof(ipa_table_iterator));
-
-	occupied = table->entry_interface->entry_is_valid(curr_entry);
-
-	if ( ! occupied )
-	{
-		IPAERR("Invalid (not enabled) rule %u in %s\n", curr_index, table->name);
-		ret = -EINVAL;
-		goto bail;
-	}
-
-	iterator->curr_entry = curr_entry;
-	iterator->curr_index = curr_index;
-
-	iterator->prev_index = table->entry_interface->entry_get_prev_index(
-		curr_entry,
-		curr_index,
-		table->meta,
-		table->table_entries);
-
-	iterator->next_index = table->entry_interface->entry_get_next_index(
-		curr_entry);
-
-	if ( VALID_INDEX(iterator->prev_index) )
-	{
-		iterator->prev_entry = ipa_table_get_entry_by_index(
-			table,
-			iterator->prev_index);
-
-		if ( iterator->prev_entry == NULL )
-		{
-			IPAERR("Failed to retrieve the entry at index 0x%04X for %s\n",
-				   iterator->prev_index, table->name);
-			ret = -EPERM;
-			goto bail;
-		}
-	}
-
-	if ( VALID_INDEX(iterator->next_index) )
-	{
-		iterator->next_entry = ipa_table_get_entry_by_index(
-			table,
-			iterator->next_index);
-
-		if ( iterator->next_entry == NULL )
-		{
-			IPAERR("Failed to retrieve the entry at index 0x%04X for %s\n",
-				   iterator->next_index, table->name);
-			ret = -EPERM;
-			goto bail;
-		}
-	}
-
-	IPADBG("[index/entry] for "
-		   "prev:[0x%04X/%p] "
-		   "curr:[0x%04X/%p] "
-		   "next:[0x%04X/%p] "
-		   "\"%s\"\n",
-		   iterator->prev_index,
-		   iterator->prev_entry,
-		   iterator->curr_index,
-		   iterator->curr_entry,
-		   iterator->next_index,
-		   iterator->next_entry,
-		   table->name);
-
-bail:
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-int ipa_table_iterator_next(
-	ipa_table_iterator* iterator,
-	ipa_table*          table)
-{
-	int ret = 0;
-
-	IPADBG("In\n");
-
-	iterator->prev_entry = iterator->curr_entry;
-	iterator->prev_index = iterator->curr_index;
-	iterator->curr_entry = iterator->next_entry;
-	iterator->curr_index = iterator->next_index;
-
-	iterator->next_index = table->entry_interface->entry_get_next_index(
-		iterator->curr_entry);
-
-	if ( ! VALID_INDEX(iterator->next_index) )
-	{
-		iterator->next_entry = NULL;
-	}
-	else
-	{
-		iterator->next_entry = ipa_table_get_entry_by_index(
-			table, iterator->next_index);
-
-		if (iterator->next_entry == NULL)
-		{
-			IPAERR("Failed to retrieve the entry at index %d for %s\n",
-				   iterator->next_index, table->name);
-			ret = -EPERM;
-			goto bail;
-		}
-	}
-
-	IPADBG("Iterator moved to: prev_index=%d curr_index=%d next_index=%d\n",
-		   iterator->prev_index, iterator->curr_index, iterator->next_index);
-
-	IPADBG("                   prev_entry=%pK curr_entry=%pK next_entry=%pK\n",
-		   iterator->prev_entry, iterator->curr_entry, iterator->next_entry);
-
-bail:
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-int ipa_table_iterator_end(
-	ipa_table_iterator* iterator,
-	ipa_table*          table_ptr,
-	uint16_t            rec_index,  /* a table slot relative to hash */
-	void*               rec_ptr )   /* occupant record at index above */
-{
-	bool found_end = false;
-
-	int ret;
-
-	IPADBG("In\n");
-
-	if ( ! iterator || ! table_ptr || ! rec_ptr )
-	{
-		IPAERR("Bad arg: iterator(%p) and/or table_ptr (%p) and/or rec_ptr(%p)\n",
-			   iterator, table_ptr, rec_ptr);
-		ret = -1;
-		goto bail;
-	}
-
-	memset(iterator, 0, sizeof(ipa_table_iterator));
-
-	iterator->prev_index = rec_index;
-	iterator->prev_entry = rec_ptr;
-
-	while ( 1 )
-	{
-		uint16_t next_index =
-			table_ptr->entry_interface->entry_get_next_index(iterator->prev_entry);
-
-		if ( ! VALID_INDEX(next_index) )
-		{
-			found_end = true;
-			break;
-		}
-
-		if ( next_index == iterator->prev_index )
-		{
-			IPAERR("next_index(%u) and prev_index(%u) shouldn't be equal in %s\n",
-				   next_index,
-				   iterator->prev_index,
-				   table_ptr->name);
-			break;
-		}
-
-		iterator->prev_index = next_index;
-		iterator->prev_entry = GOTO_REC(table_ptr, next_index);
-	}
-
-	if ( found_end )
-	{
-		IPADBG("Iterator found end of list record\n");
-		ret = 0;
-	}
-	else
-	{
-		IPAERR("Iterator can't find end of list record\n");
-		ret = -1;
-	}
-
-bail:
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-int ipa_table_iterator_is_head_with_tail(
-	ipa_table_iterator* iterator)
-{
-	int ret = 0;
-
-	IPADBG("In\n");
-
-	ret = VALID_INDEX(iterator->next_index) && ! VALID_INDEX(iterator->prev_index);
-
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-static int InsertHead(
-	ipa_table*                  table,
-	void*                       rec_ptr,   /* empty record in table */
-	uint16_t                    rec_index, /* index of record above */
-	void*                       user_data,
-	struct ipa_ioc_nat_dma_cmd* cmd )
-{
-	uint16_t enable_data = 0;
-
-	int ret = 0;
-
-	IPADBG("In\n");
-
-	ret = table->entry_interface->entry_head_insert(
-		rec_ptr,
-		user_data,
-		&enable_data);
-
-	if (ret)
-	{
-		IPAERR("unable to insert a new entry to the head in %s\n", table->name);
-		goto bail;
-	}
-
-	ipa_table_add_dma_cmd(
-		table,
-		HELP_UPDATE_HEAD,
-		rec_ptr,
-		rec_index,
-		enable_data,
-		cmd);
-
-	++table->cur_tbl_cnt;
-
-bail:
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-static int InsertTail(
-	ipa_table*                  table,
-	void*                       rec_ptr,       /* occupied record at index below */
-	uint16_t*                   rec_index_ptr, /* pointer to index of record above */
-	void*                       user_data,
-	struct ipa_ioc_nat_dma_cmd* cmd )
-{
-	bool is_index_tbl = (table->meta) ? true : false;
-
-	ipa_table_iterator iterator;
-
-	uint16_t enable_data = 0;
-
-	int ret = 0;
-
-	IPADBG("In\n");
-
-	/*
-	 * The most important side effect of the following is to set the
-	 * iterator's prev_index and prev_entry...which will be the last
-	 * valid entry on the end of the list.
-	 */
-	ret = ipa_table_iterator_end(&iterator, table, *rec_index_ptr, rec_ptr);
-
-	if ( ret )
-	{
-		IPAERR("Failed to reach the end of list following rec_index(%u) in %s\n",
-			   *rec_index_ptr, table->name);
-		goto bail;
-	}
-
-	/*
-	 * The most important side effect of the following is to set the
-	 * iterator's curr_index and curr_entry with the next available
-	 * expansion table open slot.
-	 */
-	ret = FindExpnTblFreeEntry(table, &iterator.curr_entry, &iterator.curr_index);
-
-	if ( ret )
-	{
-		IPAERR("FindExpnTblFreeEntry of %s failed\n", table->name);
-		goto bail;
-	}
-
-	/*
-	 * Copy data into curr_entry (ie. open slot).
-	 */
-	if ( is_index_tbl )
-	{
-		ret = table->entry_interface->entry_tail_insert(
-			iterator.curr_entry,
-			user_data);
-	}
-	else
-	{
-		/*
-		 * We need enable bit when not index table, hence...
-		 */
-		ret = table->entry_interface->entry_head_insert(
-			iterator.curr_entry,
-			user_data,
-			&enable_data);
-	}
-
-	if (ret)
-	{
-		IPAERR("Unable to insert a new entry to the tail in %s\n", table->name);
-		goto bail;
-	}
-
-	/*
-	 * Update curr_entry's prev_index field with iterator.prev_index
-	 */
-	table->entry_interface->entry_set_prev_index(
-		iterator.curr_entry, /* set by FindExpnTblFreeEntry above */
-		iterator.curr_index, /* set by FindExpnTblFreeEntry above */
-		iterator.prev_index, /* set by ipa_table_iterator_end above */
-		table->meta,
-		table->table_entries);
-
-	if ( ! is_index_tbl )
-	{
-		/*
-		 * Generate dma command to have the IPA update the
-		 * curr_entry's enable field when not the index table...
-		 */
-		ipa_table_add_dma_cmd(
-			table,
-			HELP_UPDATE_HEAD,
-			iterator.curr_entry,
-			iterator.curr_index,
-			enable_data,
-			cmd);
-	}
-
-	/*
-	 * Generate a dma command to have the IPA update the prev_entry's
-	 * next_index with iterator.curr_index.
-	 */
-	ipa_table_add_dma_cmd(
-		table,
-		HELP_UPDATE_ENTRY,
-		iterator.prev_entry,
-		iterator.prev_index,
-		iterator.curr_index,
-		cmd);
-
-	++table->cur_expn_tbl_cnt;
-
-	*rec_index_ptr = iterator.curr_index;
-
-bail:
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-/**
- * MakeEntryHdl() - makes an entry handle
- * @tbl_hdl: [in] tbl - the table
- * @tbl_entry: [in] tbl_entry - table entry
- *
- * Calculate the entry handle which will be returned to client
- *
- * Returns: >0 table entry handle
- */
-static uint16_t MakeEntryHdl(
-	ipa_table* tbl,
-	uint16_t   tbl_entry )
-{
-	uint16_t entry_hdl = 0;
-
-	IPADBG("In\n");
-
-	if (tbl_entry >= tbl->table_entries)
-	{
-		/*
-		 * Update the index into table
-		 */
-		entry_hdl = tbl_entry - tbl->table_entries;
-		entry_hdl = (entry_hdl << IPA_TABLE_TYPE_BITS);
-		/*
-		 * Update the expansion table type bit
-		 */
-		entry_hdl = (entry_hdl | IPA_TABLE_TYPE_MASK);
-	}
-	else
-	{
-		entry_hdl = tbl_entry;
-		entry_hdl = (entry_hdl << IPA_TABLE_TYPE_BITS);
-	}
-
-	/*
-	 * Set memory type bit.
-	 */
-	entry_hdl = entry_hdl | (tbl->nmi << IPA_TABLE_TYPE_MEM_SHIFT);
-
-	IPADBG("In: tbl_entry(%u) Out: entry_hdl(%u)\n", tbl_entry, entry_hdl);
-
-	IPADBG("Out\n");
-
-	return entry_hdl;
-}
-
-static int mt_slot(
-	ipa_table*      table_ptr,
-	uint32_t        rule_hdl,
-	void*           record_ptr,
-	uint16_t        record_index,
-	void*           meta_record_ptr,
-	uint16_t        meta_record_index,
-	void*           arb_data_ptr )
-{
-	IPADBG("%s: Empty expansion slot: (%u) in table of size: (%u)\n",
-		   table_ptr->name,
-		   record_index,
-		   table_ptr->tot_tbl_ents);
-
-	return record_index;
-}
-
-/*
- * returns expn table entry absolute index
- */
-static int FindExpnTblFreeEntry(
-	ipa_table* table,
-	void**     free_entry,
-	uint16_t*  entry_index )
-{
-	int ret;
-
-	IPADBG("In\n");
-
-	if ( ! table || ! free_entry || ! entry_index )
-	{
-		IPAERR("Bad arg: table(%p) and/or "
-			   "free_entry(%p) and/or entry_index(%p)\n",
-			   table, free_entry, entry_index);
-		ret = -1;
-		goto bail;
-	}
-
-	*entry_index = 0;
-	*free_entry  = NULL;
-
-	/*
-	 * The following will start walk at expansion slots
-	 * (ie. just after table->table_entries)...
-	 */
-	ret = ipa_table_walk(table, table->table_entries, WHEN_SLOT_EMPTY, mt_slot, 0);
-
-	if ( ret > 0 )
-	{
-		*entry_index = (uint16_t) ret;
-
-		*free_entry = GOTO_REC(table, *entry_index);
-
-		IPADBG("%s: entry_index val (%u) free_entry val (%p)\n",
-			   table->name,
-			   *entry_index,
-			   *free_entry);
-
-		ret = 0;
-	}
-	else
-	{
-		if ( ret < 0 )
-		{
-			IPAERR("%s: While searching table for emtpy slot\n",
-				   table->name);
-		}
-		else
-		{
-			IPADBG("%s: No empty slots (ie. expansion table full): "
-				   "BASE (avail/used): (%u/%u) EXPN (avail/used): (%u/%u)\n",
-				   table->name,
-				   table->table_entries,
-				   table->cur_tbl_cnt,
-				   table->expn_table_entries,
-				   table->cur_expn_tbl_cnt);
-		}
-
-		ret = -1;
-	}
-
-bail:
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-/**
- * Get2PowerTightUpperBound() - Returns the tight upper bound which is a power of 2
- * @num: [in] given number
- *
- * Returns the tight upper bound for a given number which is power of 2
- *
- * Returns: the tight upper bound which is power of 2
- */
-static int Get2PowerTightUpperBound(uint16_t num)
-{
-	uint16_t tmp = num, prev = 0, curr = 2;
-
-	if (num == 0)
-		return 2;
-
-	while (tmp != 1)
-	{
-		prev = curr;
-		curr <<= 1;
-		tmp >>= 1;
-	}
-
-	return (num == prev) ? prev : curr;
-}
-
-/**
- * GetEvenTightUpperBound() - Returns the tight upper bound which is an even number
- * @num: [in] given number
- *
- * Returns the tight upper bound for a given number which is an even number
- *
- * Returns: the tight upper bound which is an even number
- */
-static int GetEvenTightUpperBound(uint16_t num)
-{
-	if (num == 0)
-		return 2;
-
-	return (num % 2) ? num + 1 : num;
-}
-
-int ipa_calc_num_sram_table_entries(
-	uint32_t  sram_size,
-	uint32_t  table1_ent_size,
-	uint32_t  table2_ent_size,
-	uint16_t* num_entries_ptr)
-{
-	ipa_table nat_table;
-	ipa_table index_table;
-	int       size = 0;
-	uint16_t  tot;
-
-	IPADBG("In\n");
-
-	IPADBG("sram_size(%x or %u)\n", sram_size, sram_size);
-
-	*num_entries_ptr = 0;
-
-	tot = 1;
-
-	while ( 1 )
-	{
-		IPADBG("Trying %u entries\n", tot);
-
-		ipa_table_init(&nat_table,
-					   "tmp_sram_table1",
-					   IPA_NAT_MEM_IN_DDR,
-					   table1_ent_size,
-					   NULL,
-					   0,
-					   NULL);
-
-		ipa_table_init(&index_table,
-					   "tmp_sram_table1",
-					   IPA_NAT_MEM_IN_DDR,
-					   table2_ent_size,
-					   NULL,
-					   0,
-					   NULL);
-
-		nat_table.table_entries = index_table.table_entries =
-			Get2PowerTightUpperBound(tot * IPA_BASE_TABLE_PCNT_4SRAM);
-		nat_table.expn_table_entries = index_table.expn_table_entries =
-			GetEvenTightUpperBound(tot * IPA_EXPANSION_TABLE_PCNT_4SRAM);
-
-		size  = ipa_table_calculate_size(&nat_table);
-		size += ipa_table_calculate_size(&index_table);
-
-		IPADBG("%u entries consumes size(0x%x or %u)\n", tot, size, size);
-
-		if ( size > sram_size )
-			break;
-
-		*num_entries_ptr = tot;
-
-		++tot;
-	}
-
-	IPADBG("Optimal number of entries: %u\n", *num_entries_ptr);
-
-	IPADBG("Out\n");
-
-	return (*num_entries_ptr) ? 0 : -1;
-}
-
-int ipa_table_walk(
-	ipa_table*        ipa_tbl_ptr,
-	uint16_t          start_index,
-	When2Callback     when2cb,
-	ipa_table_walk_cb walk_cb,
-	void*             arb_data_ptr )
-{
-	uint16_t i;
-	uint32_t tot;
-	uint8_t* rec_ptr;
-	void*    meta_record_ptr;
-	uint16_t meta_record_index;
-
-	int ret = 0;
-
-	IPADBG("In\n");
-
-	if ( ! ipa_tbl_ptr ||
-		 ! VALID_WHEN2CALLBACK(when2cb) ||
-		 ! walk_cb )
-	{
-		IPAERR("Bad arg: ipa_tbl_ptr(%p) and/or "
-			   "when2cb(%u) and/or walk_cb(%p)\n",
-			   ipa_tbl_ptr,
-			   when2cb,
-			   walk_cb);
-		ret = -EINVAL;
-		goto bail;
-	}
-
-	tot =
-		ipa_tbl_ptr->table_entries +
-		ipa_tbl_ptr->expn_table_entries;
-
-	if ( start_index >= tot )
-	{
-		IPAERR("Bad arg: start_index(%u)\n", start_index);
-		ret = -EINVAL;
-		goto bail;
-	}
-
-	/*
-	 * Go through table...
-	 */
-	for ( i = start_index, rec_ptr = GOTO_REC(ipa_tbl_ptr, start_index);
-		  i < tot;
-		  i++,             rec_ptr += ipa_tbl_ptr->entry_size )
-	{
-		bool call_back;
-
-		if ( ipa_tbl_ptr->entry_interface->entry_is_valid(rec_ptr) )
-		{
-			call_back = (when2cb == WHEN_SLOT_FILLED) ? true : false;
-		}
-		else
-		{
-			call_back = (when2cb == WHEN_SLOT_EMPTY)  ? true : false;
-		}
-
-		if ( call_back )
-		{
-			uint32_t rule_hdl = MakeEntryHdl(ipa_tbl_ptr, i);
-
-			meta_record_ptr   = NULL;
-			meta_record_index = 0;
-
-			if ( i >= ipa_tbl_ptr->table_entries && ipa_tbl_ptr->meta )
-			{
-				meta_record_index = i - ipa_tbl_ptr->table_entries;
-
-				meta_record_ptr = (uint8_t*) ipa_tbl_ptr->meta +
-					(meta_record_index * ipa_tbl_ptr->meta_entry_size);
-			}
-
-			ret = walk_cb(
-				ipa_tbl_ptr,
-				rule_hdl,
-				rec_ptr,
-				i,
-				meta_record_ptr,
-				meta_record_index,
-				arb_data_ptr);
-
-			if ( ret != 0 )
-			{
-				if ( ret < 0 )
-				{
-					IPAERR("walk_cb returned non-zero (%d)\n", ret);
-				}
-				else
-				{
-					IPADBG("walk_cb returned non-zero (%d)\n", ret);
-				}
-				goto bail;
-			}
-		}
-	}
-
-bail:
-	IPADBG("Out\n");
-
-	return ret;
-}
-
-int ipa_table_add_dma_cmd(
-	ipa_table*                  tbl_ptr,
-	dma_help_type               help_type,
-	void*                       rec_ptr,
-	uint16_t                    rec_index,
-	uint16_t                    data_for_entry,
-	struct ipa_ioc_nat_dma_cmd* cmd_ptr )
-{
-	ipa_table_dma_cmd_helper* help_ptr;
-
-	uint32_t tab_sz, entry_offset;
-
-	uint8_t is_expn;
-
-	int ret = 0;
-
-	IPADBG("In\n");
-
-	if ( ! tbl_ptr ||
-		 ! VALID_DMA_HELP_TYPE(help_type) ||
-		 ! rec_ptr ||
-		 ! cmd_ptr )
-	{
-		IPAERR("Bad arg: tbl_ptr(%p) and/or help_type(%u) "
-			   "and/or rec_ptr(%p) and/or cmd_ptr(%p)\n",
-			   tbl_ptr,
-			   help_type,
-			   rec_ptr,
-			   cmd_ptr);
-		ret = -EINVAL;
-		goto bail;
-	}
-
-	tab_sz =
-		tbl_ptr->table_entries +
-		tbl_ptr->expn_table_entries;
-
-	if ( rec_index >= tab_sz )
-	{
-		IPAERR("Bad arg: rec_index(%u)\n", rec_index);
-		ret = -EINVAL;
-		goto bail;
-	}
-
-	is_expn = (rec_index >= tbl_ptr->table_entries);
-
-	entry_offset = (uint8_t*) rec_ptr -
-		((is_expn) ? tbl_ptr->expn_table_addr : tbl_ptr->table_addr);
-
-	ipa_table_dma_cmd_generate(
-		tbl_ptr->dma_help[help_type],
-		is_expn,
-		entry_offset,
-		data_for_entry,
-		cmd_ptr);
-
-bail:
-	IPADBG("Out\n");
-
-	return ret;
-}
diff --git a/ipanat/test/Makefile.am b/ipanat/test/Makefile.am
deleted file mode 100644
index cefa7ed..0000000
--- a/ipanat/test/Makefile.am
+++ /dev/null
@@ -1,46 +0,0 @@
-AM_CPPFLAGS = -I./../inc \
-	      -I$(top_srcdir)/ipanat/inc
-
-AM_CPPFLAGS += -Wall -Wundef -Wno-trigraphs
-AM_CPPFLAGS += -g -DDEBUG -DNAT_DEBUG
-
-ipanattest_SOURCES = \
-		ipa_nat_testREG.c \
-		ipa_nat_test000.c \
-		ipa_nat_test001.c \
-		ipa_nat_test002.c \
-		ipa_nat_test003.c \
-		ipa_nat_test004.c \
-		ipa_nat_test005.c \
-		ipa_nat_test006.c \
-		ipa_nat_test007.c \
-		ipa_nat_test008.c \
-		ipa_nat_test009.c \
-		ipa_nat_test010.c \
-		ipa_nat_test011.c \
-		ipa_nat_test012.c \
-		ipa_nat_test013.c \
-		ipa_nat_test014.c \
-		ipa_nat_test015.c \
-		ipa_nat_test016.c \
-		ipa_nat_test017.c \
-		ipa_nat_test018.c \
-		ipa_nat_test019.c \
-		ipa_nat_test020.c \
-		ipa_nat_test021.c \
-		ipa_nat_test022.c \
-		ipa_nat_test023.c \
-		ipa_nat_test024.c \
-		ipa_nat_test025.c \
-		ipa_nat_test999.c \
-		main.c
-
-bin_PROGRAMS  =  ipanattest
-
-requiredlibs =  ../src/libipanat.la
-
-ipanattest_LDADD =  $(requiredlibs)
-
-LOCAL_MODULE := libipanat
-LOCAL_PRELINK_MODULE := false
-include $(BUILD_SHARED_LIBRARY)
diff --git a/ipanat/test/README.txt b/ipanat/test/README.txt
deleted file mode 100644
index 9a84b10..0000000
--- a/ipanat/test/README.txt
+++ /dev/null
@@ -1,66 +0,0 @@
-INTRODUCTION
-------------
-
-The ipanattest allow its user to drive NAT testing.  It is run thusly:
-
-# ipanattest [-d -r N -i N -e N -m mt]
-Where:
-  -d     Each test is discrete (create table, add rules, destroy table)
-         If not specified, only one table create and destroy for all tests
-  -r N   Where N is the number of times to run the inotify regression test
-  -i N   Where N is the number of times (iterations) to run test
-  -e N   Where N is the number of entries in the NAT
-  -m mt  Where mt is the type of memory to use for the NAT
-         Legal mt's: DDR, SRAM, or HYBRID (ie. use SRAM and DDR)
-  -g M-N Run tests M through N only
-
-More about each command line option:
-
--d    Makes each test discrete; meaning that, each test will create a
-      table, add rules, then destory the table.
-
-      Conversely, when -d not specified, each test will not create
-      and destroy a table.  Only one table create and destroy at the
-      start and end of the run...with all test being run in between.
-
--r N  Will cause the inotify regression test to be run N times.
-
--i N  Will cause each test to be run N times
-
--e N  Will cause the creation of a table with N entries
-
--m mt Will cause the NAT to live in either SRAM, DDR, or both
-      (ie. HYBRID)
-
--g M-N Will cause test M to N to be run. This allows you to skip
-       or isolate tests
-
-When run with no arguments (ie. defaults):
-
-  1) The tests will be non-discrete
-  2) With only one iteration of the tests
-  3) On a DDR based table with one hundred entries
-  4) No inotify regression will be run
-
-EXAMPLE COMMAND LINES
----------------------
-
-To execute discrete tests (create, add rules, and delete table for
-each test) one time on a table with one hundred entries:
-
-# ipanattest -d -i 1 -e 100
-
-To execute non-discrete (create and delete table only once) tests five
-times on a table with thirty-two entries:
-
-# ipanattest -i 5 -e 32
-
-To execute inotify regression test 5 times
-
-# ipanattest -r 5
-
-ADDING NEW TESTS
-----------------
-
-In main.c, please see and embellish nt_array[] and use the following
-file as a model: ipa_nat_testMODEL.c
diff --git a/ipanat/test/ipa_nat_test.h b/ipanat/test/ipa_nat_test.h
deleted file mode 100644
index 9634333..0000000
--- a/ipanat/test/ipa_nat_test.h
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * Copyright (c) 2014, 2018-2019 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * ===========================================================================
- *
- * INCLUDE FILES FOR MODULE
- *
- * ===========================================================================
- */
-#include <stdio.h>
-#include <stdint.h>
-#include <stdbool.h>
-#include <stdlib.h>
-#include <time.h>
-#include <netinet/in.h> /* for proto definitions */
-
-#include "ipa_nat_drv.h"
-#include "ipa_nat_drvi.h"
-
-#undef array_sz
-#define array_sz(a) \
-	( sizeof(a)/sizeof(a[0]) )
-
-#define u32 uint32_t
-#define u16 uint16_t
-#define u8  uint8_t
-
-#define RAN_ADDR rand_ip_addr()
-#define RAN_PORT rand_ip_port()
-
-static inline u32 rand_ip_addr()
-{
-	static char buf[64];
-
-	snprintf(
-		buf, sizeof(buf),
-		"%u.%u.%u.%u",
-		(rand() % 254) + 1,
-		 rand() % 255,
-		 rand() % 255,
-		(rand() % 254) + 1);
-
-	return (u32) inet_addr(buf);
-}
-
-static inline u16 rand_ip_port()
-{
-	return (u16) ((rand() % 60535) + 5000);
-}
-
-/*============ Preconditions to run NAT Test cases =========*/
-#define IPA_NAT_TEST_PRE_COND_TE  20
-
-#define CHECK_ERR(x)							\
-	if ( x ) {									\
-		IPAERR("Abrupt end of %s with "			\
-			   "err: %d at line: %d\n",			\
-			   __FUNCTION__, x, __LINE__);		\
-		return -1;								\
-	}
-
-#define CHECK_ERR_TBL_STOP(x, th)									 \
-	if ( th ) {														 \
-		int _ter_ = ipa_nat_validate_ipv4_table(th);				 \
-		if ( _ter_ ) {												 \
-			if ( sep ) {											 \
-				ipa_nat_del_ipv4_tbl(th);							 \
-			}														 \
-			IPAERR("Abrupt end of %s with "							 \
-				   "err: %d at line: %d\n",							 \
-				   __FUNCTION__, _ter_, __LINE__);					 \
-			return -1;												 \
-		}															 \
-	}																 \
-	if ( x ) {														 \
-		if ( th ) {													 \
-			ipa_nat_dump_ipv4_table(th);							 \
-			if( sep ) {												 \
-				ipa_nat_del_ipv4_tbl(th);							 \
-			}														 \
-		}															 \
-		IPAERR("Abrupt end of %s with "								 \
-			   "err: %d at line: %d\n",								 \
-			   __FUNCTION__, x, __LINE__);							 \
-		return -1;													 \
-	}
-
-#define CHECK_ERR_TBL_ACTION(x, th, action)							 \
-	if ( th ) {														 \
-		int _ter_ = ipa_nat_validate_ipv4_table(th);				 \
-		if ( _ter_ ) {												 \
-			IPAERR("ipa_nat_validate_ipv4_table() failed "			 \
-				   "in: %s at line: %d\n",							 \
-				   __FUNCTION__, __LINE__);							 \
-			action;													 \
-		}															 \
-	}																 \
-	if ( x ) {														 \
-		if ( th ) {													 \
-			ipa_nat_dump_ipv4_table(th);							 \
-		}															 \
-		IPAERR("error: %d in %s at line: %d\n",						 \
-			   x, __FUNCTION__, __LINE__);							 \
-		action;														 \
-	}
-
-typedef int (*NatTestFunc)(
-	const char*, u32, int, u32, int, void*);
-
-typedef struct
-{
-	const char* func_name;
-	int         num_ents_trigger;
-	int         test_hold_time_in_secs;
-	NatTestFunc func;
-} NatTests;
-
-#undef NAT_TEST_ENTRY
-#define NAT_TEST_ENTRY(f, n, ht) \
-	{#f, (n), (ht), f}
-
-#define NAT_DEBUG
-int ipa_nat_validate_ipv4_table(u32);
-
-int ipa_nat_testREG(const char*, u32, int, u32, int, void*);
-
-int ipa_nat_test000(const char*, u32, int, u32, int, void*);
-int ipa_nat_test001(const char*, u32, int, u32, int, void*);
-int ipa_nat_test002(const char*, u32, int, u32, int, void*);
-int ipa_nat_test003(const char*, u32, int, u32, int, void*);
-int ipa_nat_test004(const char*, u32, int, u32, int, void*);
-int ipa_nat_test005(const char*, u32, int, u32, int, void*);
-int ipa_nat_test006(const char*, u32, int, u32, int, void*);
-int ipa_nat_test007(const char*, u32, int, u32, int, void*);
-int ipa_nat_test008(const char*, u32, int, u32, int, void*);
-int ipa_nat_test009(const char*, u32, int, u32, int, void*);
-int ipa_nat_test010(const char*, u32, int, u32, int, void*);
-int ipa_nat_test011(const char*, u32, int, u32, int, void*);
-int ipa_nat_test012(const char*, u32, int, u32, int, void*);
-int ipa_nat_test013(const char*, u32, int, u32, int, void*);
-int ipa_nat_test014(const char*, u32, int, u32, int, void*);
-int ipa_nat_test015(const char*, u32, int, u32, int, void*);
-int ipa_nat_test016(const char*, u32, int, u32, int, void*);
-int ipa_nat_test017(const char*, u32, int, u32, int, void*);
-int ipa_nat_test018(const char*, u32, int, u32, int, void*);
-int ipa_nat_test019(const char*, u32, int, u32, int, void*);
-int ipa_nat_test020(const char*, u32, int, u32, int, void*);
-int ipa_nat_test021(const char*, u32, int, u32, int, void*);
-int ipa_nat_test022(const char*, u32, int, u32, int, void*);
-int ipa_nat_test023(const char*, u32, int, u32, int, void*);
-int ipa_nat_test024(const char*, u32, int, u32, int, void*);
-int ipa_nat_test025(const char*, u32, int, u32, int, void*);
-int ipa_nat_test999(const char*, u32, int, u32, int, void*);
diff --git a/ipanat/test/ipa_nat_test000.c b/ipanat/test/ipa_nat_test000.c
deleted file mode 100644
index 9444fae..0000000
--- a/ipanat/test/ipa_nat_test000.c
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (c) 2014-2019 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test000.c
-
-	@brief
-	Verify the following scenario:
-	1. Add ipv4 table
-*/
-/*===========================================================================*/
-
-#include "ipa_nat_test.h"
-
-int ipa_nat_test000(
-	const char* nat_mem_type,
-	u32  pub_ip_add,
-	int total_entries,
-	u32 tbl_hdl,
-	int sep,
-	void* arb_data_ptr)
-{
-	int* tbl_hdl_ptr = (int*) arb_data_ptr;
-
-	int  ret;
-
-	IPADBG("In\n");
-
-	if ( ! sep )
-	{
-		IPADBG("calling ipa_nat_add_ipv4_tbl()\n");
-
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, nat_mem_type, total_entries, tbl_hdl_ptr);
-		CHECK_ERR_TBL_STOP(ret, *tbl_hdl_ptr);
-
-		IPADBG("create nat ipv4 table successfully()\n");
-	}
-
-	IPADBG("Out\n");
-
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test001.c b/ipanat/test/ipa_nat_test001.c
deleted file mode 100644
index 24093d5..0000000
--- a/ipanat/test/ipa_nat_test001.c
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright (c) 2014, 2018-2019 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test001.c
-
-	@brief
-	Verify the following scenario:
-	1. Add ipv4 table
-	2. Add ipv4 rule
-	3. Delete ipv4 table
-*/
-/*===========================================================================*/
-
-#include "ipa_nat_test.h"
-
-int ipa_nat_test001(
-	const char* nat_mem_type,
-	u32 pub_ip_add,
-	int total_entries,
-	u32 tbl_hdl,
-	int sep,
-	void* arb_data_ptr)
-{
-	int* tbl_hdl_ptr = (int*) arb_data_ptr;
-	int ret;
-	u32 rule_hdl;
-	ipa_nat_ipv4_rule ipv4_rule = {0};
-
-	ipv4_rule.target_ip = RAN_ADDR;
-	ipv4_rule.target_port = RAN_PORT;
-
-	ipv4_rule.private_ip = RAN_ADDR;
-	ipv4_rule.private_port = RAN_PORT;
-
-	ipv4_rule.protocol = IPPROTO_TCP;
-	ipv4_rule.public_port = RAN_PORT;
-
-	IPADBG("In\n");
-
-	if ( sep )
-	{
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, nat_mem_type, total_entries, &tbl_hdl);
-		CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-	}
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	if ( sep )
-	{
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		*tbl_hdl_ptr = 0;
-		CHECK_ERR(ret);
-	}
-
-	IPADBG("Out\n");
-
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test002.c b/ipanat/test/ipa_nat_test002.c
deleted file mode 100644
index 788b12c..0000000
--- a/ipanat/test/ipa_nat_test002.c
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (c) 2014, 2018-2019 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test002.c
-
-	@brief
-	Verify the following scenario:
-	1. Add ipv4 table
-	2. Add ipv4 rule
-	3. delete ipv4 rule
-	4. Delete ipv4 table
-*/
-/*=========================================================================*/
-
-#include "ipa_nat_test.h"
-
-int ipa_nat_test002(
-	const char* nat_mem_type,
-	u32 pub_ip_add,
-	int total_entries,
-	u32 tbl_hdl,
-	int sep,
-	void* arb_data_ptr)
-{
-	int* tbl_hdl_ptr = (int*) arb_data_ptr;
-	int ret;
-	u32 rule_hdl;
-	ipa_nat_ipv4_rule ipv4_rule = {0};
-
-	ipv4_rule.target_ip = RAN_ADDR;
-	ipv4_rule.target_port = RAN_PORT;
-
-	ipv4_rule.private_ip = RAN_ADDR;
-	ipv4_rule.private_port = RAN_PORT;
-
-	ipv4_rule.protocol = IPPROTO_TCP;
-	ipv4_rule.public_port = RAN_PORT;
-
-	IPADBG("In\n");
-
-	if ( sep )
-	{
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, nat_mem_type, total_entries, &tbl_hdl);
-		CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-	}
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	if ( sep )
-	{
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		*tbl_hdl_ptr = 0;
-		CHECK_ERR(ret);
-	}
-
-	IPADBG("Out\n");
-
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test003.c b/ipanat/test/ipa_nat_test003.c
deleted file mode 100644
index 8bc4ecb..0000000
--- a/ipanat/test/ipa_nat_test003.c
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright (c) 2014, 2018-2019 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-/*=========================================================================*/
-/*!
-	@file
-	IPA_NAT_ipa_nat_test003.cpp
-
-	@brief
-	Verify the following scenario:
-	1. Add ipv4 table
-	2. Add ipv4 rule
-	3. Add ipv4 rule
-	4. Delete ipv4 table
-*/
-/*=========================================================================*/
-
-#include "ipa_nat_test.h"
-
-int ipa_nat_test003(
-	const char* nat_mem_type,
-	u32 pub_ip_add,
-	int total_entries,
-	u32 tbl_hdl,
-	int sep,
-	void* arb_data_ptr)
-{
-	int* tbl_hdl_ptr = (int*) arb_data_ptr;
-
-	ipa_nat_ipv4_rule ipv4_rule = {0};
-	u32 rule_hdl;
-
-	int ret;
-
-	IPADBG("In\n");
-
-	if ( sep )
-	{
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, nat_mem_type, total_entries, &tbl_hdl);
-		CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-	}
-
-	ipv4_rule.target_ip = RAN_ADDR;
-	ipv4_rule.target_port = RAN_PORT;
-
-	ipv4_rule.private_ip = RAN_ADDR;
-	ipv4_rule.private_port = RAN_PORT;
-
-	ipv4_rule.protocol = IPPROTO_TCP;
-	ipv4_rule.public_port = RAN_PORT;
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ipv4_rule.target_ip = RAN_ADDR;
-	ipv4_rule.target_port = RAN_PORT;
-
-	ipv4_rule.private_ip = RAN_ADDR;
-	ipv4_rule.private_port = RAN_PORT;
-
-	ipv4_rule.protocol = IPPROTO_TCP;
-	ipv4_rule.public_port = RAN_PORT;
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	if ( sep )
-	{
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		*tbl_hdl_ptr = 0;
-		CHECK_ERR(ret);
-	}
-
-	IPADBG("Out\n");
-
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test004.c b/ipanat/test/ipa_nat_test004.c
deleted file mode 100644
index a9d84b6..0000000
--- a/ipanat/test/ipa_nat_test004.c
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (c) 2014, 2018-2019 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test004.cpp
-
-	@brief
-	Verify the following scenario:
-	1. Add ipv4 table
-	2. Delete a bogus table handle
-	3. Delete ipv4 table
-*/
-/*===========================================================================*/
-
-#include "ipa_nat_test.h"
-
-int ipa_nat_test004(
-	const char* nat_mem_type,
-	u32 pub_ip_add,
-	int total_entries,
-	u32 tbl_hdl,
-	int sep,
-	void* arb_data_ptr)
-{
-	int* tbl_hdl_ptr = (int*) arb_data_ptr;
-	int ret = 0;
-	u32 tbl_hdl1 = 0xFFFFFFFF;
-
-	IPADBG("In\n");
-
-	if ( sep )
-	{
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, nat_mem_type, total_entries, &tbl_hdl);
-		CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-	}
-
-	ret = ipa_nat_del_ipv4_tbl(tbl_hdl1); /* intentionally pass bad handle */
-
-	if ( ret == 0 )
-	{
-		IPAERR("Able to delete table using invalid table handle\n");
-		CHECK_ERR_TBL_STOP(-1, tbl_hdl);
-	}
-
-	if ( sep )
-	{
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		*tbl_hdl_ptr = 0;
-		CHECK_ERR(ret);
-	}
-
-	IPADBG("Out\n");
-
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test005.c b/ipanat/test/ipa_nat_test005.c
deleted file mode 100644
index e2bb0f1..0000000
--- a/ipanat/test/ipa_nat_test005.c
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (c) 2014, 2018-2019 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test005.c
-
-	@brief
-	Verify the following scenario:
-	1. Add ipv4 table
-	2. Add ipv4 rule
-	3. Delete ipv4 rule
-	4. Add ipv4 rule
-	5. Delete ipv4 table
-*/
-/*=========================================================================*/
-
-#include "ipa_nat_test.h"
-
-int ipa_nat_test005(
-	const char* nat_mem_type,
-	u32 pub_ip_add,
-	int total_entries,
-	u32 tbl_hdl,
-	int sep,
-	void* arb_data_ptr)
-{
-	int* tbl_hdl_ptr = (int*) arb_data_ptr;
-	ipa_nat_ipv4_rule ipv4_rule = {0};
-	u32 rule_hdl;
-
-	int ret;
-
-	ipv4_rule.target_ip = RAN_ADDR;
-	ipv4_rule.target_port = RAN_PORT;
-
-	ipv4_rule.private_ip = RAN_ADDR;
-	ipv4_rule.private_port = RAN_PORT;
-
-	ipv4_rule.protocol = IPPROTO_TCP;
-	ipv4_rule.public_port = RAN_PORT;
-
-	IPADBG("In\n");
-
-	if ( sep )
-	{
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, nat_mem_type, total_entries, &tbl_hdl);
-		CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-	}
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	if ( sep )
-	{
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		*tbl_hdl_ptr = 0;
-		CHECK_ERR(ret);
-	}
-
-	IPADBG("Out\n");
-
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test006.c b/ipanat/test/ipa_nat_test006.c
deleted file mode 100644
index 7ce343c..0000000
--- a/ipanat/test/ipa_nat_test006.c
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright (c) 2014, 2018-2019 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test006.c
-
-	@brief
-	Verify the following scenario:
-	1. Add ipv4 table
-	2. Add ipv rule
-	3. Add same ipv rule
-	4. Delete first followed by second
-	5. Delete ipv4 table
-*/
-/*=========================================================================*/
-
-#include "ipa_nat_test.h"
-
-int ipa_nat_test006(
-	const char* nat_mem_type,
-	u32 pub_ip_add,
-	int total_entries,
-	u32 tbl_hdl,
-	int sep,
-	void* arb_data_ptr)
-{
-	int* tbl_hdl_ptr = (int*) arb_data_ptr;
-
-	ipa_nat_ipv4_rule ipv4_rule = {0};
-
-	u32 rule_hdl;
-	u32 rule_hdl1;
-
-	int ret;
-
-	ipv4_rule.target_ip = RAN_ADDR;
-	ipv4_rule.target_port = RAN_PORT;
-	ipv4_rule.private_ip = RAN_ADDR;
-	ipv4_rule.private_port = RAN_PORT;
-	ipv4_rule.protocol = IPPROTO_TCP;
-	ipv4_rule.public_port = RAN_PORT;
-
-	IPADBG("In\n");
-
-	if ( sep )
-	{
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, nat_mem_type, total_entries, &tbl_hdl);
-		CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-	}
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl1);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	if ( sep )
-	{
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		*tbl_hdl_ptr = 0;
-		CHECK_ERR(ret);
-	}
-
-	IPADBG("Out\n");
-
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test007.c b/ipanat/test/ipa_nat_test007.c
deleted file mode 100644
index 6406941..0000000
--- a/ipanat/test/ipa_nat_test007.c
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (c) 2014, 2018-2019 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test007.cpp
-
-	@brief
-	Verify the following scenario:
-	1. Add ipv4 table
-	2. add same ipv rules
-	3. delete second followed by first
-	4. Delete ipv4 table
-*/
-/*=========================================================================*/
-
-#include "ipa_nat_test.h"
-
-int ipa_nat_test007(
-	const char* nat_mem_type,
-	u32 pub_ip_add,
-	int total_entries,
-	u32 tbl_hdl,
-	int sep,
-	void* arb_data_ptr)
-{
-	int* tbl_hdl_ptr = (int*) arb_data_ptr;
-
-	ipa_nat_ipv4_rule ipv4_rule = {0};
-
-	u32 rule_hdl;
-	u32 rule_hdl1;
-
-	int ret;
-
-	ipv4_rule.target_ip = RAN_ADDR;
-	ipv4_rule.target_port = RAN_PORT;
-	ipv4_rule.private_ip = RAN_ADDR;
-	ipv4_rule.private_port = RAN_PORT;
-	ipv4_rule.protocol = IPPROTO_TCP;
-	ipv4_rule.public_port = RAN_PORT;
-
-	IPADBG("In\n");
-
-	if ( sep )
-	{
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, nat_mem_type, total_entries, &tbl_hdl);
-		CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-	}
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl1);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	if ( sep )
-	{
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		*tbl_hdl_ptr = 0;
-		CHECK_ERR(ret);
-	}
-
-	IPADBG("Out\n");
-
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test008.c b/ipanat/test/ipa_nat_test008.c
deleted file mode 100644
index ba4f5c4..0000000
--- a/ipanat/test/ipa_nat_test008.c
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (c) 2014, 2018-2019 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test008.c
-
-	@brief
-	Verify the following scenario:
-	1. Add ipv4 table
-	2. add 2 distinct rules
-	3. delete first followed by second
-	4. Delete ipv4 table
-*/
-/*=========================================================================*/
-
-#include "ipa_nat_test.h"
-
-int ipa_nat_test008(
-	const char* nat_mem_type,
-	u32 pub_ip_add,
-	int total_entries,
-	u32 tbl_hdl,
-	int sep,
-	void* arb_data_ptr)
-{
-	int* tbl_hdl_ptr = (int*) arb_data_ptr;
-	int ret;
-	u32 rule_hdl, rule_hdl1;
-	ipa_nat_ipv4_rule ipv4_rule = {0}, ipv4_rule1 = {0};
-
-	ipv4_rule.target_ip = RAN_ADDR;
-	ipv4_rule.target_port = RAN_PORT;
-	ipv4_rule.private_ip = RAN_ADDR;
-	ipv4_rule.private_port = RAN_PORT;
-	ipv4_rule.protocol = IPPROTO_TCP;
-	ipv4_rule.public_port = RAN_PORT;
-
-	ipv4_rule1.target_ip = RAN_ADDR;
-	ipv4_rule1.target_port = RAN_PORT;
-	ipv4_rule1.private_ip = RAN_ADDR;
-	ipv4_rule1.private_port = RAN_PORT;
-	ipv4_rule1.protocol = IPPROTO_TCP;
-	ipv4_rule1.public_port = RAN_PORT;
-
-	IPADBG("In\n");
-
-	if ( sep )
-	{
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, nat_mem_type, total_entries, &tbl_hdl);
-		CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-	}
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule1, &rule_hdl1);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	if ( sep )
-	{
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		*tbl_hdl_ptr = 0;
-		CHECK_ERR(ret);
-	}
-
-	IPADBG("Out\n");
-
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test009.c b/ipanat/test/ipa_nat_test009.c
deleted file mode 100644
index c73cf97..0000000
--- a/ipanat/test/ipa_nat_test009.c
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (c) 2014, 2018-2019 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test009.cpp
-
-	@brief
-	Verify the following scenario:
-	1. Add ipv4 table
-	2. add 2 distinct rules
-	3. delete second followed by first
-	4. Delete ipv4 table
-*/
-/*=========================================================================*/
-
-#include "ipa_nat_test.h"
-
-int ipa_nat_test009(
-	const char* nat_mem_type,
-	u32 pub_ip_add,
-	int total_entries,
-	u32 tbl_hdl,
-	int sep,
-	void* arb_data_ptr)
-{
-	int* tbl_hdl_ptr = (int*) arb_data_ptr;
-	int ret;
-	u32 rule_hdl, rule_hdl1;
-	ipa_nat_ipv4_rule ipv4_rule = {0}, ipv4_rule1 = {0};
-
-	ipv4_rule.target_ip = RAN_ADDR;
-	ipv4_rule.target_port = RAN_PORT;
-	ipv4_rule.private_ip = RAN_ADDR;
-	ipv4_rule.private_port = RAN_PORT;
-	ipv4_rule.protocol = IPPROTO_TCP;
-	ipv4_rule.public_port = RAN_PORT;
-
-	ipv4_rule1.target_ip = RAN_ADDR;
-	ipv4_rule1.target_port = RAN_PORT;
-	ipv4_rule1.private_ip = RAN_ADDR;
-	ipv4_rule1.private_port = RAN_PORT;
-	ipv4_rule1.protocol = IPPROTO_TCP;
-	ipv4_rule1.public_port = RAN_PORT;
-
-	IPADBG("In\n");
-
-	if ( sep )
-	{
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, nat_mem_type, total_entries, &tbl_hdl);
-		CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-	}
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule1, &rule_hdl1);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	if ( sep )
-	{
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		*tbl_hdl_ptr = 0;
-		CHECK_ERR(ret);
-	}
-
-	IPADBG("Out\n");
-
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test010.c b/ipanat/test/ipa_nat_test010.c
deleted file mode 100644
index aa4c2b7..0000000
--- a/ipanat/test/ipa_nat_test010.c
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (c) 2014, 2018-2019 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test010.c
-
-	@brief
-	Verify the following scenario:
-	1. Add ipv4 table
-	2. add 3 distinct ipv4 rules
-	3. delete first, second followed by last
-	4. Delete ipv4 table
-*/
-/*=========================================================================*/
-
-#include "ipa_nat_test.h"
-
-int ipa_nat_test010(
-	const char* nat_mem_type,
-	u32 pub_ip_add,
-	int total_entries,
-	u32 tbl_hdl,
-	int sep,
-	void* arb_data_ptr)
-{
-	int* tbl_hdl_ptr = (int*) arb_data_ptr;
-	int ret;
-	u32 rule_hdl, rule_hdl1, rule_hdl2;
-	ipa_nat_ipv4_rule ipv4_rule = {0}, ipv4_rule1 = {0}, ipv4_rule2 = {0};
-
-	ipv4_rule.target_ip = RAN_ADDR;
-	ipv4_rule.target_port = RAN_PORT;
-	ipv4_rule.private_ip = RAN_ADDR;
-	ipv4_rule.private_port = RAN_PORT;
-	ipv4_rule.protocol = IPPROTO_TCP;
-	ipv4_rule.public_port = RAN_PORT;
-
-	ipv4_rule1.target_ip = RAN_ADDR;
-	ipv4_rule1.target_port = RAN_PORT;
-	ipv4_rule1.private_ip = RAN_ADDR;
-	ipv4_rule1.private_port = RAN_PORT;
-	ipv4_rule1.protocol = IPPROTO_TCP;
-	ipv4_rule1.public_port = RAN_PORT;
-
-	ipv4_rule2.target_ip = RAN_ADDR;
-	ipv4_rule2.target_port = RAN_PORT;
-	ipv4_rule2.private_ip = RAN_ADDR;
-	ipv4_rule2.private_port = RAN_PORT;
-	ipv4_rule2.protocol = IPPROTO_TCP;
-	ipv4_rule2.public_port = RAN_PORT;
-
-	IPADBG("In\n");
-
-	if ( sep )
-	{
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, nat_mem_type, total_entries, &tbl_hdl);
-		CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-	}
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule1, &rule_hdl1);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule2, &rule_hdl2);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl2);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	if ( sep )
-	{
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		*tbl_hdl_ptr = 0;
-		CHECK_ERR(ret);
-	}
-
-	IPADBG("Out\n");
-
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test011.c b/ipanat/test/ipa_nat_test011.c
deleted file mode 100644
index ab018c7..0000000
--- a/ipanat/test/ipa_nat_test011.c
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (c) 2014, 2018-2019 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test011.cpp
-
-	@brief
-	Verify the following scenario:
-	1. Add ipv4 table
-	2. add 3 distinct ipv4 rules
-	3. delete second, first followed by last
-	4. Delete ipv4 table
-*/
-/*=========================================================================*/
-
-#include "ipa_nat_test.h"
-
-int ipa_nat_test011(
-	const char* nat_mem_type,
-	u32 pub_ip_add,
-	int total_entries,
-	u32 tbl_hdl,
-	int sep,
-	void* arb_data_ptr)
-{
-	int* tbl_hdl_ptr = (int*) arb_data_ptr;
-	int ret;
-	u32 rule_hdl, rule_hdl1, rule_hdl2;
-	ipa_nat_ipv4_rule ipv4_rule = {0}, ipv4_rule1 = {0}, ipv4_rule2 = {0};
-
-	ipv4_rule.target_ip = RAN_ADDR;
-	ipv4_rule.target_port = RAN_PORT;
-	ipv4_rule.private_ip = RAN_ADDR;
-	ipv4_rule.private_port = RAN_PORT;
-	ipv4_rule.protocol = IPPROTO_TCP;
-	ipv4_rule.public_port = RAN_PORT;
-
-	ipv4_rule1.target_ip = RAN_ADDR;
-	ipv4_rule1.target_port = RAN_PORT;
-	ipv4_rule1.private_ip = RAN_ADDR;
-	ipv4_rule1.private_port = RAN_PORT;
-	ipv4_rule1.protocol = IPPROTO_TCP;
-	ipv4_rule1.public_port = RAN_PORT;
-
-	ipv4_rule2.target_ip = RAN_ADDR;
-	ipv4_rule2.target_port = RAN_PORT;
-	ipv4_rule2.private_ip = RAN_ADDR;
-	ipv4_rule2.private_port = RAN_PORT;
-	ipv4_rule2.protocol = IPPROTO_TCP;
-	ipv4_rule2.public_port = RAN_PORT;
-
-	IPADBG("In\n");
-
-	if ( sep )
-	{
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, nat_mem_type, total_entries, &tbl_hdl);
-		CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-	}
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule1, &rule_hdl1);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule2, &rule_hdl2);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl2);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	if ( sep )
-	{
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		*tbl_hdl_ptr = 0;
-		CHECK_ERR(ret);
-	}
-
-	IPADBG("Out\n");
-
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test012.c b/ipanat/test/ipa_nat_test012.c
deleted file mode 100644
index 7abe1c7..0000000
--- a/ipanat/test/ipa_nat_test012.c
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (c) 2014, 2018-2019 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test012.cpp
-
-	@brief
-	Verify the following scenario:
-	1. Add ipv4 table
-	2. add 3 distinct ipv4 rules
-	3. Delete third, second, first
-	4. Delete ipv4 table
-*/
-/*=========================================================================*/
-
-#include "ipa_nat_test.h"
-
-int ipa_nat_test012(
-	const char* nat_mem_type,
-	u32 pub_ip_add,
-	int total_entries,
-	u32 tbl_hdl,
-	int sep,
-	void* arb_data_ptr)
-{
-	int* tbl_hdl_ptr = (int*) arb_data_ptr;
-	int ret;
-	u32 rule_hdl, rule_hdl1, rule_hdl2;
-	ipa_nat_ipv4_rule ipv4_rule = {0}, ipv4_rule1 = {0}, ipv4_rule2 = {0};
-
-	ipv4_rule.target_ip = RAN_ADDR;
-	ipv4_rule.target_port = RAN_PORT;
-	ipv4_rule.private_ip = RAN_ADDR;
-	ipv4_rule.private_port = RAN_PORT;
-	ipv4_rule.protocol = IPPROTO_TCP;
-	ipv4_rule.public_port = RAN_PORT;
-
-	ipv4_rule1.target_ip = RAN_ADDR;
-	ipv4_rule1.target_port = RAN_PORT;
-	ipv4_rule1.private_ip = RAN_ADDR;
-	ipv4_rule1.private_port = RAN_PORT;
-	ipv4_rule1.protocol = IPPROTO_TCP;
-	ipv4_rule1.public_port = RAN_PORT;
-
-	ipv4_rule2.target_ip = RAN_ADDR;
-	ipv4_rule2.target_port = RAN_PORT;
-	ipv4_rule2.private_ip = RAN_ADDR;
-	ipv4_rule2.private_port = RAN_PORT;
-	ipv4_rule2.protocol = IPPROTO_TCP;
-	ipv4_rule2.public_port = RAN_PORT;
-
-	IPADBG("In\n");
-
-	if ( sep )
-	{
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, nat_mem_type, total_entries, &tbl_hdl);
-		CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-	}
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule1, &rule_hdl1);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule2, &rule_hdl2);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl2);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	if ( sep )
-	{
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		*tbl_hdl_ptr = 0;
-		CHECK_ERR(ret);
-	}
-
-	IPADBG("Out\n");
-
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test013.c b/ipanat/test/ipa_nat_test013.c
deleted file mode 100644
index 9d37abc..0000000
--- a/ipanat/test/ipa_nat_test013.c
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (c) 2014, 2018-2019 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test013.cpp
-
-	@brief
-	Verify the following scenario:
-	1. Add ipv4 table
-	2. add 3 distinct ipv4 rules
-	3. Delete third, first and second
-	4. Delete ipv4 table
-*/
-/*=========================================================================*/
-
-#include "ipa_nat_test.h"
-
-int ipa_nat_test013(
-	const char* nat_mem_type,
-	u32 pub_ip_add,
-	int total_entries,
-	u32 tbl_hdl,
-	int sep,
-	void* arb_data_ptr)
-{
-	int* tbl_hdl_ptr = (int*) arb_data_ptr;
-	int ret;
-	u32 rule_hdl, rule_hdl1, rule_hdl2;
-	ipa_nat_ipv4_rule ipv4_rule = {0}, ipv4_rule1 = {0}, ipv4_rule2 = {0};
-
-	ipv4_rule.target_ip = RAN_ADDR;
-	ipv4_rule.target_port = RAN_PORT;
-	ipv4_rule.private_ip = RAN_ADDR;
-	ipv4_rule.private_port = RAN_PORT;
-	ipv4_rule.protocol = IPPROTO_TCP;
-	ipv4_rule.public_port = RAN_PORT;
-
-	ipv4_rule1.target_ip = RAN_ADDR;
-	ipv4_rule1.target_port = RAN_PORT;
-	ipv4_rule1.private_ip = RAN_ADDR;
-	ipv4_rule1.private_port = RAN_PORT;
-	ipv4_rule1.protocol = IPPROTO_TCP;
-	ipv4_rule1.public_port = RAN_PORT;
-
-	ipv4_rule2.target_ip = RAN_ADDR;
-	ipv4_rule2.target_port = RAN_PORT;
-	ipv4_rule2.private_ip = RAN_ADDR;
-	ipv4_rule2.private_port = RAN_PORT;
-	ipv4_rule2.protocol = IPPROTO_TCP;
-	ipv4_rule2.public_port = RAN_PORT;
-
-	IPADBG("In\n");
-
-	if ( sep )
-	{
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, nat_mem_type, total_entries, &tbl_hdl);
-		CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-	}
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule1, &rule_hdl1);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule2, &rule_hdl2);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl2);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	if ( sep )
-	{
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		*tbl_hdl_ptr = 0;
-		CHECK_ERR(ret);
-	}
-
-	IPADBG("Out\n");
-
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test014.c b/ipanat/test/ipa_nat_test014.c
deleted file mode 100644
index 12834ea..0000000
--- a/ipanat/test/ipa_nat_test014.c
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (c) 2014, 2018-2019 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test014.cpp
-	@brief
-	Verify the following scenario:
-	1. Add ipv4 table
-	2. add same 3 ipv rules
-	3. delete first, second and third
-	4. Delete ipv4 table
-*/
-/*=========================================================================*/
-
-#include "ipa_nat_test.h"
-
-int ipa_nat_test014(
-	const char* nat_mem_type,
-	u32 pub_ip_add,
-	int total_entries,
-	u32 tbl_hdl,
-	int sep,
-	void* arb_data_ptr)
-{
-	int* tbl_hdl_ptr = (int*) arb_data_ptr;
-	int ret;
-	u32 rule_hdl1, rule_hdl2, rule_hdl3;
-	ipa_nat_ipv4_rule ipv4_rule = {0};
-
-	ipv4_rule.target_ip = RAN_ADDR;
-	ipv4_rule.target_port = RAN_PORT;
-	ipv4_rule.private_ip = RAN_ADDR;
-	ipv4_rule.private_port = RAN_PORT;
-	ipv4_rule.protocol = IPPROTO_TCP;
-	ipv4_rule.public_port = RAN_PORT;
-
-	IPADBG("In\n");
-
-	if ( sep )
-	{
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, nat_mem_type, total_entries, &tbl_hdl);
-		CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-	}
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl1);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl2);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl3);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl2);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl3);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	if ( sep )
-	{
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		*tbl_hdl_ptr = 0;
-		CHECK_ERR(ret);
-	}
-
-	IPADBG("Out\n");
-
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test015.c b/ipanat/test/ipa_nat_test015.c
deleted file mode 100644
index 0195535..0000000
--- a/ipanat/test/ipa_nat_test015.c
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright (c) 2014, 2018-2019 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test015.cpp
-
-	@brief
-	Verify the following scenario:
-	1. Add ipv4 table
-	2. add same 3 ipv rules
-	3. delete first, third and second
-	4. Delete ipv4 table
-*/
-/*=========================================================================*/
-
-#include "ipa_nat_test.h"
-
-int ipa_nat_test015(
-	const char* nat_mem_type,
-	u32 pub_ip_add,
-	int total_entries,
-	u32 tbl_hdl,
-	int sep,
-	void* arb_data_ptr)
-{
-	int* tbl_hdl_ptr = (int*) arb_data_ptr;
-	int ret;
-	u32 rule_hdl1, rule_hdl2, rule_hdl3;
-	ipa_nat_ipv4_rule ipv4_rule = {0};
-
-	ipv4_rule.target_ip = RAN_ADDR;
-	ipv4_rule.target_port = RAN_PORT;
-
-	ipv4_rule.private_ip = RAN_ADDR;
-	ipv4_rule.private_port = RAN_PORT;
-	ipv4_rule.protocol = IPPROTO_TCP;
-	ipv4_rule.public_port = RAN_PORT;
-
-	IPADBG("In\n");
-
-	if ( sep )
-	{
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, nat_mem_type, total_entries, &tbl_hdl);
-		CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-	}
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl1);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl2);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl3);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl3);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl2);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	if ( sep )
-	{
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		*tbl_hdl_ptr = 0;
-		CHECK_ERR(ret);
-	}
-
-	IPADBG("Out\n");
-
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test016.c b/ipanat/test/ipa_nat_test016.c
deleted file mode 100644
index c5d60b0..0000000
--- a/ipanat/test/ipa_nat_test016.c
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (c) 2014, 2018-2019 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test016.cpp
-
-	@brief
-	Verify the following scenario:
-	1. Add ipv4 table
-	2. add same 3 ipv rules
-	3. delete second, first and third
-	4. Delete ipv4 table
-*/
-/*=========================================================================*/
-
-#include "ipa_nat_test.h"
-
-int ipa_nat_test016(
-	const char* nat_mem_type,
-	u32 pub_ip_add,
-	int total_entries,
-	u32 tbl_hdl,
-	int sep,
-	void* arb_data_ptr)
-{
-	int* tbl_hdl_ptr = (int*) arb_data_ptr;
-	int ret;
-	u32 rule_hdl1, rule_hdl2, rule_hdl3;
-	ipa_nat_ipv4_rule ipv4_rule = {0};
-
-	ipv4_rule.target_ip = RAN_ADDR;
-	ipv4_rule.target_port = RAN_PORT;
-	ipv4_rule.private_ip = RAN_ADDR;
-	ipv4_rule.private_port = RAN_PORT;
-	ipv4_rule.protocol = IPPROTO_TCP;
-	ipv4_rule.public_port = RAN_PORT;
-
-	IPADBG("In\n");
-
-	if ( sep )
-	{
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, nat_mem_type, total_entries, &tbl_hdl);
-		CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-	}
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl1);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl2);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl3);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl2);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl3);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	if ( sep )
-	{
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		*tbl_hdl_ptr = 0;
-		CHECK_ERR(ret);
-	}
-
-	IPADBG("Out\n");
-
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test017.c b/ipanat/test/ipa_nat_test017.c
deleted file mode 100644
index a3ea014..0000000
--- a/ipanat/test/ipa_nat_test017.c
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (c) 2014, 2018-2019 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test017.cpp
-
-	@brief
-	Verify the following scenario:
-	1. Add ipv4 table
-	2. add same 3 ipv rules
-	3. delete second, third and first
-	4. Delete ipv4 table
-*/
-/*=========================================================================*/
-
-#include "ipa_nat_test.h"
-
-int ipa_nat_test017(
-	const char* nat_mem_type,
-	u32 pub_ip_add,
-	int total_entries,
-	u32 tbl_hdl,
-	int sep,
-	void* arb_data_ptr)
-{
-	int* tbl_hdl_ptr = (int*) arb_data_ptr;
-	int ret;
-	u32 rule_hdl1, rule_hdl2, rule_hdl3;
-	ipa_nat_ipv4_rule ipv4_rule = {0};
-
-	ipv4_rule.target_ip = RAN_ADDR;
-	ipv4_rule.target_port = RAN_PORT;
-	ipv4_rule.private_ip = RAN_ADDR;
-	ipv4_rule.private_port = RAN_PORT;
-	ipv4_rule.protocol = IPPROTO_TCP;
-	ipv4_rule.public_port = RAN_PORT;
-
-	IPADBG("In\n");
-
-	if ( sep )
-	{
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, nat_mem_type, total_entries, &tbl_hdl);
-		CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-	}
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl1);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl2);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl3);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl2);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl3);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	if ( sep )
-	{
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		*tbl_hdl_ptr = 0;
-		CHECK_ERR(ret);
-	}
-
-	IPADBG("Out\n");
-
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test018.c b/ipanat/test/ipa_nat_test018.c
deleted file mode 100644
index 63cbfac..0000000
--- a/ipanat/test/ipa_nat_test018.c
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (c) 2014, 2018-2019 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test018.c
-
-	@brief
-	Verify the following scenario:
-	1. Add ipv4 table
-	2. add same 3 ipv rules
-	3. delete third, second and first
-	4. Delete ipv4 table
-*/
-/*=========================================================================*/
-
-#include "ipa_nat_test.h"
-
-int ipa_nat_test018(
-	const char* nat_mem_type,
-	u32 pub_ip_add,
-	int total_entries,
-	u32 tbl_hdl,
-	int sep,
-	void* arb_data_ptr)
-{
-	int* tbl_hdl_ptr = (int*) arb_data_ptr;
-	int ret;
-	u32 rule_hdl1, rule_hdl2, rule_hdl3;
-	ipa_nat_ipv4_rule ipv4_rule = {0};
-
-	ipv4_rule.target_ip = RAN_ADDR;
-	ipv4_rule.target_port = RAN_PORT;
-	ipv4_rule.private_ip = RAN_ADDR;
-	ipv4_rule.private_port = RAN_PORT;
-	ipv4_rule.protocol = IPPROTO_TCP;
-	ipv4_rule.public_port = RAN_PORT;
-
-	IPADBG("In\n");
-
-	if ( sep )
-	{
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, nat_mem_type, total_entries, &tbl_hdl);
-		CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-	}
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl1);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl2);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl3);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl3);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl2);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	if ( sep )
-	{
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		*tbl_hdl_ptr = 0;
-		CHECK_ERR(ret);
-	}
-
-	IPADBG("Out\n");
-
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test019.c b/ipanat/test/ipa_nat_test019.c
deleted file mode 100644
index a6d700f..0000000
--- a/ipanat/test/ipa_nat_test019.c
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (c) 2014, 2018-2019 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test019.c
-
-	@brief
-	Verify the following scenario:
-	1. Add ipv4 table
-	2. add same 3 ipv rules
-	3. delete third, first and second
-	4. Delete ipv4 table
-*/
-/*=========================================================================*/
-
-#include "ipa_nat_test.h"
-
-int ipa_nat_test019(
-	const char* nat_mem_type,
-	u32 pub_ip_add,
-	int total_entries,
-	u32 tbl_hdl,
-	int sep,
-	void* arb_data_ptr)
-{
-	int* tbl_hdl_ptr = (int*) arb_data_ptr;
-	int ret;
-	u32 rule_hdl1, rule_hdl2, rule_hdl3;
-	ipa_nat_ipv4_rule ipv4_rule = {0};
-
-	ipv4_rule.target_ip = RAN_ADDR;
-	ipv4_rule.target_port = RAN_PORT;
-	ipv4_rule.private_ip = RAN_ADDR;
-	ipv4_rule.private_port = RAN_PORT;
-	ipv4_rule.protocol = IPPROTO_TCP;
-	ipv4_rule.public_port = RAN_PORT;
-
-	IPADBG("In\n");
-
-	if ( sep )
-	{
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, nat_mem_type, total_entries, &tbl_hdl);
-		CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-	}
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl1);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl2);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl3);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl3);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl2);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	if ( sep )
-	{
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		*tbl_hdl_ptr = 0;
-		CHECK_ERR(ret);
-	}
-
-	IPADBG("Out\n");
-
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test020.c b/ipanat/test/ipa_nat_test020.c
deleted file mode 100644
index e9f89a8..0000000
--- a/ipanat/test/ipa_nat_test020.c
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (c) 2014, 2018-2019 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test020.c
-
-	@brief
-	Verify the following scenario:
-	1. Add ipv4 table
-	2. add same 4 ipv rules
-	3. delete third, second, fourth and first
-	4. Delete ipv4 table
-*/
-/*=========================================================================*/
-
-#include "ipa_nat_test.h"
-
-int ipa_nat_test020(
-	const char* nat_mem_type,
-	u32 pub_ip_add,
-	int total_entries,
-	u32 tbl_hdl,
-	int sep,
-	void* arb_data_ptr)
-{
-	int* tbl_hdl_ptr = (int*) arb_data_ptr;
-	int ret;
-	u32 rule_hdl1, rule_hdl2, rule_hdl3, rule_hdl4;
-	ipa_nat_ipv4_rule ipv4_rule = {0};
-
-	ipv4_rule.target_ip = RAN_ADDR;
-	ipv4_rule.target_port = RAN_PORT;
-	ipv4_rule.private_ip = RAN_ADDR;
-	ipv4_rule.private_port = RAN_PORT;
-	ipv4_rule.protocol = IPPROTO_TCP;
-	ipv4_rule.public_port = RAN_PORT;
-
-	IPADBG("In\n");
-
-	if ( sep )
-	{
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, nat_mem_type, total_entries, &tbl_hdl);
-		CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-	}
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl1);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl2);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl3);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl4);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl3);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl2);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl4);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	if ( sep )
-	{
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		*tbl_hdl_ptr = 0;
-		CHECK_ERR(ret);
-	}
-
-	IPADBG("Out\n");
-
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test021.c b/ipanat/test/ipa_nat_test021.c
deleted file mode 100644
index abe712d..0000000
--- a/ipanat/test/ipa_nat_test021.c
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright (c) 2014-2019 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test021.cpp
-
-	@brief
-	Verify the following scenario:
-	1. Add ipv4 table
-	2. add same 3 ipv rules
-	3. delete Head and last entry
-	4. add 2 new same ip4 entries
-	5. Add head entry again
-	6. Delete ipv4 table
-*/
-/*=========================================================================*/
-
-#include "ipa_nat_test.h"
-
-int ipa_nat_test021(
-	const char* nat_mem_type,
-	u32 pub_ip_add,
-	int total_entries,
-	u32 tbl_hdl,
-	int sep,
-	void* arb_data_ptr)
-{
-	int* tbl_hdl_ptr = (int*) arb_data_ptr;
-	int ret;
-	u32 rule_hdl1, rule_hdl2, rule_hdl3;
-	ipa_nat_ipv4_rule ipv4_rule = {0}, ipv4_rule2 = {0};
-	u32 rule_hdl21, rule_hdl22;
-
-	/* Rule 1 */
-	ipv4_rule.target_ip = RAN_ADDR;
-	ipv4_rule.target_port = RAN_PORT;
-	ipv4_rule.private_ip = RAN_ADDR;
-	ipv4_rule.private_port = RAN_PORT;
-	ipv4_rule.protocol = IPPROTO_TCP;
-	ipv4_rule.public_port = RAN_PORT;
-
-	/* Rule 2*/
-	ipv4_rule.target_ip = RAN_ADDR;
-	ipv4_rule.target_port = RAN_PORT;
-	ipv4_rule.private_ip = RAN_ADDR;
-	ipv4_rule.private_port = RAN_PORT;
-	ipv4_rule.protocol = IPPROTO_UDP;
-	ipv4_rule.public_port = RAN_PORT;
-
-	IPADBG("In\n");
-
-	if ( sep )
-	{
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, nat_mem_type, total_entries, &tbl_hdl);
-		CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-	}
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl1);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl2);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl3);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	/* Delete head entry */
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	/* Delete Last Entry */
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl3);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	/* Add 2 different Entries */
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule2, &rule_hdl21);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule2, &rule_hdl22);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	/* Add first entry again */
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl3);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	if ( sep )
-	{
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		*tbl_hdl_ptr = 0;
-		CHECK_ERR(ret);
-	}
-
-	IPADBG("Out\n");
-
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test022.c b/ipanat/test/ipa_nat_test022.c
deleted file mode 100644
index fdf1efc..0000000
--- a/ipanat/test/ipa_nat_test022.c
+++ /dev/null
@@ -1,299 +0,0 @@
-/*
- * Copyright (c) 2014, 2018-2019 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test022.c
-
-	@brief
-	Note: Verify the following scenario:
-	1. Add ipv4 table
-	2. Add ipv4 rules till filled
-	3. Print stats
-	4. Delete ipv4 table
-*/
-/*=========================================================================*/
-
-#include "ipa_nat_test.h"
-
-int ipa_nat_test022(
-	const char* nat_mem_type,
-	u32 pub_ip_add,
-	int total_entries,
-	u32 tbl_hdl,
-	int sep,
-	void* arb_data_ptr)
-{
-	int* tbl_hdl_ptr = (int*) arb_data_ptr;
-
-	ipa_nat_ipv4_rule  ipv4_rule;
-	u32                rule_hdls[2048];
-
-	ipa_nati_tbl_stats nstats, last_nstats;
-	ipa_nati_tbl_stats istats, last_istats;
-
-	u32                i, tot;
-
-	bool               switched = false;
-
-	const char*        mem_type;
-
-	int ret;
-
-	IPADBG("In\n");
-
-	if ( sep )
-	{
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, nat_mem_type, total_entries, &tbl_hdl);
-		CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-	}
-
-	ret = ipa_nati_clear_ipv4_tbl(tbl_hdl);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nati_ipv4_tbl_stats(tbl_hdl, &nstats, &istats);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	IPAINFO("Attempting rule adds to %s table of size: (%u)\n",
-			ipa3_nat_mem_in_as_str(nstats.nmi),
-			nstats.tot_ents);
-
-	last_nstats = nstats;
-	last_istats = istats;
-
-	memset(rule_hdls, 0, sizeof(rule_hdls));
-
-	for ( i = tot = 0; i < array_sz(rule_hdls); i++ )
-	{
-		IPADBG("Trying %d ipa_nat_add_ipv4_rule()\n", i);
-
-		memset(&ipv4_rule, 0, sizeof(ipv4_rule));
-
-		ipv4_rule.protocol     = IPPROTO_TCP;
-		ipv4_rule.public_port  = RAN_PORT;
-		ipv4_rule.target_ip    = RAN_ADDR;
-		ipv4_rule.target_port  = RAN_PORT;
-		ipv4_rule.private_ip   = RAN_ADDR;
-		ipv4_rule.private_port = RAN_PORT;
-
-		ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdls[i]);
-		CHECK_ERR_TBL_ACTION(ret, tbl_hdl, break);
-
-		IPADBG("Success %d ipa_nat_add_ipv4_rule() -> rule_hdl(0x%08X)\n",
-			   i, rule_hdls[i]);
-
-		ret = ipa_nati_ipv4_tbl_stats(tbl_hdl, &nstats, &istats);
-		CHECK_ERR_TBL_ACTION(ret, tbl_hdl, break);
-
-		/*
-		 * Are we in hybrid mode and have we switched memory type?
-		 * Check for it and print the appropriate stats.
-		 */
-		if ( nstats.nmi != last_nstats.nmi )
-		{
-			mem_type = ipa3_nat_mem_in_as_str(last_nstats.nmi);
-
-			switched = true;
-
-			/*
-			 * NAT table stats...
-			 */
-			IPAINFO("Able to add (%u) records to %s "
-					"NAT table of size (%u) or (%f) percent\n",
-					tot,
-					mem_type,
-					last_nstats.tot_ents,
-					((float) tot / (float) last_nstats.tot_ents) * 100.0);
-
-			IPAINFO("Able to add (%u) records to %s "
-					"NAT BASE table of size (%u) or (%f) percent\n",
-					last_nstats.tot_base_ents_filled,
-					mem_type,
-					last_nstats.tot_base_ents,
-					((float) last_nstats.tot_base_ents_filled /
-					 (float) last_nstats.tot_base_ents) * 100.0);
-
-			IPAINFO("Able to add (%u) records to %s "
-					"NAT EXPN table of size (%u) or (%f) percent\n",
-					last_nstats.tot_expn_ents_filled,
-					mem_type,
-					last_nstats.tot_expn_ents,
-					((float) last_nstats.tot_expn_ents_filled /
-					 (float) last_nstats.tot_expn_ents) * 100.0);
-
-			IPAINFO("%s NAT table chains: tot_chains(%u) min_len(%u) max_len(%u) avg_len(%f)\n",
-					mem_type,
-					last_nstats.tot_chains,
-					last_nstats.min_chain_len,
-					last_nstats.max_chain_len,
-					last_nstats.avg_chain_len);
-
-			/*
-			 * INDEX table stats...
-			 */
-			IPAINFO("Able to add (%u) records to %s "
-					"IDX table of size (%u) or (%f) percent\n",
-					tot,
-					mem_type,
-					last_istats.tot_ents,
-					((float) tot / (float) last_istats.tot_ents) * 100.0);
-
-			IPAINFO("Able to add (%u) records to %s "
-					"IDX BASE table of size (%u) or (%f) percent\n",
-					last_istats.tot_base_ents_filled,
-					mem_type,
-					last_istats.tot_base_ents,
-					((float) last_istats.tot_base_ents_filled /
-					 (float) last_istats.tot_base_ents) * 100.0);
-
-			IPAINFO("Able to add (%u) records to %s "
-					"IDX EXPN table of size (%u) or (%f) percent\n",
-					last_istats.tot_expn_ents_filled,
-					mem_type,
-					last_istats.tot_expn_ents,
-					((float) last_istats.tot_expn_ents_filled /
-					 (float) last_istats.tot_expn_ents) * 100.0);
-
-			IPAINFO("%s IDX table chains: tot_chains(%u) min_len(%u) max_len(%u) avg_len(%f)\n",
-					mem_type,
-					last_istats.tot_chains,
-					last_istats.min_chain_len,
-					last_istats.max_chain_len,
-					last_istats.avg_chain_len);
-		}
-
-		last_nstats = nstats;
-		last_istats = istats;
-
-		if ( switched )
-		{
-			switched = false;
-
-			IPAINFO("Continuing rule adds to %s table of size: (%u)\n",
-					ipa3_nat_mem_in_as_str(nstats.nmi),
-					nstats.tot_ents);
-		}
-
-		tot++;
-	}
-
-	ret = ipa_nati_ipv4_tbl_stats(tbl_hdl, &nstats, &istats);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	mem_type = ipa3_nat_mem_in_as_str(nstats.nmi);
-
-	/*
-	 * NAT table stats...
-	 */
-	IPAINFO("Able to add (%u) records to %s "
-			"NAT table of size (%u) or (%f) percent\n",
-			tot,
-			mem_type,
-			nstats.tot_ents,
-			((float) tot / (float) nstats.tot_ents) * 100.0);
-
-	IPAINFO("Able to add (%u) records to %s "
-			"NAT BASE table of size (%u) or (%f) percent\n",
-			nstats.tot_base_ents_filled,
-			mem_type,
-			nstats.tot_base_ents,
-			((float) nstats.tot_base_ents_filled /
-			 (float) nstats.tot_base_ents) * 100.0);
-
-	IPAINFO("Able to add (%u) records to %s "
-			"NAT EXPN table of size (%u) or (%f) percent\n",
-			nstats.tot_expn_ents_filled,
-			mem_type,
-			nstats.tot_expn_ents,
-			((float) nstats.tot_expn_ents_filled /
-			 (float) nstats.tot_expn_ents) * 100.0);
-
-	IPAINFO("%s NAT table chains: tot_chains(%u) min_len(%u) max_len(%u) avg_len(%f)\n",
-			mem_type,
-			nstats.tot_chains,
-			nstats.min_chain_len,
-			nstats.max_chain_len,
-			nstats.avg_chain_len);
-
-	/*
-	 * INDEX table stats...
-	 */
-	IPAINFO("Able to add (%u) records to %s "
-			"IDX table of size (%u) or (%f) percent\n",
-			tot,
-			mem_type,
-			istats.tot_ents,
-			((float) tot / (float) istats.tot_ents) * 100.0);
-
-	IPAINFO("Able to add (%u) records to %s "
-			"IDX BASE table of size (%u) or (%f) percent\n",
-			istats.tot_base_ents_filled,
-			mem_type,
-			istats.tot_base_ents,
-			((float) istats.tot_base_ents_filled /
-			 (float) istats.tot_base_ents) * 100.0);
-
-	IPAINFO("Able to add (%u) records to %s "
-			"IDX EXPN table of size (%u) or (%f) percent\n",
-			istats.tot_expn_ents_filled,
-			mem_type,
-			istats.tot_expn_ents,
-			((float) istats.tot_expn_ents_filled /
-			 (float) istats.tot_expn_ents) * 100.0);
-
-	IPAINFO("%s IDX table chains: tot_chains(%u) min_len(%u) max_len(%u) avg_len(%f)\n",
-			mem_type,
-			istats.tot_chains,
-			istats.min_chain_len,
-			istats.max_chain_len,
-			istats.avg_chain_len);
-
-	IPAINFO("Deleting all rules\n");
-
-	for ( i = 0; i < tot; i++ )
-	{
-		IPADBG("Trying %d ipa_nat_del_ipv4_rule(0x%08X)\n",
-			   i, rule_hdls[i]);
-		ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdls[i]);
-		CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-		IPADBG("Success ipa_nat_del_ipv4_rule(%d)\n", i);
-	}
-
-	if ( sep )
-	{
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		*tbl_hdl_ptr = 0;
-		CHECK_ERR(ret);
-	}
-
-	IPADBG("Out\n");
-
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test023.c b/ipanat/test/ipa_nat_test023.c
deleted file mode 100644
index 7a42247..0000000
--- a/ipanat/test/ipa_nat_test023.c
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright (c) 2019 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test023.c
-
-	@brief
-	Verify the following scenario:
-	1. Add ipv4 table
-	2. Add ipv rule three times to cause collisions and linking
-	3. Delete rules in a particular order and observe list for expected
-	   form
-	4. Run 2 and 3 over and over until all delete cominations have been
-	   run
-	5. Delete ipv4 table
-*/
-/*=========================================================================*/
-
-#include "ipa_nat_test.h"
-
-int ipa_nat_test023(
-	const char* nat_mem_type,
-	u32 pub_ip_add,
-	int total_entries,
-	u32 tbl_hdl,
-	int sep,
-	void* arb_data_ptr)
-{
-	int* tbl_hdl_ptr = (int*) arb_data_ptr;
-
-	ipa_nat_ipv4_rule ipv4_rule = {0};
-
-	u32 rule_hdl1;
-	u32 rule_hdl2;
-	u32 rule_hdl3;
-
-	u32* rule_del_combos[6][3] = {
-		{ &rule_hdl1, &rule_hdl2, &rule_hdl3 },
-		{ &rule_hdl1, &rule_hdl3, &rule_hdl2 },
-
-		{ &rule_hdl2, &rule_hdl1, &rule_hdl3 },
-		{ &rule_hdl2, &rule_hdl3, &rule_hdl1 },
-
-		{ &rule_hdl3, &rule_hdl1, &rule_hdl2 },
-		{ &rule_hdl3, &rule_hdl2, &rule_hdl1 },
-	};
-
-	int i, j, ret;
-
-	ipv4_rule.target_ip    = RAN_ADDR;
-	ipv4_rule.target_port  = RAN_PORT;
-	ipv4_rule.private_ip   = RAN_ADDR;
-	ipv4_rule.private_port = RAN_PORT;
-	ipv4_rule.protocol     = IPPROTO_TCP;
-	ipv4_rule.public_port  = RAN_PORT;
-
-	IPADBG("In\n");
-
-	if ( sep )
-	{
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, nat_mem_type, total_entries, &tbl_hdl);
-		CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-	}
-
-	for ( i = 0; i < 6; i++ )
-	{
-		IPADBG("Adding rule 1\n");
-		ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl1);
-		CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-		IPADBG("Adding rule 2\n");
-		ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl2);
-		CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-		IPADBG("Adding rule 3\n");
-		ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl3);
-		CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-		ipa_nat_dump_ipv4_table(tbl_hdl);
-
-		for ( j = 0; j < 3; j++ )
-		{
-			u32* rh_ptr = rule_del_combos[i][j];
-
-			IPADBG("Deleting rule %u\n",
-				   ( rh_ptr == &rule_hdl1 ) ? 1 :
-				   ( rh_ptr == &rule_hdl2 ) ? 2 : 3);
-
-			ret = ipa_nat_del_ipv4_rule(tbl_hdl, *rh_ptr);
-			CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-			ipa_nat_dump_ipv4_table(tbl_hdl);
-		}
-	}
-
-	if ( sep )
-	{
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		*tbl_hdl_ptr = 0;
-		CHECK_ERR(ret);
-	}
-
-	IPADBG("Out\n");
-
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test024.c b/ipanat/test/ipa_nat_test024.c
deleted file mode 100644
index aeb1af4..0000000
--- a/ipanat/test/ipa_nat_test024.c
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright (c) 2019 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test024.c
-
-	@brief
-	Verify the following scenario:
-	1. Trigger thousands of table memory switches
-
-*/
-/*===========================================================================*/
-
-#include "ipa_nat_test.h"
-
-int ipa_nat_test024(
-	const char* nat_mem_type,
-	u32 pub_ip_add,
-	int total_entries,
-	u32 tbl_hdl,
-	int sep,
-	void* arb_data_ptr)
-{
-	int* tbl_hdl_ptr = (int*) arb_data_ptr;
-
-	int i, ret;
-
-	IPADBG("In\n");
-
-	if ( sep )
-	{
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, nat_mem_type, total_entries, &tbl_hdl);
-		CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-	}
-
-	for ( i = 0; i < 1000; i++ )
-	{
-		ret = ipa_nat_test022(
-			nat_mem_type, pub_ip_add, total_entries, tbl_hdl, !sep, arb_data_ptr);
-		CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-	}
-
-	if ( sep )
-	{
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		*tbl_hdl_ptr = 0;
-		CHECK_ERR(ret);
-	}
-
-	IPADBG("Out\n");
-
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test025.c b/ipanat/test/ipa_nat_test025.c
deleted file mode 100644
index 71ddebe..0000000
--- a/ipanat/test/ipa_nat_test025.c
+++ /dev/null
@@ -1,362 +0,0 @@
-/*
- * Copyright (c) 2019 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test025.c
-
-	@brief
-	Note: Verify the following scenario:
-	1. Similare to test022, but with random deletes during adds
-*/
-/*=========================================================================*/
-
-#include "ipa_nat_test.h"
-
-#undef  VALID_RULE
-#define VALID_RULE(r) ((r) != 0 && (r) != 0xFFFFFFFF)
-
-#undef GET_MAX
-#define GET_MAX(ram, rdm) \
-	do { \
-		while ( (ram = rand() % 20) < 4); \
-		while ( (rdm = rand() % 10) >= ram || rdm == 0 ); \
-		IPADBG("rand_adds_max(%u) rand_dels_max(%u)\n", ram, rdm); \
-	} while (0)
-
-int ipa_nat_test025(
-	const char* nat_mem_type,
-	u32 pub_ip_add,
-	int total_entries,
-	u32 tbl_hdl,
-	int sep,
-	void* arb_data_ptr)
-{
-	int* tbl_hdl_ptr = (int*) arb_data_ptr;
-
-	ipa_nat_ipv4_rule  ipv4_rule;
-	u32                rule_hdls[1024];
-
-	ipa_nati_tbl_stats nstats, last_nstats;
-	ipa_nati_tbl_stats istats, last_istats;
-
-	u32                i;
-	u32                rand_adds_max, rand_dels_max;
-	u32                tot, tot_added, tot_deleted;
-
-	bool               switched = false;
-
-	const char*        mem_type;
-
-	int ret;
-
-	IPADBG("In\n");
-
-	if ( sep )
-	{
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, nat_mem_type, total_entries, &tbl_hdl);
-		CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-	}
-
-	ret = ipa_nati_clear_ipv4_tbl(tbl_hdl);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	ret = ipa_nati_ipv4_tbl_stats(tbl_hdl, &nstats, &istats);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	IPAINFO("Attempting rule adds to %s table of size: (%u)\n",
-			ipa3_nat_mem_in_as_str(nstats.nmi),
-			nstats.tot_ents);
-
-	last_nstats = nstats;
-	last_istats = istats;
-
-	memset(rule_hdls, 0, sizeof(rule_hdls));
-
-	GET_MAX(rand_adds_max, rand_dels_max);
-
-	tot = tot_added = tot_deleted = 0;
-
-	for ( i = 0; i < array_sz(rule_hdls); i++ )
-	{
-		IPADBG("Trying %u ipa_nat_add_ipv4_rule()\n", i);
-
-		memset(&ipv4_rule, 0, sizeof(ipv4_rule));
-
-		ipv4_rule.protocol     = IPPROTO_TCP;
-		ipv4_rule.public_port  = RAN_PORT;
-		ipv4_rule.target_ip    = RAN_ADDR;
-		ipv4_rule.target_port  = RAN_PORT;
-		ipv4_rule.private_ip   = RAN_ADDR;
-		ipv4_rule.private_port = RAN_PORT;
-
-		ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdls[i]);
-		CHECK_ERR_TBL_ACTION(ret, tbl_hdl, break);
-
-		IPADBG("Success %u ipa_nat_add_ipv4_rule() -> rule_hdl(0x%08X)\n",
-			   i, rule_hdls[i]);
-
-		ret = ipa_nati_ipv4_tbl_stats(tbl_hdl, &nstats, &istats);
-		CHECK_ERR_TBL_ACTION(ret, tbl_hdl, break);
-
-		/*
-		 * Are we in hybrid mode and have we switched memory type?
-		 * Check for it and print the appropriate stats.
-		 */
-		if ( nstats.nmi != last_nstats.nmi )
-		{
-			mem_type = ipa3_nat_mem_in_as_str(last_nstats.nmi);
-
-			switched = true;
-
-			/*
-			 * NAT table stats...
-			 */
-			IPAINFO("Able to add (%u) records to %s "
-					"NAT table of size (%u) or (%f) percent\n",
-					tot,
-					mem_type,
-					last_nstats.tot_ents,
-					((float) tot / (float) last_nstats.tot_ents) * 100.0);
-
-			IPAINFO("Able to add (%u) records to %s "
-					"NAT BASE table of size (%u) or (%f) percent\n",
-					last_nstats.tot_base_ents_filled,
-					mem_type,
-					last_nstats.tot_base_ents,
-					((float) last_nstats.tot_base_ents_filled /
-					 (float) last_nstats.tot_base_ents) * 100.0);
-
-			IPAINFO("Able to add (%u) records to %s "
-					"NAT EXPN table of size (%u) or (%f) percent\n",
-					last_nstats.tot_expn_ents_filled,
-					mem_type,
-					last_nstats.tot_expn_ents,
-					((float) last_nstats.tot_expn_ents_filled /
-					 (float) last_nstats.tot_expn_ents) * 100.0);
-
-			IPAINFO("%s NAT table chains: tot_chains(%u) min_len(%u) max_len(%u) avg_len(%f)\n",
-					mem_type,
-					last_nstats.tot_chains,
-					last_nstats.min_chain_len,
-					last_nstats.max_chain_len,
-					last_nstats.avg_chain_len);
-
-			/*
-			 * INDEX table stats...
-			 */
-			IPAINFO("Able to add (%u) records to %s "
-					"IDX table of size (%u) or (%f) percent\n",
-					tot,
-					mem_type,
-					last_istats.tot_ents,
-					((float) tot / (float) last_istats.tot_ents) * 100.0);
-
-			IPAINFO("Able to add (%u) records to %s "
-					"IDX BASE table of size (%u) or (%f) percent\n",
-					last_istats.tot_base_ents_filled,
-					mem_type,
-					last_istats.tot_base_ents,
-					((float) last_istats.tot_base_ents_filled /
-					 (float) last_istats.tot_base_ents) * 100.0);
-
-			IPAINFO("Able to add (%u) records to %s "
-					"IDX EXPN table of size (%u) or (%f) percent\n",
-					last_istats.tot_expn_ents_filled,
-					mem_type,
-					last_istats.tot_expn_ents,
-					((float) last_istats.tot_expn_ents_filled /
-					 (float) last_istats.tot_expn_ents) * 100.0);
-
-			IPAINFO("%s IDX table chains: tot_chains(%u) min_len(%u) max_len(%u) avg_len(%f)\n",
-					mem_type,
-					last_istats.tot_chains,
-					last_istats.min_chain_len,
-					last_istats.max_chain_len,
-					last_istats.avg_chain_len);
-		}
-
-		last_nstats = nstats;
-		last_istats = istats;
-
-		tot++;
-
-		if ( ++tot_added == rand_adds_max )
-		{
-			u32  j, k;
-			u32* hdl_ptr[tot];
-
-			for ( j = k = 0; j < array_sz(rule_hdls); j++ )
-			{
-				if ( VALID_RULE(rule_hdls[j]) )
-				{
-					hdl_ptr[k] = &(rule_hdls[j]);
-
-					if ( ++k == tot )
-					{
-						break;
-					}
-				}
-			}
-
-			IPADBG("About to delete %u rules\n", rand_dels_max);
-
-			while ( k )
-			{
-				while ( j = rand() % k, ! VALID_RULE(*(hdl_ptr[j])) );
-
-				IPADBG("Trying ipa_nat_del_ipv4_rule(0x%08X)\n",
-					   *(hdl_ptr[j]));
-
-				ret = ipa_nat_del_ipv4_rule(tbl_hdl, *(hdl_ptr[j]));
-				CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-				IPADBG("Success ipa_nat_del_ipv4_rule(0x%08X)\n", *(hdl_ptr[j]));
-
-				*(hdl_ptr[j]) = 0xFFFFFFFF;
-
-				--tot;
-
-				if ( ++tot_deleted == rand_dels_max )
-				{
-					break;
-				}
-			}
-
-			GET_MAX(rand_adds_max, rand_dels_max);
-
-			tot_added = tot_deleted = 0;
-		}
-
-		if ( switched )
-		{
-			switched = false;
-
-			IPAINFO("Continuing rule adds to %s table of size: (%u)\n",
-					ipa3_nat_mem_in_as_str(nstats.nmi),
-					nstats.tot_ents);
-		}
-	}
-
-	ret = ipa_nati_ipv4_tbl_stats(tbl_hdl, &nstats, &istats);
-	CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-	mem_type = ipa3_nat_mem_in_as_str(nstats.nmi);
-
-	/*
-	 * NAT table stats...
-	 */
-	IPAINFO("Able to add (%u) records to %s "
-			"NAT table of size (%u) or (%f) percent\n",
-			tot,
-			mem_type,
-			nstats.tot_ents,
-			((float) tot / (float) nstats.tot_ents) * 100.0);
-
-	IPAINFO("Able to add (%u) records to %s "
-			"NAT BASE table of size (%u) or (%f) percent\n",
-			nstats.tot_base_ents_filled,
-			mem_type,
-			nstats.tot_base_ents,
-			((float) nstats.tot_base_ents_filled /
-			 (float) nstats.tot_base_ents) * 100.0);
-
-	IPAINFO("Able to add (%u) records to %s "
-			"NAT EXPN table of size (%u) or (%f) percent\n",
-			nstats.tot_expn_ents_filled,
-			mem_type,
-			nstats.tot_expn_ents,
-			((float) nstats.tot_expn_ents_filled /
-			 (float) nstats.tot_expn_ents) * 100.0);
-
-	IPAINFO("%s NAT table chains: tot_chains(%u) min_len(%u) max_len(%u) avg_len(%f)\n",
-			mem_type,
-			nstats.tot_chains,
-			nstats.min_chain_len,
-			nstats.max_chain_len,
-			nstats.avg_chain_len);
-
-	/*
-	 * INDEX table stats...
-	 */
-	IPAINFO("Able to add (%u) records to %s "
-			"IDX table of size (%u) or (%f) percent\n",
-			tot,
-			mem_type,
-			istats.tot_ents,
-			((float) tot / (float) istats.tot_ents) * 100.0);
-
-	IPAINFO("Able to add (%u) records to %s "
-			"IDX BASE table of size (%u) or (%f) percent\n",
-			istats.tot_base_ents_filled,
-			mem_type,
-			istats.tot_base_ents,
-			((float) istats.tot_base_ents_filled /
-			 (float) istats.tot_base_ents) * 100.0);
-
-	IPAINFO("Able to add (%u) records to %s "
-			"IDX EXPN table of size (%u) or (%f) percent\n",
-			istats.tot_expn_ents_filled,
-			mem_type,
-			istats.tot_expn_ents,
-			((float) istats.tot_expn_ents_filled /
-			 (float) istats.tot_expn_ents) * 100.0);
-
-	IPAINFO("%s IDX table chains: tot_chains(%u) min_len(%u) max_len(%u) avg_len(%f)\n",
-			mem_type,
-			istats.tot_chains,
-			istats.min_chain_len,
-			istats.max_chain_len,
-			istats.avg_chain_len);
-
-	IPAINFO("Deleting remaining rules\n");
-
-	for ( i = 0; i < array_sz(rule_hdls); i++ )
-	{
-		if ( VALID_RULE(rule_hdls[i]) )
-		{
-			IPADBG("Trying ipa_nat_del_ipv4_rule(0x%08X)\n",
-				   rule_hdls[i]);
-			ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdls[i]);
-			CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-			IPADBG("Success ipa_nat_del_ipv4_rule(%u)\n", rule_hdls[i]);
-		}
-	}
-
-	if ( sep )
-	{
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		*tbl_hdl_ptr = 0;
-		CHECK_ERR(ret);
-	}
-
-	IPADBG("Out\n");
-
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test999.c b/ipanat/test/ipa_nat_test999.c
deleted file mode 100644
index ba213d8..0000000
--- a/ipanat/test/ipa_nat_test999.c
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (c) 2019 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test999.c
-
-	@brief
-	Verify the following scenario:
-	1. Delete ipv4 table
-*/
-/*===========================================================================*/
-
-#include "ipa_nat_test.h"
-
-int ipa_nat_test999(
-	const char* nat_mem_type,
-	u32 pub_ip_add,
-	int total_entries,
-	u32 tbl_hdl,
-	int sep,
-	void* arb_data_ptr)
-{
-	int* tbl_hdl_ptr = (int*) arb_data_ptr;
-	int ret;
-
-	IPADBG("In\n");
-
-	if ( ! sep )
-	{
-		IPADBG("calling ipa_nat_del_ipv4_tbl()\n");
-
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-
-		*tbl_hdl_ptr = 0;
-
-		CHECK_ERR(ret);
-
-		IPADBG("deleted ipv4 nat table successfully.\n");
-	}
-
-	IPADBG("Out\n");
-
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_testMODEL.c b/ipanat/test/ipa_nat_testMODEL.c
deleted file mode 100644
index 218b1cf..0000000
--- a/ipanat/test/ipa_nat_testMODEL.c
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (c) 2019 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_testXXX.c
-
-	@brief
-	Verify the following scenario:
-
-*/
-/*===========================================================================*/
-
-#include "ipa_nat_test.h"
-
-int ipa_nat_testXXX(
-	const char* nat_mem_type,
-	u32 pub_ip_add,
-	int total_entries,
-	u32 tbl_hdl,
-	int sep,
-	void* arb_data_ptr)
-{
-	int* tbl_hdl_ptr = (int*) arb_data_ptr;
-
-	int ret;
-
-	IPADBG("In\n");
-
-	if ( sep )
-	{
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, nat_mem_type, total_entries, &tbl_hdl);
-		CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-	}
-
-	if ( sep )
-	{
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		*tbl_hdl_ptr = 0;
-		CHECK_ERR(ret);
-	}
-
-	IPADBG("Out\n");
-
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_testREG.c b/ipanat/test/ipa_nat_testREG.c
deleted file mode 100644
index f42ce0c..0000000
--- a/ipanat/test/ipa_nat_testREG.c
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (c) 2019 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_testREG.c
-
-	@brief
-	Verify the following scenario:
-	1. Add ipv4 table
-	2. Delete ipv4 table
-*/
-/*=========================================================================*/
-
-#include "ipa_nat_test.h"
-
-int ipa_nat_testREG(
-	const char* nat_mem_type,
-	u32 pub_ip_add,
-	int total_entries,
-	u32 tbl_hdl,
-	int sep,
-	void* arb_data_ptr)
-{
-	int* ireg_ptr = (int*) arb_data_ptr;
-
-	int  i, ret;
-
-	IPADBG("In\n");
-
-	for ( i = 0; i < *ireg_ptr; i++ )
-	{
-		IPADBG("Executing iteration %d\n", i+1);
-
-		IPADBG("Calling ipa_nat_add_ipv4_tbl()\n");
-
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, nat_mem_type, total_entries, &tbl_hdl);
-
-		CHECK_ERR_TBL_STOP(ret, tbl_hdl);
-
-		IPADBG("Iteration %d creation of nat ipv4 table successful\n", i+1);
-
-		IPADBG("Calling ipa_nat_del_ipv4_tbl()\n");
-
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-
-		CHECK_ERR(ret);
-
-		IPADBG("Iteration %d deletion of ipv4 nat table successful\n", i+1);
-	}
-
-	IPADBG("Executed %d iterations:\n", i);
-
-	IPADBG("Out\n");
-
-	return 0;
-}
diff --git a/ipanat/test/main.c b/ipanat/test/main.c
deleted file mode 100644
index 340ee48..0000000
--- a/ipanat/test/main.c
+++ /dev/null
@@ -1,507 +0,0 @@
-/*
- * Copyright (c) 2014, 2018-2019 The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    with the distribution.
- *  * Neither the name of The Linux Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include <stdio.h>
-#include <stdint.h>
-#include <stdbool.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <libgen.h>
-#include <string.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <errno.h>
-
-#include "ipa_nat_test.h"
-#include "ipa_nat_map.h"
-
-#undef strcasesame
-#define strcasesame(x, y) \
-	(! strcasecmp((x), (y)))
-
-static inline const char* legal_mem_type(
-	const char* mt )
-{
-	if ( strcasesame(mt, "DDR") )    return "DDR";
-	if ( strcasesame(mt, "SRAM") )   return "SRAM";
-	if ( strcasesame(mt, "HYBRID") ) return "HYBRID";
-	return NULL;
-}
-
-static int nat_rule_loop_check(
-	ipa_table*      table_ptr,
-	uint32_t        rule_hdl,
-	void*           record_ptr,
-	uint16_t        record_index,
-	void*           meta_record_ptr,
-	uint16_t        meta_record_index,
-	void*           arb_data_ptr )
-{
-	enum ipa3_nat_mem_in nmi;
-	uint8_t              is_expn_tbl;
-	uint16_t             rule_index;
-	uint32_t             tbl_hdl = (uint32_t) arb_data_ptr;
-
-	struct ipa_nat_rule* rule_ptr =
-		(struct ipa_nat_rule*) record_ptr;
-
-	BREAK_RULE_HDL(table_ptr, rule_hdl, nmi, is_expn_tbl, rule_index);
-
-	/*
-	 * By virtue of this function being called back by the walk, this
-	 * record_index is valid.  Denote it as such in the map...
-	 */
-	if ( ipa_nat_map_add(MAP_NUM_99, record_index, 1) )
-	{
-		IPAERR("ipa_nat_map_add(index(%u)) failed\n", record_index);
-		return -EINVAL;
-	}
-
-	if ( rule_ptr->next_index == record_index )
-	{
-		IPAERR("Infinite loop detected in IPv4 %s table, entry %u\n",
-			   (is_expn_tbl) ? "expansion" : "base",
-			   record_index);
-
-		ipa_nat_dump_ipv4_table(tbl_hdl);
-
-		return -EINVAL;
-	}
-
-	return 0;
-}
-
-static int nat_rule_validity_check(
-	ipa_table*      table_ptr,
-	uint32_t        rule_hdl,
-	void*           record_ptr,
-	uint16_t        record_index,
-	void*           meta_record_ptr,
-	uint16_t        meta_record_index,
-	void*           arb_data_ptr )
-{
-	enum ipa3_nat_mem_in nmi;
-	uint8_t              is_expn_tbl;
-	uint16_t             rule_index;
-	uint16_t             index;
-
-	struct ipa_nat_rule* rule_ptr =
-		(struct ipa_nat_rule*) record_ptr;
-
-	BREAK_RULE_HDL(table_ptr, rule_hdl, nmi, is_expn_tbl, rule_index);
-
-	index = rule_ptr->next_index;
-
-	if ( index && ipa_nat_map_find(MAP_NUM_99, index, NULL) )
-	{
-		IPAERR("Invalid next index %u found in IPv4 %s table entry %u\n",
-			   index,
-			   (is_expn_tbl) ? "expansion" : "base",
-			   rule_index);
-
-		return -EINVAL;
-	}
-
-	if ( is_expn_tbl )
-	{
-		index = rule_ptr->prev_index;
-
-		if ( index && ipa_nat_map_find(MAP_NUM_99, index, NULL) )
-		{
-			IPAERR("Invalid previous index %u found in IPv4 %s table entry %u\n",
-				   index,
-				   "expansion",
-				   rule_index);
-
-			return -EINVAL;
-		}
-	}
-
-	return 0;
-}
-
-static int index_loop_check(
-	ipa_table*      table_ptr,
-	uint32_t        rule_hdl,
-	void*           record_ptr,
-	uint16_t        record_index,
-	void*           meta_record_ptr,
-	uint16_t        meta_record_index,
-	void*           arb_data_ptr )
-{
-	enum ipa3_nat_mem_in nmi;
-	uint8_t              is_expn_tbl;
-	uint16_t             rule_index;
-	uint32_t             tbl_hdl = (uint32_t) arb_data_ptr;
-
-	struct ipa_nat_indx_tbl_rule* itr_ptr =
-		(struct ipa_nat_indx_tbl_rule*) record_ptr;
-
-	BREAK_RULE_HDL(table_ptr, rule_hdl, nmi, is_expn_tbl, rule_index);
-
-	/*
-	 * By virtue of this function being called back by the walk, this
-	 * record_index is valid.  Denote it as such in the map...
-	 */
-	if ( ipa_nat_map_add(MAP_NUM_99, record_index, 1) )
-	{
-		IPAERR("ipa_nat_map_add(index(%u)) failed\n", record_index);
-		return -EINVAL;
-	}
-
-	if ( itr_ptr->next_index == record_index )
-	{
-		IPAERR("Infinite loop detected in IPv4 index %s table, entry %u\n",
-			   (is_expn_tbl) ? "expansion" : "base",
-			   record_index);
-
-		ipa_nat_dump_ipv4_table(tbl_hdl);
-
-		return -EINVAL;
-	}
-
-	return 0;
-}
-
-static int index_validity_check(
-	ipa_table*      table_ptr,
-	uint32_t        rule_hdl,
-	void*           record_ptr,
-	uint16_t        record_index,
-	void*           meta_record_ptr,
-	uint16_t        meta_record_index,
-	void*           arb_data_ptr )
-{
-	enum ipa3_nat_mem_in nmi;
-	uint8_t              is_expn_tbl;
-	uint16_t             rule_index;
-	uint16_t             index;
-
-	struct ipa_nat_indx_tbl_rule* itr_ptr =
-		(struct ipa_nat_indx_tbl_rule*) record_ptr;
-
-	BREAK_RULE_HDL(table_ptr, rule_hdl, nmi, is_expn_tbl, rule_index);
-
-	index = itr_ptr->next_index;
-
-	if ( index && ipa_nat_map_find(MAP_NUM_99, index, NULL) )
-	{
-		IPAERR("Invalid next index %u found in IPv4 index %s table entry %u\n",
-			   index,
-			   (is_expn_tbl) ? "expansion" : "base",
-			   rule_index);
-
-		return -EINVAL;
-	}
-
-	if ( is_expn_tbl )
-	{
-		struct ipa_nat_indx_tbl_meta_info* mi_ptr = meta_record_ptr;
-
-		if ( ! mi_ptr )
-		{
-			IPAERR("Missing meta pointer for IPv4 index %s table entry %u\n",
-				   "expansion",
-				   rule_index);
-
-			return -EINVAL;
-		}
-
-		index = mi_ptr->prev_index;
-
-		if ( index && ipa_nat_map_find(MAP_NUM_99, index, NULL) )
-		{
-			IPAERR("Invalid previous index %u found in IPv4 index %s table entry %u\n",
-				   index,
-				   "expansion",
-				   rule_index);
-
-			return -EINVAL;
-		}
-	}
-
-	return 0;
-}
-
-int ipa_nat_validate_ipv4_table(
-	u32 tbl_hdl )
-{
-	int ret;
-
-	/*
-	 * Map MAP_NUM_99 will be used to keep, and to check for,
-	 * record validity.
-	 *
-	 * The first walk will fill it. The second walk will use it...
-	 */
-	ipa_nat_map_clear(MAP_NUM_99);
-
-	IPADBG("Checking IPv4 active rules:\n");
-
-	ret = ipa_nati_walk_ipv4_tbl(tbl_hdl, USE_NAT_TABLE, nat_rule_loop_check, tbl_hdl);
-
-	if ( ret != 0 )
-	{
-		return ret;
-	}
-
-	ret = ipa_nati_walk_ipv4_tbl(tbl_hdl, USE_NAT_TABLE, nat_rule_validity_check, 0);
-
-	if ( ret != 0 )
-	{
-		return ret;
-	}
-
-	/*
-	 * Map MAP_NUM_99 will be used to keep, and to check for,
-	 * record validity.
-	 *
-	 * The first walk will fill it. The second walk will use it...
-	 */
-	ipa_nat_map_clear(MAP_NUM_99);
-
-	IPADBG("Checking IPv4 index active rules:\n");
-
-	ret = ipa_nati_walk_ipv4_tbl(tbl_hdl, USE_INDEX_TABLE, index_loop_check, tbl_hdl);
-
-	if ( ret != 0 )
-	{
-		return ret;
-	}
-
-	ret = ipa_nati_walk_ipv4_tbl(tbl_hdl, USE_INDEX_TABLE, index_validity_check, 0);
-
-	if ( ret != 0 )
-	{
-		return ret;
-	}
-
-	return 0;
-}
-
-static void
-_dispUsage(
-	const char* progNamePtr )
-{
-	printf(
-		"Usage: %s [-d -r N -i N -e N -m mt]\n"
-		"Where:\n"
-		"  -d     Each test is discrete (create table, add rules, destroy table)\n"
-		"         If not specified, only one table create and destroy for all tests\n"
-		"  -r N   Where N is the number of times to run the inotify regression test\n"
-		"  -i N   Where N is the number of times (iterations) to run test\n"
-		"  -e N   Where N is the number of entries in the NAT\n"
-		"  -m mt  Where mt is the type of memory to use for the NAT\n"
-		"         Legal mt's: DDR, SRAM, or HYBRID (ie. use SRAM and DDR)\n"
-		"  -g M-N Run tests M through N only\n",
-		progNamePtr);
-
-	fflush(stdout);
-}
-
-static NatTests nt_array[] = {
-	NAT_TEST_ENTRY(ipa_nat_test000, 1, 0),
-	NAT_TEST_ENTRY(ipa_nat_test001, 1, 0),
-	NAT_TEST_ENTRY(ipa_nat_test002, 1, 0),
-	NAT_TEST_ENTRY(ipa_nat_test003, 1, 0),
-	NAT_TEST_ENTRY(ipa_nat_test004, 1, 0),
-	NAT_TEST_ENTRY(ipa_nat_test005, 1, 0),
-	NAT_TEST_ENTRY(ipa_nat_test006, 1, 0),
-	NAT_TEST_ENTRY(ipa_nat_test007, 1, 0),
-	NAT_TEST_ENTRY(ipa_nat_test008, 1, 0),
-	NAT_TEST_ENTRY(ipa_nat_test009, 1, 0),
-	NAT_TEST_ENTRY(ipa_nat_test010, IPA_NAT_TEST_PRE_COND_TE, 0),
-	NAT_TEST_ENTRY(ipa_nat_test011, IPA_NAT_TEST_PRE_COND_TE, 0),
-	NAT_TEST_ENTRY(ipa_nat_test012, IPA_NAT_TEST_PRE_COND_TE, 0),
-	NAT_TEST_ENTRY(ipa_nat_test013, IPA_NAT_TEST_PRE_COND_TE, 0),
-	NAT_TEST_ENTRY(ipa_nat_test014, IPA_NAT_TEST_PRE_COND_TE, 0),
-	NAT_TEST_ENTRY(ipa_nat_test015, IPA_NAT_TEST_PRE_COND_TE, 0),
-	NAT_TEST_ENTRY(ipa_nat_test016, IPA_NAT_TEST_PRE_COND_TE, 0),
-	NAT_TEST_ENTRY(ipa_nat_test017, IPA_NAT_TEST_PRE_COND_TE, 0),
-	NAT_TEST_ENTRY(ipa_nat_test018, IPA_NAT_TEST_PRE_COND_TE, 0),
-	NAT_TEST_ENTRY(ipa_nat_test019, IPA_NAT_TEST_PRE_COND_TE, 0),
-	NAT_TEST_ENTRY(ipa_nat_test020, IPA_NAT_TEST_PRE_COND_TE, 0),
-	NAT_TEST_ENTRY(ipa_nat_test021, IPA_NAT_TEST_PRE_COND_TE, 0),
-	NAT_TEST_ENTRY(ipa_nat_test022, IPA_NAT_TEST_PRE_COND_TE, 0),
-	NAT_TEST_ENTRY(ipa_nat_test023, IPA_NAT_TEST_PRE_COND_TE, 0),
-	NAT_TEST_ENTRY(ipa_nat_test024, IPA_NAT_TEST_PRE_COND_TE, 0),
-	NAT_TEST_ENTRY(ipa_nat_test025, IPA_NAT_TEST_PRE_COND_TE, 0),
-	/*
-	 * Add new tests just above this comment. Keep the following two
-	 * at the end...
-	 */
-	NAT_TEST_ENTRY(ipa_nat_test999, 1, 0),
-	NAT_TEST_ENTRY(ipa_nat_testREG, 1, 0),
-};
-
-int main(
-	int   argc,
-	char* argv[] )
-{
-	int      sep        = 0;
-	int      ireg       = 0;
-	uint32_t nt         = 1;
-	int      total_ents = 100;
-	uint32_t ht         = 0;
-	uint32_t start = 0, end = 0;
-
-	char* nat_mem_type = "DDR";
-
-	uint32_t tbl_hdl    = 0;
-
-	uint32_t pub_ip_addr;
-
-	uint32_t i, ub, cnt, exec, pass;
-
-	void*    adp;
-
-	time_t   t;
-
-	int      c, ret;
-
-	IPADBG("Testing user space nat driver\n");
-
-	while ( (c = getopt(argc, argv, "dr:i:e:m:h:g:?")) != -1 )
-	{
-		switch (c)
-		{
-		case 'd':
-			sep = 1;
-			break;
-		case 'r':
-			ireg = atoi(optarg);
-			break;
-		case 'i':
-			nt = atoi(optarg);
-			break;
-		case 'e':
-			total_ents = atoi(optarg);
-			break;
-		case 'm':
-			if ( ! (nat_mem_type = legal_mem_type(optarg)) )
-			{
-				fprintf(stderr, "Illegal: -m %s\n", optarg);
-				_dispUsage(basename(argv[0]));
-				exit(0);
-			}
-			break;
-		case 'h':
-			ht = atoi(optarg);
-			break;
-		case 'g':
-			if ( sscanf(optarg, "%u-%u", &start, &end) != 2
-				 ||
-				 ( start >= end || end >= array_sz(nt_array) - 1 ) )
-			{
-				fprintf(stderr, "Illegal: -f %s\n", optarg);
-				_dispUsage(basename(argv[0]));
-				exit(0);
-			}
-			break;
-		case '?':
-		default:
-			_dispUsage(basename(argv[0]));
-			exit(0);
-			break;
-		}
-	}
-
-	srand(time(&t));
-
-	pub_ip_addr = RAN_ADDR;
-
-	exec = pass = 0;
-
-	for ( cnt = ret = 0; cnt < nt && ret == 0; cnt++ )
-	{
-		IPADBG("ITERATION [%u] OF TESING\n", cnt + 1);
-
-		if ( ireg )
-		{
-			adp = &ireg;
-			i   = array_sz(nt_array) - 1;
-			ub  = array_sz(nt_array);
-		}
-		else
-		{
-			adp = &tbl_hdl;
-			i   = ( end ) ? start : 0;
-			ub  = ( end ) ? end   : array_sz(nt_array) - 1;
-
-			if ( i != 0 && ! sep )
-			{
-				ipa_nat_test000(
-					nat_mem_type, pub_ip_addr, total_ents, tbl_hdl, 0, adp);
-			}
-		}
-
-		for ( ; i < ub && ret == 0; i++ )
-		{
-			if ( total_ents >= nt_array[i].num_ents_trigger )
-			{
-				IPADBG("+------------------------------------------------+\n");
-				IPADBG("|        Executing test: %s         |\n", nt_array[i].func_name);
-				IPADBG("+------------------------------------------------+\n");
-
-				ret = nt_array[i].func(
-					nat_mem_type, pub_ip_addr, total_ents, tbl_hdl, sep, adp);
-
-				exec++;
-
-				if ( ret == 0 )
-				{
-					IPADBG("<<<<< Test %s SUCCEEDED >>>>>\n", nt_array[i].func_name);
-
-					pass++;
-
-					if ( ht || nt_array[i].test_hold_time_in_secs )
-					{
-						ht = (ht) ? ht : nt_array[i].test_hold_time_in_secs;
-
-						sleep(ht);
-					}
-				}
-				else
-				{
-					IPAERR("<<<<< Test %s FAILED >>>>>\n", nt_array[i].func_name);
-				}
-			}
-		}
-	}
-
-	if ( ret && tbl_hdl )
-	{
-		ipa_nat_test999(
-			nat_mem_type, pub_ip_addr, total_ents, tbl_hdl, 0, &tbl_hdl);
-	}
-
-	IPADBG("Total NAT Tests Run:%u, Pass:%u, Fail:%u\n",
-		   exec, pass, exec - pass);
-
-	return 0;
-}
