int read_network_file (char *filename) { FILE *f = fopen (filename, "rt"); if (!f) { fprintf (stderr, "can not open network file (error %m)\n"); return 0; } char buf[256]; while (!feof (f)) { if (rules_num >= MAX_RULES) { fclose (f); return rules_num; } fgets (buf, 255, f); rules_num += read_rule(buf, &network[rules_num]); } if (verbosity) { fprintf (stderr, "Read %d rules from network description file\n", rules_num); } fclose (f); return rules_num; }
static int read_common_rules(xmlNode *root, cp_ruleset_t **dst, cp_read_actions_func read_actions, cp_free_actions_func free_actions) { cp_ruleset_t *rs = NULL; cp_rule_t *r, *last = NULL; xmlNode *n; int res = RES_OK; if (!dst) return RES_INTERNAL_ERR; else *dst = NULL; if (!root) return RES_INTERNAL_ERR; if (cmp_node(root, "ruleset", common_policy_ns) < 0) { ERROR_LOG("document is not a ruleset \n"); return RES_INTERNAL_ERR; } rs = (cp_ruleset_t*)cds_malloc(sizeof(cp_ruleset_t)); if (!rs) return RES_MEMORY_ERR; *dst = rs; memset(rs, 0, sizeof(*rs)); /* read rules in ruleset */ n = root->children; while (n) { if (n->type == XML_ELEMENT_NODE) { if (cmp_node(n, "rule", common_policy_ns) >= 0) { res = read_rule(n, &r, read_actions, free_actions); if (res == 0) { if (r) LINKED_LIST_ADD(rs->rules, last, r); } else break; } } n = n->next; } return res; }
int main(int argc, char *argv[]) { ns_rule_handle_h *rh = NULL; uint32_t prio = 0,rule_read = 0; char *endptr; ns_rule_key_size_t key_size = SUPPORTED_TCAM_KEY_SIZE; ns_nfm_ret_t ret; unsigned int host_id = 15; unsigned int device = 0; ns_log_init(NS_LOG_COLOR | NS_LOG_CONSOLE); ns_log_lvl_set(NS_LOG_LVL_INFO); int c; while ((c = getopt_long(argc, argv, "l:hi:d:k:rn:", __long_options, NULL)) != -1) { switch (c) { case 'l': ns_log_lvl_set((unsigned int)strtoul(optarg,0,0)); break; case 'i': host_id = (unsigned int)strtoul(optarg,0,0); if (host_id > 31) { fprintf(stderr, "Host_id %d is out of range (0-31)\n", device); exit(1); } break; case 'd': device = (unsigned int)strtoul(optarg,0,0); if (device > 3) { fprintf(stderr, "Device %d is out of range (0-3)\n", device); exit(1); } break; case 'k': key_size = strtoul(optarg, &endptr, 0); if (*endptr != '\0') { fprintf(stderr, "Invalid keysize %s\n", optarg); return 1; } if (key_size != SUPPORTED_TCAM_KEY_SIZE) { fprintf(stderr, "Invalid keysize %s, please use " SUPPORTED_TCAM_KEY_SIZE_STR "\n", optarg); print_usage(argv[0]); } break; case 'r': // Read Rule rule_read = 1; break; case 'n': // Rule name to be read or written strcpy(rnames, optarg); break; case 'h': default: print_usage(argv[0]); } } if (optind != argc) print_usage(argv[0]); // Init the rules lib rh = ns_rules_init(RULESD_Q_NAME, RQNAME, device); if (!rh) { fprintf(stderr, "ns_rules_init() failed\n"); return 1; } if(!rule_read) { if (key_size == SUPPORTED_TCAM_KEY_SIZE) { /* * Reset the configuration. This is ignored if there was no * configuration. Note that this also flushes the rules from the * hardware. */ ret = ns_rules_config_reset(rh); if (ret != NS_NFM_SUCCESS) { fprintf(stderr, "failure @ %s: %d\n", __FILE__, __LINE__); goto fail; } // Set the desired lookup key size ret = ns_rules_config_set_key_size(rh, key_size); if (ret != NS_NFM_SUCCESS) { fprintf(stderr, "failure @ %s: %d\n", __FILE__, __LINE__); goto fail; } } // Send config to rulesd ret = ns_rules_setup(rh); if (ret != NS_NFM_SUCCESS) { fprintf(stderr, "failure @ %s: %d\n", __FILE__, __LINE__); goto fail; } // Add a single rule to send traffic to host. // Prepare to add the rule //sprintf(rnames[num], "v6sample %d", num); ret = add_rule(rh, rnames, prio, SEND_ACTION_VIA_HOST, FST_30_MINUTE_LIST_NUM, host_id); if (ret != NS_NFM_SUCCESS) { fprintf(stderr, "failure @ %s: %d\n", __FILE__, __LINE__); goto fail; } // Commit ret = ns_rule_commit_rulesdb(rh); if (ret != NS_NFM_SUCCESS) { fprintf(stderr, "failure @ %s: %d\n", __FILE__, __LINE__); goto fail; } } else { if(read_rule(rh, rnames)) { fprintf(stderr, "failure to read rules @ %s: %d\n", __FILE__, __LINE__); } } // Dump ret = ns_rule_dump_rules(rh); if (ret != NS_NFM_SUCCESS) { fprintf(stderr, "failure @ %s: %d\n", __FILE__, __LINE__); goto fail; } // Close the rules library. ret = ns_rules_close(rh); if (ret != NS_NFM_SUCCESS) { fprintf(stderr, "failure @ %s: %d\n", __FILE__, __LINE__); goto fail; } return 0; fail: ns_rules_close(rh); return 1; }