| /* |
| * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved. |
| * |
| * Permission to use, copy, modify, and/or distribute this software for any |
| * purpose with or without fee is hereby granted, provided that the above |
| * copyright notice and this permission notice appear in all copies. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
| * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
| * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
| * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
| * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
| * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
| * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
| */ |
| |
| #include <linux/version.h> |
| #include <linux/types.h> |
| #include <linux/ip.h> |
| #include <linux/tcp.h> |
| #include <linux/module.h> |
| #include <linux/inet.h> |
| #include <linux/etherdevice.h> |
| |
| #define DEBUG_LEVEL ECM_NSS_COMMON_DEBUG_LEVEL |
| |
| #include <nss_api_if.h> |
| |
| #include "ecm_types.h" |
| #include "ecm_db_types.h" |
| #include "ecm_state.h" |
| #include "ecm_tracker.h" |
| #include "ecm_classifier.h" |
| #include "ecm_front_end_types.h" |
| #include "ecm_tracker_datagram.h" |
| #include "ecm_tracker_udp.h" |
| #include "ecm_tracker_tcp.h" |
| #include "ecm_db.h" |
| #include "ecm_interface.h" |
| #include "ecm_nss_common.h" |
| #include "ecm_front_end_common.h" |
| #include "ecm_nss_ipv6.h" |
| #include "ecm_nss_ipv4.h" |
| |
| #ifdef ECM_IPV6_ENABLE |
| /* |
| * ecm_nss_ipv6_is_conn_limit_reached() |
| * Connection limit is reached or not ? |
| */ |
| bool ecm_nss_ipv6_is_conn_limit_reached(void) |
| { |
| |
| #if !defined(ECM_FRONT_END_CONN_LIMIT_ENABLE) |
| return false; |
| #endif |
| |
| if (likely(!((ecm_front_end_is_feature_supported(ECM_FE_FEATURE_CONN_LIMIT)) && ecm_front_end_conn_limit))) { |
| return false; |
| } |
| |
| if (ecm_nss_ipv6_accelerated_count == nss_ipv6_max_conn_count()) { |
| DEBUG_INFO("ECM DB connection limit %d reached, for NSS frontend \ |
| new flows cannot be accelerated.\n", |
| ecm_nss_ipv6_accelerated_count); |
| return true; |
| } |
| |
| return false; |
| } |
| #endif |
| |
| /* |
| * ecm_nss_ipv4_is_conn_limit_reached() |
| * Connection limit is reached or not ? |
| */ |
| bool ecm_nss_ipv4_is_conn_limit_reached(void) |
| { |
| |
| #if !defined(ECM_FRONT_END_CONN_LIMIT_ENABLE) |
| return false; |
| #endif |
| |
| if (likely(!((ecm_front_end_is_feature_supported(ECM_FE_FEATURE_CONN_LIMIT)) && ecm_front_end_conn_limit))) { |
| return false; |
| } |
| |
| if (ecm_nss_ipv4_accelerated_count == nss_ipv4_max_conn_count()) { |
| DEBUG_INFO("ECM DB connection limit %d reached, for NSS frontend \ |
| new flows cannot be accelerated.\n", |
| ecm_nss_ipv4_accelerated_count); |
| return true; |
| } |
| |
| return false; |
| } |