1 /*
2  * Copyright (c) 2001 Mark Fullmer and The Ohio State University
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  *
26  *      $Id: ftrec.c,v 1.13 2003/11/30 22:56:45 maf Exp $
27  */
28 
29 #include "ftconfig.h"
30 #include "ftlib.h"
31 
32 #include <sys/time.h>
33 #include <sys/types.h>
34 #include <limits.h>
35 #include <unistd.h>
36 #include <stddef.h>
37 #include <stdio.h>
38 #include <stdlib.h>
39 #include <time.h>
40 
41 #if HAVE_STRINGS_H
42  #include <strings.h>
43 #endif
44 #if HAVE_STRING_H
45   #include <string.h>
46 #endif
47 
48 #define FT_OFFSET(A,B)\
49   o->A = offsetof(struct B, A);
50 
51 void ftrec_xlate_1to5(struct fts3rec_v1 *rec_v1, struct fts3rec_v5 *rec_v5);
52 void ftrec_xlate_1to6(struct fts3rec_v1 *rec_v1, struct fts3rec_v6 *rec_v6);
53 void ftrec_xlate_1to7(struct fts3rec_v1 *rec_v1, struct fts3rec_v7 *rec_v7);
54 void ftrec_xlate_1to1005(struct fts3rec_v1 *rec_v1,
55   struct fts3rec_v1005 *rec_v1005);
56 
57 void ftrec_xlate_5to1(struct fts3rec_v5 *rec_v5, struct fts3rec_v1 *rec_v1);
58 void ftrec_xlate_5to6(struct fts3rec_v5 *rec_v5, struct fts3rec_v6 *rec_v6);
59 void ftrec_xlate_5to7(struct fts3rec_v5 *rec_v5, struct fts3rec_v7 *rec_v7);
60 void ftrec_xlate_5to1005(struct fts3rec_v5 *rec_v5,
61   struct fts3rec_v1005 *rec_v1005);
62 
63 void ftrec_xlate_6to1(struct fts3rec_v6 *rec_v6, struct fts3rec_v1 *rec_v1);
64 void ftrec_xlate_6to5(struct fts3rec_v6 *rec_v6, struct fts3rec_v5 *rec_v5);
65 void ftrec_xlate_6to7(struct fts3rec_v6 *rec_v6, struct fts3rec_v7 *rec_v7);
66 void ftrec_xlate_6to1005(struct fts3rec_v6 *rec_v6,
67   struct fts3rec_v1005 *rec_v1005);
68 
69 void ftrec_xlate_7to1(struct fts3rec_v7 *rec_v7, struct fts3rec_v1 *rec_v1);
70 void ftrec_xlate_7to5(struct fts3rec_v7 *rec_v7, struct fts3rec_v5 *rec_v5);
71 void ftrec_xlate_7to6(struct fts3rec_v7 *rec_v7, struct fts3rec_v6 *rec_v6);
72 void ftrec_xlate_7to1005(struct fts3rec_v7 *rec_v7,
73   struct fts3rec_v1005 *rec_v1005);
74 
75 void ftrec_xlate_1005to5(struct fts3rec_v1005 *rec_v1005,
76   struct fts3rec_v5 *rec_v5);
77 
78 /*
79  * function ftrec_compute_mask
80  *
81  * configure ftipmask for given byte order
82  *
83  * used to precompute mask and test to avoid byte swapping
84  * in certain code paths
85  *
86  */
ftrec_compute_mask(struct ftipmask * m,uint32_t src,uint32_t dst,int byte_order)87 void ftrec_compute_mask(struct ftipmask *m, uint32_t src, uint32_t dst, int
88   byte_order)
89 {
90 
91   m->src_mask = src;
92   m->dst_mask = dst;
93   m->mcast_mask =  0xf0000000;
94   m->mcast_val = 0xe0000000;
95 
96 #if BYTE_ORDER == BIG_ENDIAN
97   if (byte_order == FT_HEADER_LITTLE_ENDIAN) {
98     SWAPINT32(m->src_mask);
99     SWAPINT32(m->dst_mask);
100     SWAPINT32(m->mcast_mask);
101     SWAPINT32(m->mcast_val);
102   }
103 #endif /* BYTE_ORDER == BIG_ENDIAN */
104 
105 #if BYTE_ORDER == LITTLE_ENDIAN
106   if (byte_order == FT_HEADER_BIG_ENDIAN) {
107     SWAPINT32(m->src_mask);
108     SWAPINT32(m->dst_mask);
109     SWAPINT32(m->mcast_mask);
110     SWAPINT32(m->mcast_val);
111   }
112 #endif /* BYTE_ORDER == LITTLE_ENDIAN */
113 
114 } /* ftrec_compute_mask */
115 
116 /*
117  * function: ftrec_mask_ip
118  *
119  * AND non multicast IP addresses in a flow record with mask
120  *
121  * mask and record must be in the same byte order
122  *
123  * returns -1 on error, 0 otherwise.
124  */
ftrec_mask_ip(void * rec,struct ftver * ftv,struct ftipmask * m)125 int ftrec_mask_ip(void *rec, struct ftver *ftv, struct ftipmask *m)
126 {
127 
128   int ret;
129   struct fts3rec_gen *rec_gen;
130 
131   ret = -1;
132 
133   switch (ftv->d_version) {
134 
135     case 1:
136     case 5:
137     case 6:
138     case 7:
139     case 1005:
140       rec_gen = rec;
141       if (!((rec_gen->dstaddr & m->mcast_mask) == m->mcast_val)) {
142         rec_gen->srcaddr &= m->src_mask;
143         rec_gen->dstaddr &= m->dst_mask;
144       }
145       ret = 0;
146       break;
147 
148   } /* switch */
149 
150   return ret;
151 
152 } /* ftrec_mask_ip */
153 
154 /*
155  * function: ftrec_xlate_func
156  *
157  * return function to translate among v1, v5, v6, and v7 formats
158  *
159  */
ftrec_xlate_func(struct ftver * in_ftv,struct ftver * out_ftv)160 void *ftrec_xlate_func(struct ftver *in_ftv, struct ftver *out_ftv)
161 {
162 
163   if (in_ftv->d_version == 1) {
164 
165     if (out_ftv->d_version == 5)
166       return ftrec_xlate_1to5;
167     else if (out_ftv->d_version == 6)
168       return ftrec_xlate_1to6;
169     else if (out_ftv->d_version == 7)
170       return ftrec_xlate_1to7;
171     else if (out_ftv->d_version == 1)
172       return (void*)0L;
173     else if (out_ftv->d_version == 1005)
174       return ftrec_xlate_5to1005;
175 
176   } else if (in_ftv->d_version == 5) {
177 
178     if (out_ftv->d_version == 1)
179       return ftrec_xlate_5to1;
180     else if (out_ftv->d_version == 6)
181       return ftrec_xlate_5to6;
182     else if (out_ftv->d_version == 7)
183       return ftrec_xlate_5to7;
184     else if (out_ftv->d_version == 1005)
185       return ftrec_xlate_5to1005;
186     else if (out_ftv->d_version == 5)
187       return (void*)0L;
188 
189   } else if (in_ftv->d_version == 6) {
190 
191     if (out_ftv->d_version == 1)
192       return ftrec_xlate_6to1;
193     else if (out_ftv->d_version == 5)
194       return ftrec_xlate_6to5;
195     else if (out_ftv->d_version == 7)
196       return ftrec_xlate_6to7;
197     else if (out_ftv->d_version == 6)
198       return (void*)0L;
199     else if (out_ftv->d_version == 1005)
200       return ftrec_xlate_6to1005;
201 
202   } else if (in_ftv->d_version == 7) {
203 
204     if (out_ftv->d_version == 1)
205       return ftrec_xlate_7to1;
206     else if (out_ftv->d_version == 5)
207       return ftrec_xlate_7to5;
208     else if (out_ftv->d_version == 6)
209       return ftrec_xlate_7to6;
210     else if (out_ftv->d_version == 7)
211       return (void*)0L;
212     else if (out_ftv->d_version == 1005)
213       return ftrec_xlate_7to1005;
214 
215   } else if (in_ftv->d_version == 1005) {
216 
217     if (out_ftv->d_version == 5)
218       return ftrec_xlate_1005to5;
219   }
220 
221   return (void*)0L;
222 
223 } /* ftrec_xlate_func */
224 
225 /*
226  * function: ftrec_xlate
227  *
228  * translate among v1, v5, v6, and v7 formats
229  *
230  */
ftrec_xlate(void * in_rec,struct ftver * in_ftv,void * out_rec,struct ftver * out_ftv)231 void ftrec_xlate(void *in_rec, struct ftver *in_ftv, void *out_rec,
232   struct ftver *out_ftv)
233 {
234 
235   void (*func)(void *in_rec, void *out_rec);
236 
237   func = ftrec_xlate_func(in_ftv, out_ftv);
238   if (!func)
239     return; /* XXX: should provide a return code */
240   func(in_rec, out_rec);
241 
242 } /* ftrec_xlate */
243 
ftrec_xlate_5to1(struct fts3rec_v5 * rec_v5,struct fts3rec_v1 * rec_v1)244 void ftrec_xlate_5to1(struct fts3rec_v5 *rec_v5, struct fts3rec_v1 *rec_v1)
245 {
246 
247   bzero(rec_v1, sizeof (struct fts3rec_v1));
248 
249   rec_v1->unix_secs = rec_v5->unix_secs;
250   rec_v1->unix_nsecs = rec_v5->unix_nsecs;
251   rec_v1->sysUpTime = rec_v5->sysUpTime;
252   rec_v1->exaddr = rec_v5->exaddr;
253   rec_v1->srcaddr = rec_v5->srcaddr;
254   rec_v1->dstaddr = rec_v5->dstaddr;
255   rec_v1->nexthop = rec_v5->nexthop;
256   rec_v1->input = rec_v5->input;
257   rec_v1->output = rec_v5->output;
258   rec_v1->dPkts = rec_v5->dPkts;
259   rec_v1->dOctets = rec_v5->dOctets;
260   rec_v1->First = rec_v5->First;
261   rec_v1->Last = rec_v5->Last;
262   rec_v1->srcport = rec_v5->srcport;
263   rec_v1->dstport = rec_v5->dstport;
264   rec_v1->prot = rec_v5->prot;
265   rec_v1->tos = rec_v5->tos;
266   rec_v1->tcp_flags = rec_v5->tcp_flags;
267 
268 } /* ftrec_xlate_5to1 */
269 
ftrec_xlate_5to6(struct fts3rec_v5 * rec_v5,struct fts3rec_v6 * rec_v6)270 void ftrec_xlate_5to6(struct fts3rec_v5 *rec_v5, struct fts3rec_v6 *rec_v6)
271 {
272 
273   bzero(rec_v6, sizeof (struct fts3rec_v6));
274 
275   rec_v6->unix_secs = rec_v5->unix_secs;
276   rec_v6->unix_nsecs = rec_v5->unix_nsecs;
277   rec_v6->sysUpTime = rec_v5->sysUpTime;
278   rec_v6->exaddr = rec_v5->exaddr;
279   rec_v6->srcaddr = rec_v5->srcaddr;
280   rec_v6->dstaddr = rec_v5->dstaddr;
281   rec_v6->nexthop = rec_v5->nexthop;
282   rec_v6->input = rec_v5->input;
283   rec_v6->output = rec_v5->output;
284   rec_v6->dPkts = rec_v5->dPkts;
285   rec_v6->dOctets = rec_v5->dOctets;
286   rec_v6->First = rec_v5->First;
287   rec_v6->Last = rec_v5->Last;
288   rec_v6->srcport = rec_v5->srcport;
289   rec_v6->dstport = rec_v5->dstport;
290   rec_v6->prot = rec_v5->prot;
291   rec_v6->tos = rec_v5->tos;
292   rec_v6->tcp_flags = rec_v5->tcp_flags;
293   rec_v6->engine_type = rec_v5->engine_type;
294   rec_v6->engine_id = rec_v5->engine_id;
295   rec_v6->src_mask = rec_v5->src_mask;
296   rec_v6->dst_mask = rec_v5->dst_mask;
297   rec_v6->src_as = rec_v5->src_as;
298   rec_v6->dst_as = rec_v5->dst_as;
299 
300 } /* ftrec_xlate_5to6 */
301 
ftrec_xlate_5to1005(struct fts3rec_v5 * rec_v5,struct fts3rec_v1005 * rec_v1005)302 void ftrec_xlate_5to1005(struct fts3rec_v5 *rec_v5,
303   struct fts3rec_v1005 *rec_v1005)
304 {
305 
306   bzero(rec_v1005, sizeof (struct fts3rec_v1005));
307 
308   rec_v1005->unix_secs = rec_v5->unix_secs;
309   rec_v1005->unix_nsecs = rec_v5->unix_nsecs;
310   rec_v1005->sysUpTime = rec_v5->sysUpTime;
311   rec_v1005->exaddr = rec_v5->exaddr;
312   rec_v1005->srcaddr = rec_v5->srcaddr;
313   rec_v1005->dstaddr = rec_v5->dstaddr;
314   rec_v1005->nexthop = rec_v5->nexthop;
315   rec_v1005->input = rec_v5->input;
316   rec_v1005->output = rec_v5->output;
317   rec_v1005->dPkts = rec_v5->dPkts;
318   rec_v1005->dOctets = rec_v5->dOctets;
319   rec_v1005->First = rec_v5->First;
320   rec_v1005->Last = rec_v5->Last;
321   rec_v1005->srcport = rec_v5->srcport;
322   rec_v1005->dstport = rec_v5->dstport;
323   rec_v1005->prot = rec_v5->prot;
324   rec_v1005->tos = rec_v5->tos;
325   rec_v1005->tcp_flags = rec_v5->tcp_flags;
326   rec_v1005->engine_type = rec_v5->engine_type;
327   rec_v1005->engine_id = rec_v5->engine_id;
328   rec_v1005->src_mask = rec_v5->src_mask;
329   rec_v1005->dst_mask = rec_v5->dst_mask;
330   rec_v1005->src_as = rec_v5->src_as;
331   rec_v1005->dst_as = rec_v5->dst_as;
332 
333 } /* ftrec_xlate_5to1005 */
334 
335 
ftrec_xlate_5to7(struct fts3rec_v5 * rec_v5,struct fts3rec_v7 * rec_v7)336 void ftrec_xlate_5to7(struct fts3rec_v5 *rec_v5, struct fts3rec_v7 *rec_v7)
337 {
338 
339   bzero(rec_v7, sizeof (struct fts3rec_v7));
340 
341   rec_v7->unix_secs = rec_v5->unix_secs;
342   rec_v7->unix_nsecs = rec_v5->unix_nsecs;
343   rec_v7->sysUpTime = rec_v5->sysUpTime;
344   rec_v7->exaddr = rec_v5->exaddr;
345   rec_v7->srcaddr = rec_v5->srcaddr;
346   rec_v7->dstaddr = rec_v5->dstaddr;
347   rec_v7->nexthop = rec_v5->nexthop;
348   rec_v7->input = rec_v5->input;
349   rec_v7->output = rec_v5->output;
350   rec_v7->dPkts = rec_v5->dPkts;
351   rec_v7->dOctets = rec_v5->dOctets;
352   rec_v7->First = rec_v5->First;
353   rec_v7->Last = rec_v5->Last;
354   rec_v7->srcport = rec_v5->srcport;
355   rec_v7->dstport = rec_v5->dstport;
356   rec_v7->prot = rec_v5->prot;
357   rec_v7->tos = rec_v5->tos;
358   rec_v7->tcp_flags = rec_v5->tcp_flags;
359   rec_v7->engine_type = rec_v5->engine_type;
360   rec_v7->engine_id = rec_v5->engine_id;
361   rec_v7->src_mask = rec_v5->src_mask;
362   rec_v7->dst_mask = rec_v5->dst_mask;
363   rec_v7->src_as = rec_v5->src_as;
364   rec_v7->dst_as = rec_v5->dst_as;
365 
366 } /* ftrec_xlate_5to7 */
367 
368 
ftrec_xlate_1to5(struct fts3rec_v1 * rec_v1,struct fts3rec_v5 * rec_v5)369 void ftrec_xlate_1to5(struct fts3rec_v1 *rec_v1, struct fts3rec_v5 *rec_v5)
370 {
371 
372   bzero(rec_v5, sizeof (struct fts3rec_v5));
373 
374   rec_v5->unix_secs = rec_v1->unix_secs;
375   rec_v5->unix_nsecs = rec_v1->unix_nsecs;
376   rec_v5->sysUpTime = rec_v1->sysUpTime;
377   rec_v5->exaddr = rec_v1->exaddr;
378   rec_v5->srcaddr = rec_v1->srcaddr;
379   rec_v5->dstaddr = rec_v1->dstaddr;
380   rec_v5->nexthop = rec_v1->nexthop;
381   rec_v5->input = rec_v1->input;
382   rec_v5->output = rec_v5->output;
383   rec_v5->dPkts = rec_v1->dPkts;
384   rec_v5->dOctets = rec_v1->dOctets;
385   rec_v5->First = rec_v1->First;
386   rec_v5->Last = rec_v1->Last;
387   rec_v5->srcport = rec_v1->srcport;
388   rec_v5->dstport = rec_v1->dstport;
389   rec_v5->prot = rec_v1->prot;
390   rec_v5->tos = rec_v1->tos;
391   rec_v5->tcp_flags = rec_v1->tcp_flags;
392 
393 } /* ftrec_xlate_1to5 */
394 
395 
ftrec_xlate_1to6(struct fts3rec_v1 * rec_v1,struct fts3rec_v6 * rec_v6)396 void ftrec_xlate_1to6(struct fts3rec_v1 *rec_v1, struct fts3rec_v6 *rec_v6)
397 {
398 
399   bzero(rec_v6, sizeof (struct fts3rec_v6));
400 
401   rec_v6->unix_secs = rec_v1->unix_secs;
402   rec_v6->unix_nsecs = rec_v1->unix_nsecs;
403   rec_v6->sysUpTime = rec_v1->sysUpTime;
404   rec_v6->exaddr = rec_v1->exaddr;
405   rec_v6->srcaddr = rec_v1->srcaddr;
406   rec_v6->dstaddr = rec_v1->dstaddr;
407   rec_v6->nexthop = rec_v1->nexthop;
408   rec_v6->input = rec_v1->input;
409   rec_v6->output = rec_v6->output;
410   rec_v6->dPkts = rec_v1->dPkts;
411   rec_v6->dOctets = rec_v1->dOctets;
412   rec_v6->First = rec_v1->First;
413   rec_v6->Last = rec_v1->Last;
414   rec_v6->srcport = rec_v1->srcport;
415   rec_v6->dstport = rec_v1->dstport;
416   rec_v6->prot = rec_v1->prot;
417   rec_v6->tos = rec_v1->tos;
418   rec_v6->tcp_flags = rec_v1->tcp_flags;
419 
420 } /* ftrec_xlate_1to6 */
421 
ftrec_xlate_1to7(struct fts3rec_v1 * rec_v1,struct fts3rec_v7 * rec_v7)422 void ftrec_xlate_1to7(struct fts3rec_v1 *rec_v1, struct fts3rec_v7 *rec_v7)
423 {
424 
425   bzero(rec_v7, sizeof (struct fts3rec_v7));
426 
427   rec_v7->unix_secs = rec_v1->unix_secs;
428   rec_v7->unix_nsecs = rec_v1->unix_nsecs;
429   rec_v7->sysUpTime = rec_v1->sysUpTime;
430   rec_v7->exaddr = rec_v1->exaddr;
431   rec_v7->srcaddr = rec_v1->srcaddr;
432   rec_v7->dstaddr = rec_v1->dstaddr;
433   rec_v7->nexthop = rec_v1->nexthop;
434   rec_v7->input = rec_v1->input;
435   rec_v7->output = rec_v7->output;
436   rec_v7->dPkts = rec_v1->dPkts;
437   rec_v7->dOctets = rec_v1->dOctets;
438   rec_v7->First = rec_v1->First;
439   rec_v7->Last = rec_v1->Last;
440   rec_v7->srcport = rec_v1->srcport;
441   rec_v7->dstport = rec_v1->dstport;
442   rec_v7->prot = rec_v1->prot;
443   rec_v7->tos = rec_v1->tos;
444   rec_v7->tcp_flags = rec_v1->tcp_flags;
445 
446 } /* ftrec_xlate_1to7 */
447 
ftrec_xlate_1to1005(struct fts3rec_v1 * rec_v1,struct fts3rec_v1005 * rec_v1005)448 void ftrec_xlate_1to1005(struct fts3rec_v1 *rec_v1,
449   struct fts3rec_v1005 *rec_v1005)
450 {
451 
452   bzero(rec_v1005, sizeof (struct fts3rec_v1005));
453 
454   rec_v1005->unix_secs = rec_v1->unix_secs;
455   rec_v1005->unix_nsecs = rec_v1->unix_nsecs;
456   rec_v1005->sysUpTime = rec_v1->sysUpTime;
457   rec_v1005->exaddr = rec_v1->exaddr;
458   rec_v1005->srcaddr = rec_v1->srcaddr;
459   rec_v1005->dstaddr = rec_v1->dstaddr;
460   rec_v1005->nexthop = rec_v1->nexthop;
461   rec_v1005->input = rec_v1->input;
462   rec_v1005->output = rec_v1->output;
463   rec_v1005->dPkts = rec_v1->dPkts;
464   rec_v1005->dOctets = rec_v1->dOctets;
465   rec_v1005->First = rec_v1->First;
466   rec_v1005->Last = rec_v1->Last;
467   rec_v1005->srcport = rec_v1->srcport;
468   rec_v1005->dstport = rec_v1->dstport;
469   rec_v1005->prot = rec_v1->prot;
470   rec_v1005->tos = rec_v1->tos;
471   rec_v1005->tcp_flags = rec_v1->tcp_flags;
472 
473 } /* ftrec_xlate_1to1005 */
474 
ftrec_xlate_6to1(struct fts3rec_v6 * rec_v6,struct fts3rec_v1 * rec_v1)475 void ftrec_xlate_6to1(struct fts3rec_v6 *rec_v6, struct fts3rec_v1 *rec_v1)
476 {
477 
478   bzero(rec_v1, sizeof (struct fts3rec_v1));
479 
480   rec_v1->unix_secs = rec_v6->unix_secs;
481   rec_v1->unix_nsecs = rec_v6->unix_nsecs;
482   rec_v1->sysUpTime = rec_v6->sysUpTime;
483   rec_v1->exaddr = rec_v6->exaddr;
484   rec_v1->srcaddr = rec_v6->srcaddr;
485   rec_v1->dstaddr = rec_v6->dstaddr;
486   rec_v1->nexthop = rec_v6->nexthop;
487   rec_v1->input = rec_v6->input;
488   rec_v1->output = rec_v6->output;
489   rec_v1->dPkts = rec_v6->dPkts;
490   rec_v1->dOctets = rec_v6->dOctets;
491   rec_v1->First = rec_v6->First;
492   rec_v1->Last = rec_v6->Last;
493   rec_v1->srcport = rec_v6->srcport;
494   rec_v1->dstport = rec_v6->dstport;
495   rec_v1->prot = rec_v6->prot;
496   rec_v1->tos = rec_v6->tos;
497   rec_v1->tcp_flags = rec_v6->tcp_flags;
498 
499 } /* ftrec_xlate_6to1 */
500 
ftrec_xlate_6to5(struct fts3rec_v6 * rec_v6,struct fts3rec_v5 * rec_v5)501 void ftrec_xlate_6to5(struct fts3rec_v6 *rec_v6, struct fts3rec_v5 *rec_v5)
502 {
503 
504   bzero(rec_v5, sizeof (struct fts3rec_v5));
505 
506   rec_v5->unix_secs = rec_v6->unix_secs;
507   rec_v5->unix_nsecs = rec_v6->unix_nsecs;
508   rec_v5->sysUpTime = rec_v6->sysUpTime;
509   rec_v5->exaddr = rec_v6->exaddr;
510   rec_v5->srcaddr = rec_v6->srcaddr;
511   rec_v5->dstaddr = rec_v6->dstaddr;
512   rec_v5->nexthop = rec_v6->nexthop;
513   rec_v5->input = rec_v6->input;
514   rec_v5->output = rec_v6->output;
515   rec_v5->dPkts = rec_v6->dPkts;
516   rec_v5->dOctets = rec_v6->dOctets;
517   rec_v5->First = rec_v6->First;
518   rec_v5->Last = rec_v6->Last;
519   rec_v5->srcport = rec_v6->srcport;
520   rec_v5->dstport = rec_v6->dstport;
521   rec_v5->prot = rec_v6->prot;
522   rec_v5->tos = rec_v6->tos;
523   rec_v5->tcp_flags = rec_v6->tcp_flags;
524   rec_v5->engine_type = rec_v6->engine_type;
525   rec_v5->engine_id = rec_v6->engine_id;
526   rec_v5->src_mask = rec_v6->src_mask;
527   rec_v5->dst_mask = rec_v6->dst_mask;
528   rec_v5->src_as = rec_v6->src_as;
529   rec_v5->dst_as = rec_v6->dst_as;
530 
531 } /* ftrec_xlate_6to5 */
532 
ftrec_xlate_6to7(struct fts3rec_v6 * rec_v6,struct fts3rec_v7 * rec_v7)533 void ftrec_xlate_6to7(struct fts3rec_v6 *rec_v6, struct fts3rec_v7 *rec_v7)
534 {
535 
536   bzero(rec_v7, sizeof (struct fts3rec_v7));
537 
538   rec_v7->unix_secs = rec_v6->unix_secs;
539   rec_v7->unix_nsecs = rec_v6->unix_nsecs;
540   rec_v7->sysUpTime = rec_v6->sysUpTime;
541   rec_v7->exaddr = rec_v6->exaddr;
542   rec_v7->srcaddr = rec_v6->srcaddr;
543   rec_v7->dstaddr = rec_v6->dstaddr;
544   rec_v7->nexthop = rec_v6->nexthop;
545   rec_v7->input = rec_v6->input;
546   rec_v7->output = rec_v6->output;
547   rec_v7->dPkts = rec_v6->dPkts;
548   rec_v7->dOctets = rec_v6->dOctets;
549   rec_v7->First = rec_v6->First;
550   rec_v7->Last = rec_v6->Last;
551   rec_v7->srcport = rec_v6->srcport;
552   rec_v7->dstport = rec_v6->dstport;
553   rec_v7->prot = rec_v6->prot;
554   rec_v7->tos = rec_v6->tos;
555   rec_v7->tcp_flags = rec_v6->tcp_flags;
556   rec_v7->engine_type = rec_v6->engine_type;
557   rec_v7->engine_id = rec_v6->engine_id;
558   rec_v7->src_mask = rec_v6->src_mask;
559   rec_v7->dst_mask = rec_v6->dst_mask;
560   rec_v7->src_as = rec_v6->src_as;
561   rec_v7->dst_as = rec_v6->dst_as;
562 
563 } /* ftrec_xlate_6to7 */
564 
ftrec_xlate_6to1005(struct fts3rec_v6 * rec_v6,struct fts3rec_v1005 * rec_v1005)565 void ftrec_xlate_6to1005(struct fts3rec_v6 *rec_v6,
566   struct fts3rec_v1005 *rec_v1005)
567 {
568 
569   bzero(rec_v1005, sizeof (struct fts3rec_v1005));
570 
571   rec_v1005->unix_secs = rec_v6->unix_secs;
572   rec_v1005->unix_nsecs = rec_v6->unix_nsecs;
573   rec_v1005->sysUpTime = rec_v6->sysUpTime;
574   rec_v1005->exaddr = rec_v6->exaddr;
575   rec_v1005->srcaddr = rec_v6->srcaddr;
576   rec_v1005->dstaddr = rec_v6->dstaddr;
577   rec_v1005->nexthop = rec_v6->nexthop;
578   rec_v1005->input = rec_v6->input;
579   rec_v1005->output = rec_v6->output;
580   rec_v1005->dPkts = rec_v6->dPkts;
581   rec_v1005->dOctets = rec_v6->dOctets;
582   rec_v1005->First = rec_v6->First;
583   rec_v1005->Last = rec_v6->Last;
584   rec_v1005->srcport = rec_v6->srcport;
585   rec_v1005->dstport = rec_v6->dstport;
586   rec_v1005->prot = rec_v6->prot;
587   rec_v1005->tos = rec_v6->tos;
588   rec_v1005->tcp_flags = rec_v6->tcp_flags;
589   rec_v1005->engine_type = rec_v6->engine_type;
590   rec_v1005->engine_id = rec_v6->engine_id;
591   rec_v1005->src_mask = rec_v6->src_mask;
592   rec_v1005->dst_mask = rec_v6->dst_mask;
593   rec_v1005->src_as = rec_v6->src_as;
594   rec_v1005->dst_as = rec_v6->dst_as;
595 
596 } /* ftrec_xlate_6to1005 */
597 
ftrec_xlate_7to1(struct fts3rec_v7 * rec_v7,struct fts3rec_v1 * rec_v1)598 void ftrec_xlate_7to1(struct fts3rec_v7 *rec_v7, struct fts3rec_v1 *rec_v1)
599 {
600 
601   bzero(rec_v1, sizeof (struct fts3rec_v1));
602 
603   rec_v1->unix_secs = rec_v7->unix_secs;
604   rec_v1->unix_nsecs = rec_v7->unix_nsecs;
605   rec_v1->sysUpTime = rec_v7->sysUpTime;
606   rec_v1->exaddr = rec_v7->exaddr;
607   rec_v1->srcaddr = rec_v7->srcaddr;
608   rec_v1->dstaddr = rec_v7->dstaddr;
609   rec_v1->nexthop = rec_v7->nexthop;
610   rec_v1->input = rec_v7->input;
611   rec_v1->output = rec_v7->output;
612   rec_v1->dPkts = rec_v7->dPkts;
613   rec_v1->dOctets = rec_v7->dOctets;
614   rec_v1->First = rec_v7->First;
615   rec_v1->Last = rec_v7->Last;
616   rec_v1->srcport = rec_v7->srcport;
617   rec_v1->dstport = rec_v7->dstport;
618   rec_v1->prot = rec_v7->prot;
619   rec_v1->tos = rec_v7->tos;
620   rec_v1->tcp_flags = rec_v7->tcp_flags;
621 
622 } /* ftrec_xlate_7to1 */
623 
624 
ftrec_xlate_7to5(struct fts3rec_v7 * rec_v7,struct fts3rec_v5 * rec_v5)625 void ftrec_xlate_7to5(struct fts3rec_v7 *rec_v7, struct fts3rec_v5 *rec_v5)
626 {
627 
628   bzero(rec_v5, sizeof (struct fts3rec_v5));
629 
630   rec_v5->unix_secs = rec_v7->unix_secs;
631   rec_v5->unix_nsecs = rec_v7->unix_nsecs;
632   rec_v5->sysUpTime = rec_v7->sysUpTime;
633   rec_v5->exaddr = rec_v7->exaddr;
634   rec_v5->srcaddr = rec_v7->srcaddr;
635   rec_v5->dstaddr = rec_v7->dstaddr;
636   rec_v5->nexthop = rec_v7->nexthop;
637   rec_v5->input = rec_v7->input;
638   rec_v5->output = rec_v7->output;
639   rec_v5->dPkts = rec_v7->dPkts;
640   rec_v5->dOctets = rec_v7->dOctets;
641   rec_v5->First = rec_v7->First;
642   rec_v5->Last = rec_v7->Last;
643   rec_v5->srcport = rec_v7->srcport;
644   rec_v5->dstport = rec_v7->dstport;
645   rec_v5->prot = rec_v7->prot;
646   rec_v5->tos = rec_v7->tos;
647   rec_v5->tcp_flags = rec_v7->tcp_flags;
648   rec_v5->engine_type = rec_v7->engine_type;
649   rec_v5->engine_id = rec_v7->engine_id;
650   rec_v5->src_mask = rec_v7->src_mask;
651   rec_v5->dst_mask = rec_v7->dst_mask;
652   rec_v5->src_as = rec_v7->src_as;
653   rec_v5->dst_as = rec_v7->dst_as;
654 
655 } /* ftrec_xlate_7to5 */
656 
ftrec_xlate_7to6(struct fts3rec_v7 * rec_v7,struct fts3rec_v6 * rec_v6)657 void ftrec_xlate_7to6(struct fts3rec_v7 *rec_v7, struct fts3rec_v6 *rec_v6)
658 {
659 
660   bzero(rec_v6, sizeof (struct fts3rec_v6));
661 
662   rec_v6->unix_secs = rec_v7->unix_secs;
663   rec_v6->unix_nsecs = rec_v7->unix_nsecs;
664   rec_v6->sysUpTime = rec_v7->sysUpTime;
665   rec_v6->exaddr = rec_v7->exaddr;
666   rec_v6->srcaddr = rec_v7->srcaddr;
667   rec_v6->dstaddr = rec_v7->dstaddr;
668   rec_v6->nexthop = rec_v7->nexthop;
669   rec_v6->input = rec_v7->input;
670   rec_v6->output = rec_v7->output;
671   rec_v6->dPkts = rec_v7->dPkts;
672   rec_v6->dOctets = rec_v7->dOctets;
673   rec_v6->First = rec_v7->First;
674   rec_v6->Last = rec_v7->Last;
675   rec_v6->srcport = rec_v7->srcport;
676   rec_v6->dstport = rec_v7->dstport;
677   rec_v6->prot = rec_v7->prot;
678   rec_v6->tos = rec_v7->tos;
679   rec_v6->tcp_flags = rec_v7->tcp_flags;
680   rec_v6->engine_type = rec_v7->engine_type;
681   rec_v6->engine_id = rec_v7->engine_id;
682   rec_v6->src_mask = rec_v7->src_mask;
683   rec_v6->dst_mask = rec_v7->dst_mask;
684   rec_v6->src_as = rec_v7->src_as;
685   rec_v6->dst_as = rec_v7->dst_as;
686 
687 } /* ftrec_xlate_7to6 */
688 
ftrec_xlate_7to1005(struct fts3rec_v7 * rec_v7,struct fts3rec_v1005 * rec_v1005)689 void ftrec_xlate_7to1005(struct fts3rec_v7 *rec_v7,
690   struct fts3rec_v1005 *rec_v1005)
691 {
692 
693   bzero(rec_v1005, sizeof (struct fts3rec_v1005));
694 
695   rec_v1005->unix_secs = rec_v7->unix_secs;
696   rec_v1005->unix_nsecs = rec_v7->unix_nsecs;
697   rec_v1005->sysUpTime = rec_v7->sysUpTime;
698   rec_v1005->exaddr = rec_v7->exaddr;
699   rec_v1005->srcaddr = rec_v7->srcaddr;
700   rec_v1005->dstaddr = rec_v7->dstaddr;
701   rec_v1005->nexthop = rec_v7->nexthop;
702   rec_v1005->input = rec_v7->input;
703   rec_v1005->output = rec_v7->output;
704   rec_v1005->dPkts = rec_v7->dPkts;
705   rec_v1005->dOctets = rec_v7->dOctets;
706   rec_v1005->First = rec_v7->First;
707   rec_v1005->Last = rec_v7->Last;
708   rec_v1005->srcport = rec_v7->srcport;
709   rec_v1005->dstport = rec_v7->dstport;
710   rec_v1005->prot = rec_v7->prot;
711   rec_v1005->tos = rec_v7->tos;
712   rec_v1005->tcp_flags = rec_v7->tcp_flags;
713   rec_v1005->engine_type = rec_v7->engine_type;
714   rec_v1005->engine_id = rec_v7->engine_id;
715   rec_v1005->src_mask = rec_v7->src_mask;
716   rec_v1005->dst_mask = rec_v7->dst_mask;
717   rec_v1005->src_as = rec_v7->src_as;
718   rec_v1005->dst_as = rec_v7->dst_as;
719 
720 } /* ftrec_xlate_7to1005 */
721 
ftrec_xlate_1005to5(struct fts3rec_v1005 * rec_v1005,struct fts3rec_v5 * rec_v5)722 void ftrec_xlate_1005to5(struct fts3rec_v1005 *rec_v1005,
723   struct fts3rec_v5 *rec_v5)
724 {
725   bzero(rec_v5, sizeof (struct fts3rec_v5));
726 
727   rec_v5->unix_secs = rec_v1005->unix_secs;
728   rec_v5->unix_nsecs = rec_v1005->unix_nsecs;
729   rec_v5->sysUpTime = rec_v1005->sysUpTime;
730   rec_v5->exaddr = rec_v1005->exaddr;
731   rec_v5->srcaddr = rec_v1005->srcaddr;
732   rec_v5->dstaddr = rec_v1005->dstaddr;
733   rec_v5->nexthop = rec_v1005->nexthop;
734   rec_v5->input = rec_v1005->input;
735   rec_v5->output = rec_v1005->output;
736   rec_v5->dPkts = rec_v1005->dPkts;
737   rec_v5->dOctets = rec_v1005->dOctets;
738   rec_v5->First = rec_v1005->First;
739   rec_v5->Last = rec_v1005->Last;
740   rec_v5->srcport = rec_v1005->srcport;
741   rec_v5->dstport = rec_v1005->dstport;
742   rec_v5->prot = rec_v1005->prot;
743   rec_v5->tos = rec_v1005->tos;
744   rec_v5->tcp_flags = rec_v1005->tcp_flags;
745   rec_v5->engine_type = rec_v1005->engine_type;
746   rec_v5->engine_id = rec_v1005->engine_id;
747   rec_v5->src_mask = rec_v1005->src_mask;
748   rec_v5->dst_mask = rec_v1005->dst_mask;
749   rec_v5->src_as = rec_v1005->src_as;
750   rec_v5->dst_as = rec_v1005->dst_as;
751 
752 } /* flow_xlate_1005to5 */
753 
754 /*
755  * function fts3rec_compute_offsets
756  *
757  * populate a fts3rec_offset structure with structure offsets appropriate
758  * for the version in ftv.
759  *
760  * returns 0 for success, < 0 otherwise.
761  */
fts3rec_compute_offsets(struct fts3rec_offsets * o,struct ftver * ftv)762 int fts3rec_compute_offsets(struct fts3rec_offsets *o, struct ftver *ftv)
763 {
764   int ret;
765 
766   ret = -1;
767 
768   switch (ftv->d_version) {
769 
770     case 1:
771       FT_OFFSET(unix_secs, fts3rec_v1)
772       FT_OFFSET(unix_nsecs, fts3rec_v1)
773       FT_OFFSET(sysUpTime, fts3rec_v1)
774       FT_OFFSET(exaddr, fts3rec_v1)
775       FT_OFFSET(srcaddr, fts3rec_v1)
776       FT_OFFSET(dstaddr, fts3rec_v1)
777       FT_OFFSET(nexthop, fts3rec_v1)
778       FT_OFFSET(input, fts3rec_v1)
779       FT_OFFSET(output, fts3rec_v1)
780       FT_OFFSET(dPkts, fts3rec_v1)
781       FT_OFFSET(dOctets, fts3rec_v1)
782       FT_OFFSET(First, fts3rec_v1)
783       FT_OFFSET(Last, fts3rec_v1)
784       FT_OFFSET(srcport, fts3rec_v1)
785       FT_OFFSET(dstport, fts3rec_v1)
786       FT_OFFSET(prot, fts3rec_v1)
787       FT_OFFSET(tos, fts3rec_v1)
788       FT_OFFSET(tcp_flags, fts3rec_v1)
789       ret = 0;
790       break;
791 
792     case 5:
793       FT_OFFSET(unix_secs, fts3rec_v5)
794       FT_OFFSET(unix_nsecs, fts3rec_v5)
795       FT_OFFSET(sysUpTime, fts3rec_v5)
796       FT_OFFSET(exaddr, fts3rec_v5)
797       FT_OFFSET(srcaddr, fts3rec_v5)
798       FT_OFFSET(dstaddr, fts3rec_v5)
799       FT_OFFSET(nexthop, fts3rec_v5)
800       FT_OFFSET(input, fts3rec_v5)
801       FT_OFFSET(output, fts3rec_v5)
802       FT_OFFSET(dPkts, fts3rec_v5)
803       FT_OFFSET(dOctets, fts3rec_v5)
804       FT_OFFSET(First, fts3rec_v5)
805       FT_OFFSET(Last, fts3rec_v5)
806       FT_OFFSET(srcport, fts3rec_v5)
807       FT_OFFSET(dstport, fts3rec_v5)
808       FT_OFFSET(prot, fts3rec_v5)
809       FT_OFFSET(tos, fts3rec_v5)
810       FT_OFFSET(tcp_flags, fts3rec_v5)
811       FT_OFFSET(engine_type, fts3rec_v5)
812       FT_OFFSET(engine_id, fts3rec_v5)
813       FT_OFFSET(src_mask, fts3rec_v5)
814       FT_OFFSET(dst_mask, fts3rec_v5)
815       FT_OFFSET(src_as, fts3rec_v5)
816       FT_OFFSET(dst_as, fts3rec_v5)
817       ret = 0;
818       break;
819 
820     case 6:
821       FT_OFFSET(unix_secs, fts3rec_v6)
822       FT_OFFSET(unix_nsecs, fts3rec_v6)
823       FT_OFFSET(sysUpTime, fts3rec_v6)
824       FT_OFFSET(exaddr, fts3rec_v6)
825       FT_OFFSET(srcaddr, fts3rec_v6)
826       FT_OFFSET(dstaddr, fts3rec_v6)
827       FT_OFFSET(nexthop, fts3rec_v6)
828       FT_OFFSET(input, fts3rec_v6)
829       FT_OFFSET(output, fts3rec_v6)
830       FT_OFFSET(dPkts, fts3rec_v6)
831       FT_OFFSET(dOctets, fts3rec_v6)
832       FT_OFFSET(First, fts3rec_v6)
833       FT_OFFSET(Last, fts3rec_v6)
834       FT_OFFSET(srcport, fts3rec_v6)
835       FT_OFFSET(dstport, fts3rec_v6)
836       FT_OFFSET(prot, fts3rec_v6)
837       FT_OFFSET(tos, fts3rec_v6)
838       FT_OFFSET(tcp_flags, fts3rec_v6)
839       FT_OFFSET(engine_type, fts3rec_v6)
840       FT_OFFSET(engine_id, fts3rec_v6)
841       FT_OFFSET(src_mask, fts3rec_v6)
842       FT_OFFSET(dst_mask, fts3rec_v6)
843       FT_OFFSET(src_as, fts3rec_v6)
844       FT_OFFSET(dst_as, fts3rec_v6)
845       FT_OFFSET(in_encaps, fts3rec_v6)
846       FT_OFFSET(out_encaps, fts3rec_v6)
847       FT_OFFSET(peer_nexthop, fts3rec_v6)
848       ret = 0;
849       break;
850 
851     case 7:
852       FT_OFFSET(unix_secs, fts3rec_v7)
853       FT_OFFSET(unix_nsecs, fts3rec_v7)
854       FT_OFFSET(sysUpTime, fts3rec_v7)
855       FT_OFFSET(exaddr, fts3rec_v7)
856       FT_OFFSET(srcaddr, fts3rec_v7)
857       FT_OFFSET(dstaddr, fts3rec_v7)
858       FT_OFFSET(nexthop, fts3rec_v7)
859       FT_OFFSET(input, fts3rec_v7)
860       FT_OFFSET(output, fts3rec_v7)
861       FT_OFFSET(dPkts, fts3rec_v7)
862       FT_OFFSET(dOctets, fts3rec_v7)
863       FT_OFFSET(First, fts3rec_v7)
864       FT_OFFSET(Last, fts3rec_v7)
865       FT_OFFSET(srcport, fts3rec_v7)
866       FT_OFFSET(dstport, fts3rec_v7)
867       FT_OFFSET(prot, fts3rec_v7)
868       FT_OFFSET(tos, fts3rec_v7)
869       FT_OFFSET(tcp_flags, fts3rec_v7)
870       FT_OFFSET(engine_type, fts3rec_v7)
871       FT_OFFSET(engine_id, fts3rec_v7)
872       FT_OFFSET(src_mask, fts3rec_v7)
873       FT_OFFSET(dst_mask, fts3rec_v7)
874       FT_OFFSET(src_as, fts3rec_v7)
875       FT_OFFSET(dst_as, fts3rec_v7)
876       FT_OFFSET(router_sc, fts3rec_v7)
877       ret = 0;
878       break;
879 
880     case 8:
881 
882       switch (ftv->agg_method) {
883 
884         case 1:
885           FT_OFFSET(unix_secs, fts3rec_v8_1)
886           FT_OFFSET(unix_nsecs, fts3rec_v8_1)
887           FT_OFFSET(sysUpTime, fts3rec_v8_1)
888           FT_OFFSET(exaddr, fts3rec_v8_1)
889           FT_OFFSET(dFlows, fts3rec_v8_1)
890           FT_OFFSET(dOctets, fts3rec_v8_1)
891           FT_OFFSET(dPkts, fts3rec_v8_1)
892           FT_OFFSET(First, fts3rec_v8_1)
893           FT_OFFSET(Last, fts3rec_v8_1)
894           FT_OFFSET(src_as, fts3rec_v8_1)
895           FT_OFFSET(dst_as, fts3rec_v8_1)
896           FT_OFFSET(input, fts3rec_v8_1)
897           FT_OFFSET(output, fts3rec_v8_1)
898           FT_OFFSET(engine_id, fts3rec_v8_1)
899           FT_OFFSET(engine_type, fts3rec_v8_1)
900           ret = 0;
901           break;
902 
903         case 2:
904           FT_OFFSET(unix_secs, fts3rec_v8_2)
905           FT_OFFSET(unix_nsecs, fts3rec_v8_2)
906           FT_OFFSET(sysUpTime, fts3rec_v8_2)
907           FT_OFFSET(exaddr, fts3rec_v8_2)
908           FT_OFFSET(dFlows, fts3rec_v8_2)
909           FT_OFFSET(dOctets, fts3rec_v8_2)
910           FT_OFFSET(dPkts, fts3rec_v8_2)
911           FT_OFFSET(First, fts3rec_v8_2)
912           FT_OFFSET(Last, fts3rec_v8_2)
913           FT_OFFSET(prot, fts3rec_v8_2)
914           FT_OFFSET(srcport, fts3rec_v8_2)
915           FT_OFFSET(dstport, fts3rec_v8_2)
916           FT_OFFSET(engine_id, fts3rec_v8_2)
917           FT_OFFSET(engine_type, fts3rec_v8_2)
918           ret = 0;
919           break;
920 
921         case 3:
922           FT_OFFSET(unix_secs, fts3rec_v8_3)
923           FT_OFFSET(unix_nsecs, fts3rec_v8_3)
924           FT_OFFSET(sysUpTime, fts3rec_v8_3)
925           FT_OFFSET(exaddr, fts3rec_v8_3)
926           FT_OFFSET(dFlows, fts3rec_v8_3)
927           FT_OFFSET(dOctets, fts3rec_v8_3)
928           FT_OFFSET(dPkts, fts3rec_v8_3)
929           FT_OFFSET(First, fts3rec_v8_3)
930           FT_OFFSET(Last, fts3rec_v8_3)
931           FT_OFFSET(srcaddr, fts3rec_v8_3)
932           FT_OFFSET(src_mask, fts3rec_v8_3)
933           FT_OFFSET(src_as, fts3rec_v8_3)
934           FT_OFFSET(input, fts3rec_v8_3)
935           FT_OFFSET(engine_id, fts3rec_v8_3)
936           FT_OFFSET(engine_type, fts3rec_v8_3)
937           ret = 0;
938           break;
939 
940         case 4:
941           FT_OFFSET(unix_secs, fts3rec_v8_4)
942           FT_OFFSET(unix_nsecs, fts3rec_v8_4)
943           FT_OFFSET(sysUpTime, fts3rec_v8_4)
944           FT_OFFSET(exaddr, fts3rec_v8_4)
945           FT_OFFSET(dFlows, fts3rec_v8_4)
946           FT_OFFSET(dOctets, fts3rec_v8_4)
947           FT_OFFSET(dPkts, fts3rec_v8_4)
948           FT_OFFSET(First, fts3rec_v8_4)
949           FT_OFFSET(Last, fts3rec_v8_4)
950           FT_OFFSET(dstaddr, fts3rec_v8_4)
951           FT_OFFSET(dst_mask, fts3rec_v8_4)
952           FT_OFFSET(dst_as, fts3rec_v8_4)
953           FT_OFFSET(output, fts3rec_v8_4)
954           FT_OFFSET(engine_id, fts3rec_v8_4)
955           FT_OFFSET(engine_type, fts3rec_v8_4)
956           ret = 0;
957           break;
958 
959         case 5:
960           FT_OFFSET(unix_secs, fts3rec_v8_5)
961           FT_OFFSET(unix_nsecs, fts3rec_v8_5)
962           FT_OFFSET(sysUpTime, fts3rec_v8_5)
963           FT_OFFSET(exaddr, fts3rec_v8_5)
964           FT_OFFSET(dFlows, fts3rec_v8_5)
965           FT_OFFSET(dOctets, fts3rec_v8_5)
966           FT_OFFSET(dPkts, fts3rec_v8_5)
967           FT_OFFSET(First, fts3rec_v8_5)
968           FT_OFFSET(Last, fts3rec_v8_5)
969           FT_OFFSET(srcaddr, fts3rec_v8_5)
970           FT_OFFSET(src_mask, fts3rec_v8_5)
971           FT_OFFSET(src_as, fts3rec_v8_5)
972           FT_OFFSET(dstaddr, fts3rec_v8_5)
973           FT_OFFSET(dst_mask, fts3rec_v8_5)
974           FT_OFFSET(dst_as, fts3rec_v8_5)
975           FT_OFFSET(input, fts3rec_v8_5)
976           FT_OFFSET(output, fts3rec_v8_5)
977           FT_OFFSET(engine_id, fts3rec_v8_5)
978           FT_OFFSET(engine_type, fts3rec_v8_5)
979           ret = 0;
980           break;
981 
982         case 6:
983           FT_OFFSET(unix_secs, fts3rec_v8_6)
984           FT_OFFSET(unix_nsecs, fts3rec_v8_6)
985           FT_OFFSET(sysUpTime, fts3rec_v8_6)
986           FT_OFFSET(exaddr, fts3rec_v8_6)
987           FT_OFFSET(dPkts, fts3rec_v8_6)
988           FT_OFFSET(dOctets, fts3rec_v8_6)
989           FT_OFFSET(First, fts3rec_v8_6)
990           FT_OFFSET(Last, fts3rec_v8_6)
991           FT_OFFSET(dstaddr, fts3rec_v8_6)
992           FT_OFFSET(extra_pkts, fts3rec_v8_6)
993           FT_OFFSET(router_sc, fts3rec_v8_6)
994           FT_OFFSET(output, fts3rec_v8_6)
995           FT_OFFSET(tos, fts3rec_v8_6)
996           FT_OFFSET(marked_tos, fts3rec_v8_6)
997           FT_OFFSET(engine_type, fts3rec_v8_6)
998           FT_OFFSET(engine_id, fts3rec_v8_6)
999           ret = 0;
1000           break;
1001 
1002         case 7:
1003           FT_OFFSET(unix_secs, fts3rec_v8_7)
1004           FT_OFFSET(unix_nsecs, fts3rec_v8_7)
1005           FT_OFFSET(sysUpTime, fts3rec_v8_7)
1006           FT_OFFSET(exaddr, fts3rec_v8_7)
1007           FT_OFFSET(dPkts, fts3rec_v8_7)
1008           FT_OFFSET(dOctets, fts3rec_v8_7)
1009           FT_OFFSET(First, fts3rec_v8_7)
1010           FT_OFFSET(Last, fts3rec_v8_7)
1011           FT_OFFSET(dstaddr, fts3rec_v8_7)
1012           FT_OFFSET(srcaddr, fts3rec_v8_7)
1013           FT_OFFSET(extra_pkts, fts3rec_v8_7)
1014           FT_OFFSET(router_sc, fts3rec_v8_7)
1015           FT_OFFSET(output, fts3rec_v8_7)
1016           FT_OFFSET(input, fts3rec_v8_7)
1017           FT_OFFSET(tos, fts3rec_v8_7)
1018           FT_OFFSET(marked_tos, fts3rec_v8_7)
1019           FT_OFFSET(engine_type, fts3rec_v8_7)
1020           FT_OFFSET(engine_id, fts3rec_v8_7)
1021           ret = 0;
1022           break;
1023 
1024         case 8:
1025           FT_OFFSET(unix_secs, fts3rec_v8_8)
1026           FT_OFFSET(unix_nsecs, fts3rec_v8_8)
1027           FT_OFFSET(sysUpTime, fts3rec_v8_8)
1028           FT_OFFSET(exaddr, fts3rec_v8_8)
1029           FT_OFFSET(dPkts, fts3rec_v8_8)
1030           FT_OFFSET(dOctets, fts3rec_v8_8)
1031           FT_OFFSET(First, fts3rec_v8_8)
1032           FT_OFFSET(Last, fts3rec_v8_8)
1033           FT_OFFSET(dstaddr, fts3rec_v8_8)
1034           FT_OFFSET(srcaddr, fts3rec_v8_8)
1035           FT_OFFSET(extra_pkts, fts3rec_v8_8)
1036           FT_OFFSET(router_sc, fts3rec_v8_8)
1037           FT_OFFSET(srcport, fts3rec_v8_8)
1038           FT_OFFSET(dstport, fts3rec_v8_8)
1039           FT_OFFSET(output, fts3rec_v8_8)
1040           FT_OFFSET(input, fts3rec_v8_8)
1041           FT_OFFSET(tos, fts3rec_v8_8)
1042           FT_OFFSET(marked_tos, fts3rec_v8_8)
1043           FT_OFFSET(engine_type, fts3rec_v8_8)
1044           FT_OFFSET(engine_id, fts3rec_v8_8)
1045           FT_OFFSET(prot, fts3rec_v8_8)
1046           ret = 0;
1047           break;
1048 
1049         case 9:
1050           FT_OFFSET(unix_secs, fts3rec_v8_9)
1051           FT_OFFSET(unix_nsecs, fts3rec_v8_9)
1052           FT_OFFSET(sysUpTime, fts3rec_v8_9)
1053           FT_OFFSET(exaddr, fts3rec_v8_9)
1054           FT_OFFSET(dFlows, fts3rec_v8_9)
1055           FT_OFFSET(dPkts, fts3rec_v8_9)
1056           FT_OFFSET(dOctets, fts3rec_v8_9)
1057           FT_OFFSET(First, fts3rec_v8_9)
1058           FT_OFFSET(Last, fts3rec_v8_9)
1059           FT_OFFSET(src_as, fts3rec_v8_9)
1060           FT_OFFSET(dst_as, fts3rec_v8_9)
1061           FT_OFFSET(input, fts3rec_v8_9)
1062           FT_OFFSET(output, fts3rec_v8_9)
1063           FT_OFFSET(engine_type, fts3rec_v8_9)
1064           FT_OFFSET(engine_id, fts3rec_v8_9)
1065           FT_OFFSET(tos, fts3rec_v8_9)
1066           ret = 0;
1067           break;
1068 
1069         case 10:
1070           FT_OFFSET(unix_secs, fts3rec_v8_10)
1071           FT_OFFSET(unix_nsecs, fts3rec_v8_10)
1072           FT_OFFSET(sysUpTime, fts3rec_v8_10)
1073           FT_OFFSET(exaddr, fts3rec_v8_10)
1074           FT_OFFSET(dFlows, fts3rec_v8_10)
1075           FT_OFFSET(dPkts, fts3rec_v8_10)
1076           FT_OFFSET(dOctets, fts3rec_v8_10)
1077           FT_OFFSET(First, fts3rec_v8_10)
1078           FT_OFFSET(Last, fts3rec_v8_10)
1079           FT_OFFSET(srcport, fts3rec_v8_10)
1080           FT_OFFSET(dstport, fts3rec_v8_10)
1081           FT_OFFSET(input, fts3rec_v8_10)
1082           FT_OFFSET(output, fts3rec_v8_10)
1083           FT_OFFSET(engine_type, fts3rec_v8_10)
1084           FT_OFFSET(engine_id, fts3rec_v8_10)
1085           FT_OFFSET(prot, fts3rec_v8_10)
1086           FT_OFFSET(tos, fts3rec_v8_10)
1087           ret = 0;
1088           break;
1089 
1090         case 11:
1091           FT_OFFSET(unix_secs, fts3rec_v8_11)
1092           FT_OFFSET(unix_nsecs, fts3rec_v8_11)
1093           FT_OFFSET(sysUpTime, fts3rec_v8_11)
1094           FT_OFFSET(exaddr, fts3rec_v8_11)
1095           FT_OFFSET(dFlows, fts3rec_v8_11)
1096           FT_OFFSET(dPkts, fts3rec_v8_11)
1097           FT_OFFSET(dOctets, fts3rec_v8_11)
1098           FT_OFFSET(First, fts3rec_v8_11)
1099           FT_OFFSET(Last, fts3rec_v8_11)
1100           FT_OFFSET(srcaddr, fts3rec_v8_11)
1101           FT_OFFSET(src_mask, fts3rec_v8_11)
1102           FT_OFFSET(tos, fts3rec_v8_11)
1103           FT_OFFSET(src_as, fts3rec_v8_11)
1104           FT_OFFSET(input, fts3rec_v8_11)
1105           FT_OFFSET(engine_type, fts3rec_v8_11)
1106           FT_OFFSET(engine_id, fts3rec_v8_11)
1107           ret = 0;
1108           break;
1109 
1110         case 12:
1111           FT_OFFSET(unix_secs, fts3rec_v8_12)
1112           FT_OFFSET(unix_nsecs, fts3rec_v8_12)
1113           FT_OFFSET(sysUpTime, fts3rec_v8_12)
1114           FT_OFFSET(exaddr, fts3rec_v8_12)
1115           FT_OFFSET(dFlows, fts3rec_v8_12)
1116           FT_OFFSET(dPkts, fts3rec_v8_12)
1117           FT_OFFSET(dOctets, fts3rec_v8_12)
1118           FT_OFFSET(First, fts3rec_v8_12)
1119           FT_OFFSET(Last, fts3rec_v8_12)
1120           FT_OFFSET(dstaddr, fts3rec_v8_12)
1121           FT_OFFSET(output, fts3rec_v8_12)
1122           FT_OFFSET(dst_as, fts3rec_v8_12)
1123           FT_OFFSET(dst_mask, fts3rec_v8_12)
1124           FT_OFFSET(tos, fts3rec_v8_12)
1125           FT_OFFSET(engine_type, fts3rec_v8_12)
1126           FT_OFFSET(engine_id, fts3rec_v8_12)
1127           ret = 0;
1128           break;
1129 
1130         case 13:
1131           FT_OFFSET(unix_secs, fts3rec_v8_13)
1132           FT_OFFSET(unix_nsecs, fts3rec_v8_13)
1133           FT_OFFSET(sysUpTime, fts3rec_v8_13)
1134           FT_OFFSET(exaddr, fts3rec_v8_13)
1135           FT_OFFSET(dFlows, fts3rec_v8_13)
1136           FT_OFFSET(dPkts, fts3rec_v8_13)
1137           FT_OFFSET(dOctets, fts3rec_v8_13)
1138           FT_OFFSET(First, fts3rec_v8_13)
1139           FT_OFFSET(Last, fts3rec_v8_13)
1140           FT_OFFSET(srcaddr, fts3rec_v8_13)
1141           FT_OFFSET(dstaddr, fts3rec_v8_13)
1142           FT_OFFSET(src_as, fts3rec_v8_13)
1143           FT_OFFSET(dst_as, fts3rec_v8_13)
1144           FT_OFFSET(input, fts3rec_v8_13)
1145           FT_OFFSET(output, fts3rec_v8_13)
1146           FT_OFFSET(dst_mask, fts3rec_v8_13)
1147           FT_OFFSET(src_mask, fts3rec_v8_13)
1148           FT_OFFSET(engine_type, fts3rec_v8_13)
1149           FT_OFFSET(engine_id, fts3rec_v8_13)
1150           FT_OFFSET(tos, fts3rec_v8_13)
1151           ret = 0;
1152           break;
1153 
1154         case 14:
1155           FT_OFFSET(unix_secs, fts3rec_v8_14)
1156           FT_OFFSET(unix_nsecs, fts3rec_v8_14)
1157           FT_OFFSET(sysUpTime, fts3rec_v8_14)
1158           FT_OFFSET(exaddr, fts3rec_v8_14)
1159           FT_OFFSET(dFlows, fts3rec_v8_14)
1160           FT_OFFSET(dPkts, fts3rec_v8_14)
1161           FT_OFFSET(dOctets, fts3rec_v8_14)
1162           FT_OFFSET(First, fts3rec_v8_14)
1163           FT_OFFSET(Last, fts3rec_v8_14)
1164           FT_OFFSET(srcaddr, fts3rec_v8_14)
1165           FT_OFFSET(dstaddr, fts3rec_v8_14)
1166           FT_OFFSET(srcport, fts3rec_v8_14)
1167           FT_OFFSET(dstport, fts3rec_v8_14)
1168           FT_OFFSET(input, fts3rec_v8_14)
1169           FT_OFFSET(output, fts3rec_v8_14)
1170           FT_OFFSET(dst_mask, fts3rec_v8_14)
1171           FT_OFFSET(src_mask, fts3rec_v8_14)
1172           FT_OFFSET(engine_type, fts3rec_v8_14)
1173           FT_OFFSET(engine_id, fts3rec_v8_14)
1174           FT_OFFSET(tos, fts3rec_v8_14)
1175           FT_OFFSET(prot, fts3rec_v8_14)
1176           ret = 0;
1177           break;
1178 
1179       }
1180       break;
1181 
1182     case 1005:
1183       FT_OFFSET(unix_secs, fts3rec_v1005)
1184       FT_OFFSET(unix_nsecs, fts3rec_v1005)
1185       FT_OFFSET(sysUpTime, fts3rec_v1005)
1186       FT_OFFSET(exaddr, fts3rec_v1005)
1187       FT_OFFSET(srcaddr, fts3rec_v1005)
1188       FT_OFFSET(dstaddr, fts3rec_v1005)
1189       FT_OFFSET(nexthop, fts3rec_v1005)
1190       FT_OFFSET(input, fts3rec_v1005)
1191       FT_OFFSET(output, fts3rec_v1005)
1192       FT_OFFSET(dPkts, fts3rec_v1005)
1193       FT_OFFSET(dOctets, fts3rec_v1005)
1194       FT_OFFSET(First, fts3rec_v1005)
1195       FT_OFFSET(Last, fts3rec_v1005)
1196       FT_OFFSET(srcport, fts3rec_v1005)
1197       FT_OFFSET(dstport, fts3rec_v1005)
1198       FT_OFFSET(prot, fts3rec_v1005)
1199       FT_OFFSET(tos, fts3rec_v1005)
1200       FT_OFFSET(tcp_flags, fts3rec_v1005)
1201       FT_OFFSET(engine_type, fts3rec_v1005)
1202       FT_OFFSET(engine_id, fts3rec_v1005)
1203       FT_OFFSET(src_mask, fts3rec_v1005)
1204       FT_OFFSET(dst_mask, fts3rec_v1005)
1205       FT_OFFSET(src_as, fts3rec_v1005)
1206       FT_OFFSET(dst_as, fts3rec_v1005)
1207       FT_OFFSET(src_tag, fts3rec_v1005)
1208       FT_OFFSET(dst_tag, fts3rec_v1005)
1209       ret = 0;
1210       break;
1211 
1212   } /* switch */
1213 
1214   o->xfields = ftrec_xfield(ftv);
1215 
1216   bcopy(ftv, &o->ftv, sizeof *ftv);
1217 
1218   return ret;
1219 
1220 } /* fts3rec_compute_offsets */
1221 
1222