embox
157 строк · 3.4 Кб
1/**
2* @file
3* @brief Graph for priority NET initialization
4*
5* @date 31.10.11
6* @author Alexander Kalmuk
7*/
8
9#include <pnet/node/skbuff_match/netfilter/match_lin.h>10#include <pnet/core/core.h>11#include <pnet/core/types.h>12#include <pnet/core/node.h>13#include <lib/libds/array.h>14#include <embox/unit.h>15#include <ctype.h>16#include <framework/cmd/api.h>17#include <net/util/macaddr.h>18#include <arpa/inet.h>19#include <net/l2/ethernet.h>20#include <pnet/core/repo.h>21#include <util/member.h>22#include <stdio.h>23#include <pnet/core/graph.h>24#include <util/macro.h>25
26#define RULE_ELEMS_COUNT 627#define NODES_COUNT 1028
29EMBOX_UNIT_INIT(init);30
31//TODO naming nodes as in file
32struct __node {33char *name;34net_node_t node;35};36
37static struct __node nodes[NODES_COUNT];38
39static net_node_t get_node_by_name(char *name);40static char* parse_type(const char *rule);41
42static const char *rules[] = {43#include <pnet_rules.inc>44};45
46static int form_rule(match_rule_t rule, const char *rule_elem, int num) {47if ('*' == rule_elem[0]) {48return 0;49}50
51switch (num) {52case 1:53macaddr_scan((unsigned char *) rule_elem,54rule->skbuf->mac.ethh->h_source);55break;56case 2:57if (strcmp("IP", rule_elem) == 0) {58pnet_rule_set_pack_type(rule, ETH_P_IP);59} else if (strcmp("ARP", rule_elem) == 0) {60pnet_rule_set_pack_type(rule, ETH_P_ARP);61}62break;63case 3:64inet_aton(rule_elem,65(struct in_addr *)&rule->skbuf->nh.iph->saddr);66break;67case 4:68if (strcmp("ICMP", rule_elem) == 0) {69pnet_rule_set_proto(rule, 0x1);70} else if (strcmp("UDP", rule_elem) == 0) {71pnet_rule_set_proto(rule, 0x11);72}73break;74case 5:75pnet_rule_set_src_udp_port(rule, *(uint16_t*) rule_elem);76break;77case 6:78rule->next_node = get_node_by_name((char*)rule_elem);79break;80}81
82return 0;83}
84
85static char* parse_type(const char *rule) {86char *cur;87
88for(cur = (char*)rule; *cur != ':'; cur++)89;90
91*cur = '\0';92cur++;93
94return cur;95}
96
97static net_node_t get_node_by_name(char *name) {98for (size_t i = 0; i < NODES_COUNT; i++) {99if (strcmp(nodes[i].name, name) == 0) {100return nodes[i].node;101}102}103
104return NULL;105}
106
107static int init(void) {108const char *rule_elem;109char *tmp;110int cur = 0;111int node_cur = 0;112size_t i = 0;113match_rule_t new_rule;114net_node_t src_node;115net_node_t dst_node;116net_node_t match_node;117net_node_matcher_t match;118struct pnet_graph *graph;119
120new_rule = pnet_rule_alloc();121
122graph = NULL;123for(i = 0; i < ARRAY_SIZE(rules); i++) {124rule_elem = rules[i];125
126if(strncmp("TYPE", rule_elem, 4) == 0) {127tmp = (char*)rule_elem;128rule_elem = parse_type(rule_elem);129nodes[node_cur].node = pnet_get_module(tmp + 5);130nodes[node_cur].name = (char*)rule_elem;131pnet_graph_add_node(graph, nodes[node_cur++].node);132} else if(strncmp("GRAPH", rule_elem, 5) == 0) {133graph = pnet_graph_create("lin_graph");134} else if (strncmp("RULES", rule_elem, 5) == 0) {135match_node = get_node_by_name((char*)rule_elem + 6);136match = (net_node_matcher_t) match_node;137cur = 0;138} else if(strncmp("LINK_SRC", rule_elem, 8) == 0) {139src_node = get_node_by_name((char*)rule_elem + 9);140rule_elem = rules[++i];141dst_node = get_node_by_name((char*)rule_elem + 9);142pnet_node_link(src_node, dst_node);143} else {144cur++;145form_rule(new_rule, rule_elem, cur);146
147if (cur > 0 && cur % RULE_ELEMS_COUNT == 0) {148pnet_add_new_rx_rule(new_rule, match);149new_rule = pnet_rule_alloc();150}151}152}153
154pnet_graph_start(graph);155
156return 0;157}
158