void drop_packet_rule(const struct pfring_pkthdr *h) { const struct pkt_parsing_info *hdr = &h->extended_hdr.parsed_pkt; static int rule_id=0; if(add_drop_rule == 1) { hash_filtering_rule rule; memset(&rule, 0, sizeof(hash_filtering_rule)); rule.rule_id = rule_id++; rule.vlan_id = hdr->vlan_id; rule.proto = hdr->l3_proto; rule.rule_action = dont_forward_packet_and_stop_rule_evaluation; rule.host4_peer_a = hdr->ip_src.v4, rule.host4_peer_b = hdr->ip_dst.v4; rule.port_peer_a = hdr->l4_src_port, rule.port_peer_b = hdr->l4_dst_port; if(pfring_handle_hash_filtering_rule(pd, &rule, 1 /* add_rule */) < 0) fprintf(stderr, "pfring_handle_hash_filtering_rule(1) failed\n"); else printf("Added filtering rule %d\n", rule.rule_id); } else { filtering_rule rule; int rc; memset(&rule, 0, sizeof(rule)); rule.rule_id = rule_id++; rule.rule_action = dont_forward_packet_and_stop_rule_evaluation; rule.core_fields.proto = hdr->l3_proto; rule.core_fields.shost.v4 = hdr->ip_src.v4, rule.core_fields.shost_mask.v4 = 0xFFFFFFFF; rule.core_fields.sport_low = rule.core_fields.sport_high = hdr->l4_src_port; rule.core_fields.dhost.v4 = hdr->ip_dst.v4, rule.core_fields.dhost_mask.v4 = 0xFFFFFFFF; rule.core_fields.dport_low = rule.core_fields.dport_high = hdr->l4_dst_port; if((rc = pfring_add_filtering_rule(pd, &rule)) < 0) fprintf(stderr, "pfring_add_filtering_rule(2) failed\n"); else printf("Rule %d added successfully...\n", rule.rule_id); } }
static int pfring_daq_open(Pfring_Context_t *context, int id) { uint32_t default_net = 0xFFFFFF00; char *device = context->devices[id]; int pfring_rc; pfring *ring_handle; char buf[32]; if(!device) { DPE(context->errbuf, "%s", "PF_RING a device must be specified"); return -1; } if(device) { if(strncmp(device, "dna", 3) == 0) { DPE(context->errbuf, "DNA is not supported by daq_pfring. Please get daq_pfring_dna from http://shop.ntop.org"); return(-1); } context->pkt_buffer = NULL; ring_handle = pfring_open(device, context->snaplen, PF_RING_LONG_HEADER | (context->promisc_flag ? PF_RING_PROMISC : 0)); if(!ring_handle) { DPE(context->errbuf, "pfring_open(): unable to open device '%s'. Please use -i <device>", device); return -1; } } pfring_get_bound_device_ifindex(ring_handle, &context->ifindexes[id]); /* TODO this is because rules purging is not yet available with hw rules */ pfring_set_filtering_mode(ring_handle, software_only); if (context->mode == DAQ_MODE_INLINE) { /* Default mode: recv_and_send_mode */ pfring_set_direction(ring_handle, rx_only_direction); } else if (context->mode == DAQ_MODE_PASSIVE) { /* Default direction: rx_and_tx_direction */ if(context->num_reflector_devices > id) { /* lowlevelbridge ON */ filtering_rule rule; memset(&rule, 0, sizeof(rule)); rule.rule_id = 1; rule.rule_action = reflect_packet_and_continue_rule_evaluation; snprintf(rule.reflector_device_name, REFLECTOR_NAME_LEN, "%s", context->reflector_devices[id]); if(pfring_add_filtering_rule(ring_handle, &rule) < 0) { DPE(context->errbuf, "unable to set the low level packet reflector %s -> %s", device, rule.reflector_device_name); pfring_close(ring_handle); return -1; } else printf("%s -> %s\n", context->devices[id], context->reflector_devices[id]); pfring_set_direction(ring_handle, rx_only_direction); } pfring_set_socket_mode(ring_handle, recv_only_mode); } if(context->clusterids[id] > 0) { pfring_rc = pfring_set_cluster(ring_handle, context->clusterids[id], context->cluster_mode); if(pfring_rc != 0) { DPE(context->errbuf, "pfring_set_cluster returned %d", pfring_rc); pfring_close(ring_handle); return -1; } snprintf(buf, sizeof(buf), "snort-cluster-%d-socket-%d", context->clusterids[id], id); pfring_set_application_name(ring_handle, buf); } else { snprintf(buf, sizeof(buf), "snort-socket-%d", id); pfring_set_application_name(ring_handle, buf); } pfring_set_poll_watermark(ring_handle, context->watermark); context->netmask = htonl(default_net); context->ring_handles[id] = ring_handle; return(0); }