#include "Storage.hpp" namespace fw { Storage::Storage() { #if defined(ESP8266) this->max_rules = 15; this->eeprom_amount_of_rules = 0; this->eeprom_rules_head = 1; this->eeprom_size = this->max_rules * sizeof(firewall_rule_t) + eeprom_rules_head; EEPROM.begin(this->eeprom_size); #endif } Storage::~Storage() { } uint16_t Storage::eeprom_rule_position(uint8_t key) { #ifdef ESP32 return 0; #elif defined(ESP8266) return eeprom_rules_head + (key - 1) * sizeof(firewall_rule_t); #endif } uint8_t Storage::retrieve_amount_of_rules() { #ifdef ESP32 this->memory.begin("settings", true); const uint8_t value = memory.getUChar("amount_of_rules", 0); this->memory.end(); return value; #elif defined(ESP8266) const uint8_t amount_of_rules = EEPROM.read(this->eeprom_amount_of_rules); if (amount_of_rules > this->max_rules) return 0; return amount_of_rules; #endif } void Storage::store_amount_of_rules(const uint8_t new_amount) { #ifdef ESP32 this->memory.begin("settings", false); this->memory.putUChar("amount_of_rules", new_amount); this->memory.end(); #elif defined(ESP8266) EEPROM.put(this->eeprom_amount_of_rules, new_amount); EEPROM.commit(); #endif } firewall_rule_t *Storage::retrieve_firewall_rule(const uint8_t key) { firewall_rule_t *rule_ptr = (firewall_rule_t *)malloc(sizeof(firewall_rule_t)); rule_ptr->key = key; #ifdef ESP32 char rulename[9]; // fwRule99\n sprintf(rulename, "fwRule%i", key); this->memory.begin(rulename, true); strncpy(rule_ptr->ip, this->memory.getString(firewall_fields[IP], "0.0.0.0").c_str(), sizeof(rule_ptr->ip)); rule_ptr->port_from = this->memory.getUChar(firewall_fields[PORT_FROM], 0); rule_ptr->port_to = this->memory.getUChar(firewall_fields[PORT_TO], 0); rule_ptr->protocol = static_cast(this->memory.getUChar(firewall_fields[PROTOCOL], PROTOCOL_ALL)); rule_ptr->target = static_cast(this->memory.getUChar(firewall_fields[TARGET], TARGET_REJECT)); this->memory.end(); #elif defined(ESP8266) uint16_t eespom_position = eeprom_rule_position(key); EEPROM.get(eespom_position, rule_ptr->ip); EEPROM.get(eespom_position += sizeof(rule_ptr->ip), rule_ptr->port_from); EEPROM.get(eespom_position += sizeof(rule_ptr->port_from), rule_ptr->port_to); EEPROM.get(eespom_position += sizeof(rule_ptr->port_to), rule_ptr->protocol); EEPROM.get(eespom_position += sizeof(rule_ptr->protocol), rule_ptr->target); #endif return rule_ptr; } void Storage::store_all_firewall_rules(firewall_rule_t *rule_head) { #ifdef ESP32 firewall_rule_t *temp = rule_head; while (temp != NULL) { store_firewall_rule(temp); temp = temp->next; } #endif } void Storage::store_firewall_rule(firewall_rule_t *rule_ptr) { #ifdef ESP32 char rulename[9]; // fwRule99\n sprintf(rulename, "fwRule%i", rule_ptr->key); this->memory.begin(rulename, false); this->memory.putString(firewall_fields[IP], rule_ptr->ip); this->memory.putUChar(firewall_fields[PORT_FROM], rule_ptr->port_from); this->memory.putUChar(firewall_fields[PORT_TO], rule_ptr->port_to); this->memory.putUChar(firewall_fields[PROTOCOL], rule_ptr->protocol); this->memory.putUChar(firewall_fields[TARGET], rule_ptr->target); this->memory.end(); #elif defined(ESP8266) uint16_t eespom_position = eeprom_rule_position(rule_ptr->key); EEPROM.put(eespom_position, rule_ptr->ip); EEPROM.put(eespom_position += sizeof(rule_ptr->ip), rule_ptr->port_from); EEPROM.put(eespom_position += sizeof(rule_ptr->port_from), rule_ptr->port_to); EEPROM.put(eespom_position += sizeof(rule_ptr->port_to), rule_ptr->protocol); EEPROM.put(eespom_position += sizeof(rule_ptr->protocol), rule_ptr->target); EEPROM.commit(); #endif } }