Deleted Added
full compact
42c42
< __FBSDID("$FreeBSD: head/sys/netgraph/ng_source.c 167156 2007-03-01 23:16:17Z emaste $");
---
> __FBSDID("$FreeBSD: head/sys/netgraph/ng_source.c 167160 2007-03-02 01:44:04Z emaste $");
88a89
> struct mbuf *last_packet; /* last pkt in queue */
93a95
> struct ng_source_embed_cnt_info embed_counter[NG_SOURCE_COUNTERS];
117a120,122
> static void ng_source_mod_counter(sc_p sc,
> struct ng_source_embed_cnt_info *cnt,
> struct mbuf *m, int increment);
147a153,160
> /* Parse type for struct ng_source_embed_cnt_info */
> static const struct ng_parse_struct_field ng_source_embed_cnt_type_fields[] =
> NG_SOURCE_EMBED_CNT_TYPE_INFO;
> static const struct ng_parse_type ng_source_embed_cnt_type = {
> &ng_parse_struct_type,
> &ng_source_embed_cnt_type_fields
> };
>
219a233,246
> {
> NGM_SOURCE_COOKIE,
> NGM_SOURCE_SET_COUNTER,
> "setcounter",
> &ng_source_embed_cnt_type,
> NULL
> },
> {
> NGM_SOURCE_COOKIE,
> NGM_SOURCE_GET_COUNTER,
> "getcounter",
> &ng_parse_uint8_type,
> &ng_source_embed_cnt_type
> },
428a456,490
> case NGM_SOURCE_SET_COUNTER:
> {
> struct ng_source_embed_cnt_info *embed;
>
> embed = (struct ng_source_embed_cnt_info *)msg->data;
> if (embed->index >= NG_SOURCE_COUNTERS ||
> !(embed->width == 1 || embed->width == 2 ||
> embed->width == 4)) {
> error = EINVAL;
> goto done;
> }
> bcopy(embed, &sc->embed_counter[embed->index],
> sizeof(*embed));
>
> break;
> }
> case NGM_SOURCE_GET_COUNTER:
> {
> uint8_t index = *(uint8_t *)msg->data;
> struct ng_source_embed_cnt_info *embed;
>
> if (index >= NG_SOURCE_COUNTERS) {
> error = EINVAL;
> goto done;
> }
> NG_MKRESPONSE(resp, msg, sizeof(*embed), M_DONTWAIT);
> if (resp == NULL) {
> error = ENOMEM;
> goto done;
> }
> embed = (struct ng_source_embed_cnt_info *)resp->data;
> bcopy(&sc->embed_counter[index], embed, sizeof(*embed));
>
> break;
> }
497a560
> sc->last_packet = m;
602a666
> sc->last_packet = 0;
763a828,855
> static void
> ng_source_mod_counter(sc_p sc, struct ng_source_embed_cnt_info *cnt,
> struct mbuf *m, int increment)
> {
> caddr_t cp;
> uint32_t val;
>
> val = htonl(cnt->next_val);
> cp = (caddr_t)&val + sizeof(val) - cnt->width;
> ng_source_packet_mod(sc, m, cnt->offset, cnt->width, cp, cnt->flags);
>
> if (increment) {
> cnt->next_val += increment;
>
> if (increment > 0 && cnt->next_val > cnt->max_val) {
> cnt->next_val = cnt->min_val - 1 +
> (cnt->next_val - cnt->max_val);
> if (cnt->next_val > cnt->max_val)
> cnt->next_val = cnt->max_val;
> } else if (increment < 0 && cnt->next_val < cnt->min_val) {
> cnt->next_val = cnt->max_val + 1 +
> (cnt->next_val - cnt->min_val);
> if (cnt->next_val < cnt->min_val)
> cnt->next_val = cnt->max_val;
> }
> }
> }
>
767a860
> struct ng_source_embed_cnt_info *cnt;
770a864
> int i, increment;
773a868,869
> for (i = 0; !modify && i < NG_SOURCE_COUNTERS; ++i)
> modify = sc->embed_counter[i].flags & NGM_SOURCE_EMBED_ENABLE;
791a888,899
> for (i = 0; i < NG_SOURCE_COUNTERS; ++i) {
> cnt = &sc->embed_counter[i];
> if (cnt->flags & NGM_SOURCE_EMBED_ENABLE) {
> if ((cnt->flags & NGM_SOURCE_INC_CNT_PER_LIST) == 0 ||
> sc->last_packet == m0)
> increment = cnt->increment;
> else
> increment = 0;
> ng_source_mod_counter(sc, cnt, m, increment);
> }
> }
>