| 130 | } |
| 131 | |
| 132 | void |
| 133 | parse_flow_tokens(char **tokens, uint32_t n_tokens, |
| 134 | struct parse_status *status) |
| 135 | { |
| 136 | struct flow_rule_entry *rule; |
| 137 | uint32_t ti = 0; |
| 138 | |
| 139 | if (nb_flow_rule >= FLOW_RULES_MAX) { |
| 140 | printf("Too many flow rules\n"); |
| 141 | return; |
| 142 | } |
| 143 | |
| 144 | rule = &flow_rule_tbl[nb_flow_rule]; |
| 145 | memset(rule, 0, sizeof(*rule)); |
| 146 | |
| 147 | for (ti = 0; ti < n_tokens; ti++) { |
| 148 | if (strcmp(tokens[ti], "mark") == 0) { |
| 149 | INCREMENT_TOKEN_INDEX(ti, n_tokens, status); |
| 150 | if (status->status < 0) |
| 151 | return; |
| 152 | APP_CHECK_TOKEN_IS_NUM(tokens, ti, status); |
| 153 | if (status->status < 0) |
| 154 | return; |
| 155 | |
| 156 | rule->mark_val.id = atoi(tokens[ti]); |
| 157 | rule->enable_mark = true; |
| 158 | continue; |
| 159 | } |
| 160 | if (strcmp(tokens[ti], "eth") == 0) { |
| 161 | rule->is_eth = true; |
| 162 | continue; |
| 163 | } |
| 164 | |
| 165 | if (strcmp(tokens[ti], "ipv4") == 0) { |
| 166 | rule->is_ipv4 = true; |
| 167 | INCREMENT_TOKEN_INDEX(ti, n_tokens, status); |
| 168 | if (status->status < 0) |
| 169 | return; |
| 170 | if (strcmp(tokens[ti], "src") == 0) { |
| 171 | INCREMENT_TOKEN_INDEX(ti, n_tokens, status); |
| 172 | if (status->status < 0) |
| 173 | return; |
| 174 | if (ipv4_addr_cpy(&rule->ipv4.spec.hdr.src_addr, |
| 175 | &rule->ipv4.mask.hdr.src_addr, |
| 176 | tokens[ti], status)) |
| 177 | return; |
| 178 | } |
| 179 | if (strcmp(tokens[ti], "dst") == 0) { |
| 180 | INCREMENT_TOKEN_INDEX(ti, n_tokens, status); |
| 181 | if (status->status < 0) |
| 182 | return; |
| 183 | if (ipv4_addr_cpy(&rule->ipv4.spec.hdr.dst_addr, |
| 184 | &rule->ipv4.mask.hdr.dst_addr, |
| 185 | tokens[ti], status)) |
| 186 | return; |
| 187 | } |
| 188 | continue; |
| 189 | } |
no test coverage detected