void ieee80211_rssadapt_raise_rate(struct ieee80211com *ic, struct ieee80211_rssadapt *ra, struct ieee80211_rssdesc *id) { u_int16_t (*thrs)[IEEE80211_RATE_SIZE], newthr, oldthr; struct ieee80211_node *ni = id->id_node; struct ieee80211_rateset *rs = &ni->ni_rates; int i, rate, top; #ifdef IEEE80211_DEBUG int j; #endif ra->ra_nok++; if (!ratecheck(&ra->ra_last_raise, &ra->ra_raise_interval)) return; for (i = 0, top = IEEE80211_RSSADAPT_BKT0; i < IEEE80211_RSSADAPT_BKTS; i++, top <<= IEEE80211_RSSADAPT_BKTPOWER) { thrs = &ra->ra_rate_thresh[i]; if (id->id_len <= top) break; } if (id->id_rateidx + 1 < rs->rs_nrates && (*thrs)[id->id_rateidx + 1] > (*thrs)[id->id_rateidx]) { rate = (rs->rs_rates[id->id_rateidx + 1] & IEEE80211_RATE_VAL); RSSADAPT_PRINTF(("%s: threshold[%d, %d.%d] decay %d ", ic->ic_ifp->if_xname, IEEE80211_RSSADAPT_BKT0 << (IEEE80211_RSSADAPT_BKTPOWER* i), rate / 2, rate * 5 % 10, (*thrs)[id->id_rateidx + 1])); oldthr = (*thrs)[id->id_rateidx + 1]; if ((*thrs)[id->id_rateidx] == 0) newthr = ra->ra_avg_rssi; else newthr = (*thrs)[id->id_rateidx]; (*thrs)[id->id_rateidx + 1] = interpolate(master_expavgctl.rc_decay, oldthr, newthr); RSSADAPT_PRINTF(("-> %d\n", (*thrs)[id->id_rateidx + 1])); } #ifdef IEEE80211_DEBUG if (RSSADAPT_DO_PRINT()) { printf("%s: dst %s thresholds\n", ic->ic_ifp->if_xname, ether_sprintf(ni->ni_macaddr)); for (i = 0; i < IEEE80211_RSSADAPT_BKTS; i++) { printf("%d-byte", IEEE80211_RSSADAPT_BKT0 << (IEEE80211_RSSADAPT_BKTPOWER * i)); for (j = 0; j < rs->rs_nrates; j++) { rate = (rs->rs_rates[j] & IEEE80211_RATE_VAL); printf(", T[%d.%d] = %d", rate / 2, rate * 5 % 10, ra->ra_rate_thresh[i][j]); } printf("\n"); } } #endif /* IEEE80211_DEBUG */ }
void ral_rssadapt_raise_rate(struct ieee80211com *ic, struct ral_rssadapt *ra, struct ral_rssdesc *id) { u_int16_t (*thrs)[IEEE80211_RATE_SIZE], newthr, oldthr; struct ieee80211_node *ni = id->id_node; struct ieee80211_rateset *rs = &ni->ni_rates; int i, rate, top; ra->ra_nok++; if (!ratecheck(&ra->ra_last_raise, &ra->ra_raise_interval)) return; for (i = 0, top = RAL_RSSADAPT_BKT0; i < RAL_RSSADAPT_BKTS; i++, top <<= RAL_RSSADAPT_BKTPOWER) { thrs = &ra->ra_rate_thresh[i]; if (id->id_len <= top) break; } if (id->id_rateidx + 1 < rs->rs_nrates && (*thrs)[id->id_rateidx + 1] > (*thrs)[id->id_rateidx]) { rate = (rs->rs_rates[id->id_rateidx + 1] & IEEE80211_RATE_VAL); oldthr = (*thrs)[id->id_rateidx + 1]; if ((*thrs)[id->id_rateidx] == 0) newthr = ra->ra_avg_rssi; else newthr = (*thrs)[id->id_rateidx]; (*thrs)[id->id_rateidx + 1] = interpolate(master_expavgctl.rc_decay, oldthr, newthr); } }
int ieee80211_rssadapt_choose(struct ieee80211_rssadapt *ra, const struct ieee80211_rateset *rs, const struct ieee80211_frame *wh, u_int len, int fixed_rate, const char *dvname, int do_not_adapt) { u_int16_t (*thrs)[IEEE80211_RATE_SIZE]; int flags = 0, i, rateidx = 0, thridx, top; if ((wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) == IEEE80211_FC0_TYPE_CTL) flags |= IEEE80211_RATE_BASIC; for (i = 0, top = IEEE80211_RSSADAPT_BKT0; i < IEEE80211_RSSADAPT_BKTS; i++, top <<= IEEE80211_RSSADAPT_BKTPOWER) { thridx = i; if (len <= top) break; } thrs = &ra->ra_rate_thresh[thridx]; if (fixed_rate != -1) { if ((rs->rs_rates[fixed_rate] & flags) == flags) { rateidx = fixed_rate; goto out; } flags |= IEEE80211_RATE_BASIC; i = fixed_rate; } else i = rs->rs_nrates; while (--i >= 0) { rateidx = i; if ((rs->rs_rates[i] & flags) != flags) continue; if (do_not_adapt) break; if ((*thrs)[i] < ra->ra_avg_rssi) break; } out: #ifdef IEEE80211_DEBUG if (ieee80211_rssadapt_debug && dvname != NULL) { printf("%s: dst %s threshold[%d, %d.%d] %d < %d\n", dvname, ether_sprintf((u_int8_t *)wh->i_addr1), len, (rs->rs_rates[rateidx] & IEEE80211_RATE_VAL) / 2, (rs->rs_rates[rateidx] & IEEE80211_RATE_VAL) * 5 % 10, (*thrs)[rateidx], ra->ra_avg_rssi); } #endif /* IEEE80211_DEBUG */ return rateidx; }
void netflow_format_flow(struct store_flow_complete* flow, char* buf, size_t len, int utc_flag, u_int32_t display_mask, int hostorder) { char tmp[256]; u_int32_t fields; u_int64_t (*fmt_ntoh64)(u_int64_t) = netflow_swp_ntoh64; u_int32_t (*fmt_ntoh32)(u_int32_t) = netflow_swp_ntoh32; u_int16_t (*fmt_ntoh16)(u_int16_t) = netflow_swp_ntoh16; if (hostorder) { fmt_ntoh64 = netflow_swp_fake64; fmt_ntoh32 = netflow_swp_fake32; fmt_ntoh16 = netflow_swp_fake16; } *buf = '\0'; fields = fmt_ntoh32(flow->hdr.fields) & display_mask; strlcat(buf, "FLOW ", len); if (SHASFIELD(TAG)) { snprintf(tmp, sizeof(tmp), "tag %u ", fmt_ntoh32(flow->tag.tag)); strlcat(buf, tmp, len); } if (SHASFIELD(RECV_TIME)) { snprintf(tmp, sizeof(tmp), "recv_time %s.%05d ", iso_time(fmt_ntoh32(flow->recv_time.recv_sec), utc_flag), fmt_ntoh32(flow->recv_time.recv_usec)); strlcat(buf, tmp, len); } if (SHASFIELD(PROTO_FLAGS_TOS)) { snprintf(tmp, sizeof(tmp), "proto %d ", flow->pft.protocol); strlcat(buf, tmp, len); snprintf(tmp, sizeof(tmp), "tcpflags %02x ", flow->pft.tcp_flags); strlcat(buf, tmp, len); snprintf(tmp, sizeof(tmp), "tos %02x " , flow->pft.tos); strlcat(buf, tmp, len); } if (SHASFIELD(AGENT_ADDR4) || SHASFIELD(AGENT_ADDR6)) { snprintf(tmp, sizeof(tmp), "agent [%s] ", addr_ntop_buf(&flow->agent_addr)); strlcat(buf, tmp, len); } if (SHASFIELD(SRC_ADDR4) || SHASFIELD(SRC_ADDR6)) { snprintf(tmp, sizeof(tmp), "src [%s]", addr_ntop_buf(&flow->src_addr)); strlcat(buf, tmp, len); if (SHASFIELD(SRCDST_PORT)) { snprintf(tmp, sizeof(tmp), ":%d", fmt_ntoh16(flow->ports.src_port)); strlcat(buf, tmp, len); } strlcat(buf, " ", len); } if (SHASFIELD(DST_ADDR4) || SHASFIELD(DST_ADDR6)) { snprintf(tmp, sizeof(tmp), "dst [%s]", addr_ntop_buf(&flow->dst_addr)); strlcat(buf, tmp, len); if (SHASFIELD(SRCDST_PORT)) { snprintf(tmp, sizeof(tmp), ":%d", fmt_ntoh16(flow->ports.dst_port)); strlcat(buf, tmp, len); } strlcat(buf, " ", len); } if (SHASFIELD(GATEWAY_ADDR4) || SHASFIELD(GATEWAY_ADDR6)) { snprintf(tmp, sizeof(tmp), "gateway [%s] ", addr_ntop_buf(&flow->gateway_addr)); strlcat(buf, tmp, len); } if (SHASFIELD(PACKETS)) { snprintf(tmp, sizeof(tmp), "packets %lu ", fmt_ntoh64(flow->packets.flow_packets)); strlcat(buf, tmp, len); } if (SHASFIELD(OCTETS)) { snprintf(tmp, sizeof(tmp), "octets %lu ", fmt_ntoh64(flow->octets.flow_octets)); strlcat(buf, tmp, len); } if (SHASFIELD(IF_INDICES)) { snprintf(tmp, sizeof(tmp), "in_if %d out_if %d ", fmt_ntoh32(flow->ifndx.if_index_in), fmt_ntoh32(flow->ifndx.if_index_out)); strlcat(buf, tmp, len); } if (SHASFIELD(AGENT_INFO)) { snprintf(tmp, sizeof(tmp), "sys_uptime_ms %s.%03u ", interval_time(fmt_ntoh32(flow->ainfo.sys_uptime_ms) / 1000), fmt_ntoh32(flow->ainfo.sys_uptime_ms) % 1000); strlcat(buf, tmp, len); snprintf(tmp, sizeof(tmp), "time_sec %s ", iso_time(fmt_ntoh32(flow->ainfo.time_sec), utc_flag)); strlcat(buf, tmp, len); snprintf(tmp, sizeof(tmp), "time_nanosec %lu netflow ver %u ", (u_long)fmt_ntoh32(flow->ainfo.time_nanosec), fmt_ntoh16(flow->ainfo.netflow_version)); strlcat(buf, tmp, len); } if (SHASFIELD(FLOW_TIMES)) { snprintf(tmp, sizeof(tmp), "flow_start %s.%03u ", interval_time(fmt_ntoh32(flow->ftimes.flow_start) / 1000), fmt_ntoh32(flow->ftimes.flow_start) % 1000); strlcat(buf, tmp, len); snprintf(tmp, sizeof(tmp), "flow_finish %s.%03u ", interval_time(fmt_ntoh32(flow->ftimes.flow_finish) / 1000), fmt_ntoh32(flow->ftimes.flow_finish) % 1000); strlcat(buf, tmp, len); } if (SHASFIELD(AS_INFO)) { snprintf(tmp, sizeof(tmp), "src_AS %u src_masklen %u ", fmt_ntoh32(flow->asinf.src_as), flow->asinf.src_mask); strlcat(buf, tmp, len); snprintf(tmp, sizeof(tmp), "dst_AS %u dst_masklen %u ", fmt_ntoh32(flow->asinf.dst_as), flow->asinf.dst_mask); strlcat(buf, tmp, len); } if (SHASFIELD(FLOW_ENGINE_INFO)) { snprintf(tmp, sizeof(tmp), "engine_type %u engine_id %u seq %lu source %lu ", fmt_ntoh16(flow->finf.engine_type), fmt_ntoh16(flow->finf.engine_id), (u_long)fmt_ntoh32(flow->finf.flow_sequence), (u_long)fmt_ntoh32(flow->finf.source_id)); strlcat(buf, tmp, len); } if (SHASFIELD(CRC32)) { snprintf(tmp, sizeof(tmp), "crc32 %08x ", fmt_ntoh32(flow->crc32.crc32)); strlcat(buf, tmp, len); } }