bool filter(char *data, int &len){ if (config.drop){ if (!drop_packet(data, len)) return false; } if (config.corrupt_packets && config.corrupt_bytes && rand_test(config.corrupt_packets)){ corrupt_packet(data, len); } if (config.truncate_len){ len = MIN(len, config.truncate_len); } return true; }
static bool rate_limit_local_packet_cb(struct relay *r, void *rl_) { struct rate_limiter *rl = rl_; const struct settings *s = rl->s; struct ofp_packet_in *opi; opi = get_ofp_packet_in(r); if (!opi) { return false; } if (opi->reason == OFPR_ACTION) { /* Don't rate-limit 'ofp-packet_in's generated by flows that the * controller set up. XXX we should really just rate-limit them * *separately* so that no one can flood the controller this way. */ return false; } if (!rl->n_queued && get_token(rl)) { /* In the common case where we are not constrained by the rate limit, * let the packet take the normal path. */ rl->n_normal++; return false; } else { /* Otherwise queue it up for the periodic callback to drain out. */ struct ofpbuf *msg = r->halves[HALF_LOCAL].rxbuf; int port = ntohs(opi->in_port) % OFPP_MAX; if (rl->n_queued >= s->burst_limit) { drop_packet(rl); } queue_push_tail(&rl->queues[port], ofpbuf_clone(msg)); rl->n_queued++; rl->n_limited++; return true; } }