Driver: fortconf: Prepare Rule structs

This commit is contained in:
Nodir Temirkhodjaev 2024-04-07 18:40:27 +03:00
parent 2ada1a9dc3
commit b80c033ceb
9 changed files with 82 additions and 18 deletions

View File

@ -10,6 +10,8 @@
static_assert(sizeof(ip6_addr_t) == 16, "ip6_addr_t size mismatch");
static_assert(sizeof(FORT_CONF_FLAGS) == sizeof(UINT32), "FORT_CONF_FLAGS size mismatch");
static_assert(sizeof(FORT_CONF_RULE_EXPR) == sizeof(UINT16), "FORT_CONF_RULE_EXPR size mismatch");
static_assert(sizeof(FORT_CONF_RULE) == sizeof(UINT16), "FORT_CONF_RULE size mismatch");
static_assert(sizeof(FORT_TRAF) == sizeof(UINT64), "FORT_TRAF size mismatch");
static_assert(sizeof(FORT_TIME) == sizeof(UINT16), "FORT_TIME size mismatch");
static_assert(sizeof(FORT_PERIOD) == sizeof(UINT32), "FORT_PERIOD size mismatch");

View File

@ -8,7 +8,9 @@
#define FORT_CONF_IP6_ARR_SIZE(n) ((n) * sizeof(ip6_addr_t))
#define FORT_CONF_IP4_RANGE_SIZE(n) (FORT_CONF_IP4_ARR_SIZE(n) * 2)
#define FORT_CONF_IP6_RANGE_SIZE(n) (FORT_CONF_IP6_ARR_SIZE(n) * 2)
#define FORT_CONF_RULE_MAX 256
#define FORT_CONF_RULE_MAX 1024
#define FORT_CONF_RULE_SET_MAX 32
#define FORT_CONF_RULE_DEPTH_MAX 8
#define FORT_CONF_ZONE_MAX 32
#define FORT_CONF_GROUP_MAX 16
#define FORT_CONF_APPS_LEN_MAX (64 * 1024 * 1024)
@ -68,6 +70,14 @@ typedef struct fort_service_info_list
#define FORT_SERVICE_INFO_LIST_MIN_SIZE \
(FORT_SERVICE_INFO_LIST_DATA_OFF + FORT_SERVICE_INFO_MAX_SIZE)
typedef struct fort_conf_port_list
{
UINT8 port_n;
UINT8 pair_n;
UINT16 port[1];
} FORT_CONF_PORT_LIST, *PFORT_CONF_PORT_LIST;
typedef struct fort_conf_addr4_list
{
UINT32 ip_n;
@ -99,6 +109,55 @@ typedef struct fort_conf_addr_group
char data[4];
} FORT_CONF_ADDR_GROUP, *PFORT_CONF_ADDR_GROUP;
#define FORT_RULE_FLAG_ADDRESS 0x01
#define FORT_RULE_FLAG_PORT 0x02
#define FORT_RULE_FLAG_PROTO 0x04
typedef struct fort_conf_rule_expr
{
UINT8 expr_begin : 1;
UINT8 expr_end : 1;
UINT8 expr_or : 1;
UINT8 has_ip4_list : 1;
UINT8 has_ip6_list : 1;
UINT8 flags;
} FORT_CONF_RULE_EXPR, *PFORT_CONF_RULE_EXPR;
typedef struct fort_conf_rule
{
UINT8 enabled : 1;
UINT8 blocked : 1;
UINT8 exclusive : 1;
UINT8 has_accept_zones : 1;
UINT8 has_reject_zones : 1;
UINT8 has_expr : 1;
UINT8 set_count;
} FORT_CONF_RULE, *PFORT_CONF_RULE;
typedef struct fort_conf_rules
{
UINT32 rule_off[FORT_CONF_RULE_MAX];
char data[4];
} FORT_CONF_RULES, *PFORT_CONF_RULES;
typedef struct fort_conf_rule_flag
{
UINT16 rule_id;
UCHAR enabled;
} FORT_CONF_RULE_FLAG, *PFORT_CONF_RULE_FLAG;
#define FORT_CONF_RULE_SET_ALIGN sizeof(UINT16)
#define FORT_CONF_RULE_SET_SIZE(set_count) FORT_ALIGN_SIZE((set_count), FORT_CONF_RULE_SET_ALIGN)
#define FORT_CONF_RULE_SIZE(rule) \
(sizeof(FORT_CONF_RULE) + FORT_ALIGN_SIZE((rule)->set_count, FORT_CONF_RULE_SET_ALIGN) \
+ ((rule)->has_accept_zones ? sizeof(UINT32) : 0) \
+ ((rule)->has_reject_zones ? sizeof(UINT32) : 0))
typedef struct fort_conf_zones
{
UINT32 mask;

View File

@ -324,8 +324,7 @@ int ConfRuleManager::getFreeRuleId(bool &ok)
const int maxRuleId = DbQuery(sqliteDb()).sql(sqlSelectMaxRuleId).execute().toInt();
constexpr int RuleMaxId = 9999;
ok = (maxRuleId <= RuleMaxId);
ok = (maxRuleId < ConfUtil::ruleMaxCount());
return 0;
}

View File

@ -26,7 +26,7 @@ public:
bool enabled : 1 = true;
bool blocked : 1 = false;
bool exclusive : 1 = false;
bool ruleSetEdited : 1 = false;
bool ruleSetEdited : 1 = false; // transient
RuleType ruleType = AppRule;

View File

@ -152,7 +152,6 @@ void RulesWindow::setupUi()
setupTreeRulesChanged();
// Actions on rule list model's changed/reset
setupRuleListModelChanged();
setupRuleListModelReset();
auto layout = new QVBoxLayout();
@ -288,18 +287,6 @@ void RulesWindow::setupTreeRulesChanged()
connect(m_ruleListView, &TreeView::currentIndexChanged, this, refreshTreeRulesChanged);
}
void RulesWindow::setupRuleListModelChanged()
{
const auto refreshAddRule = [&] {
m_actAddRule->setEnabled(ruleListModel()->rowCount() < ConfUtil::ruleMaxCount());
};
refreshAddRule();
connect(ruleListModel(), &RuleListModel::modelReset, this, refreshAddRule);
connect(ruleListModel(), &RuleListModel::rowsRemoved, this, refreshAddRule);
}
void RulesWindow::setupRuleListModelReset()
{
expandTreeRules();

View File

@ -65,7 +65,6 @@ private:
void setupTreeRulesHeader();
void setupTreeRulesExpandingChanged();
void setupTreeRulesChanged();
void setupRuleListModelChanged();
void setupRuleListModelReset();
QLayout *setupButtons();

View File

@ -3,6 +3,7 @@
#include <QLoggingCategory>
#include <conf/confrulemanager.h>
#include <util/conf/confutil.h>
#include <util/ioc/ioccontainer.h>
#include "rulelistmodel.h"
@ -41,6 +42,11 @@ void RuleSetModel::initialize(const RuleRow &ruleRow, const QStringList &ruleSet
void RuleSetModel::addRule(const RuleRow &ruleRow)
{
if (m_ruleSet.size() >= ConfUtil::ruleSetMaxCount()) {
qCDebug(LC) << "Rule Set is full";
return;
}
const int subRuleId = ruleRow.ruleId;
if (m_ruleSet.contains(subRuleId)) {

View File

@ -84,6 +84,16 @@ int ConfUtil::ruleMaxCount()
return FORT_CONF_RULE_MAX;
}
int ConfUtil::ruleSetMaxCount()
{
return FORT_CONF_RULE_SET_MAX;
}
int ConfUtil::ruleDepthMaxCount()
{
return FORT_CONF_RULE_DEPTH_MAX;
}
int ConfUtil::zoneMaxCount()
{
return FORT_CONF_ZONE_MAX;

View File

@ -33,6 +33,8 @@ public:
QString errorMessage() const { return m_errorMessage; }
static int ruleMaxCount();
static int ruleSetMaxCount();
static int ruleDepthMaxCount();
static int zoneMaxCount();
public slots: