EtherLib/prefab/conn_blocks/ipv4_connblock.c
Wiesner András 8676a392e5 - TCP basic implementation added
- TCPWindow added
- Checksum bug fixed (again)
- CBD introduced
- ConnBlock modified
- PackSieve report funtionality modified to decrease memory consumption
2023-01-30 11:04:46 +01:00

48 lines
1.7 KiB
C

//
// Created by epagris on 2022.11.07..
//
#include "ipv4_connblock.h"
#include "../packet_parsers/packet_parsers.h"
#include "../../utils.h"
static bool filtIPv4(const PcktSieveFilterCondition *filtCond, const PcktProps *contProps, const PcktProps *ownProps, EthInterface * intf) {
EthernetProps *etherProps = (EthernetProps *) contProps;
IPv4Props *ipProps = (IPv4Props *) ownProps;
return etherProps->length_type == ETH_IPv4_PACKET_CLASS && ((IP_ADDR_FROM_FILTCOND(filtCond) == ipProps->DestIPAddr) ||
((IP_ADDR_FROM_FILTCOND(filtCond) == IPv4_IF_ADDR) && (ipProps->DestIPAddr == intf->ip) && (intf->ip != 0)));
}
ConnBlock ipv4_new_connblock(EthInterface *intf, ip4_addr ipAddr, SieveCallBackFn cbFn) {
ConnBlock connb;
PcktSieveFilterCondition filtCond;
packfiltcond_zero(&filtCond);
IP_ADDR_TO_FILTCOND(&filtCond, ipAddr);
PcktSieveLayerTag tag;
tag.u = 0;
bool matchAny = ipAddr == IPv4_ANY_ADDR;
connb.sieveLayer = packsieve_new_layer(&intf->sieve.layer0, &filtCond, matchAny, filtIPv4, cbFn, tag, ETH_IPv4_PACKET_CLASS);
ASSERT_NULL(connb.sieveLayer);
connb.sieve = &intf->sieve;
connb.sieveLayer->connBReportFn = ipv4_print_report;
return connb;
}
void ipv4_print_report(const ConnBlock* connBlock) {
const PcktSieveLayer * sl = connBlock->sieveLayer;
ip4_addr ipAddr = IP_ADDR_FROM_FILTCOND(&sl->filtCond);
if (!sl->matchAny) {
if (ipAddr == IPv4_IF_ADDR) {
ipAddr = connBlock->sieve->intf->ip;
}
INFO("IP: %u.%u.%u.%u", (ipAddr & 0xFF), ((ipAddr >> 8) & 0xFF),
((ipAddr >> 16) & 0xFF), ((ipAddr >> 24) & 0xFF));
} else {
INFO("IP: ANY");
}
}