Add export record to dgram. */
| 1041 | |
| 1042 | /* Add export record to dgram. */ |
| 1043 | static int |
| 1044 | export_add(item_p item, struct flow_entry *fle) |
| 1045 | { |
| 1046 | struct netflow_v5_export_dgram *dgram = mtod(NGI_M(item), |
| 1047 | struct netflow_v5_export_dgram *); |
| 1048 | struct netflow_v5_header *header = &dgram->header; |
| 1049 | struct netflow_v5_record *rec; |
| 1050 | |
| 1051 | rec = &dgram->r[header->count]; |
| 1052 | header->count ++; |
| 1053 | |
| 1054 | KASSERT(header->count <= NETFLOW_V5_MAX_RECORDS, |
| 1055 | ("ng_netflow: export too big")); |
| 1056 | |
| 1057 | /* Fill in export record. */ |
| 1058 | rec->src_addr = fle->f.r.r_src.s_addr; |
| 1059 | rec->dst_addr = fle->f.r.r_dst.s_addr; |
| 1060 | rec->next_hop = fle->f.next_hop.s_addr; |
| 1061 | rec->i_ifx = htons(fle->f.fle_i_ifx); |
| 1062 | rec->o_ifx = htons(fle->f.fle_o_ifx); |
| 1063 | rec->packets = htonl(fle->f.packets); |
| 1064 | rec->octets = htonl(fle->f.bytes); |
| 1065 | rec->first = htonl(MILLIUPTIME(fle->f.first)); |
| 1066 | rec->last = htonl(MILLIUPTIME(fle->f.last)); |
| 1067 | rec->s_port = fle->f.r.r_sport; |
| 1068 | rec->d_port = fle->f.r.r_dport; |
| 1069 | rec->flags = fle->f.tcp_flags; |
| 1070 | rec->prot = fle->f.r.r_ip_p; |
| 1071 | rec->tos = fle->f.r.r_tos; |
| 1072 | rec->dst_mask = fle->f.dst_mask; |
| 1073 | rec->src_mask = fle->f.src_mask; |
| 1074 | rec->pad1 = 0; |
| 1075 | rec->pad2 = 0; |
| 1076 | |
| 1077 | /* Not supported fields. */ |
| 1078 | rec->src_as = rec->dst_as = 0; |
| 1079 | |
| 1080 | if (header->count == NETFLOW_V5_MAX_RECORDS) |
| 1081 | return (1); /* end of datagram */ |
| 1082 | else |
| 1083 | return (0); |
| 1084 | } |
| 1085 | |
| 1086 | /* Periodic flow expiry run. */ |
| 1087 | void |