1 /*
2 * Copyright (c) 2017, Peter Haag
3 * Copyright (c) 2014, Peter Haag
4 * Copyright (c) 2009, Peter Haag
5 * Copyright (c) 2004-2008, SWITCH - Teleinformatikdienste fuer Lehre und Forschung
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions are met:
10 *
11 * * Redistributions of source code must retain the above copyright notice,
12 * this list of conditions and the following disclaimer.
13 * * Redistributions in binary form must reproduce the above copyright notice,
14 * this list of conditions and the following disclaimer in the documentation
15 * and/or other materials provided with the distribution.
16 * * Neither the name of the author nor the names of its contributors may be
17 * used to endorse or promote products derived from this software without
18 * specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 * POSSIBILITY OF SUCH DAMAGE.
31 *
32 *
33 */
34
35 static inline void ApplyNetMaskBits(master_record_t *flow_record, int apply_netbits);
36
ApplyNetMaskBits(master_record_t * flow_record,int apply_netbits)37 static inline void ApplyNetMaskBits(master_record_t *flow_record, int apply_netbits) {
38
39 if ( (flow_record->flags & FLAG_IPV6_ADDR ) != 0 ) { // IPv6
40 if ( apply_netbits & 1 ) {
41 uint64_t mask;
42 uint32_t mask_bits = flow_record->src_mask;
43 if ( mask_bits > 64 ) {
44 mask = 0xffffffffffffffffLL << ( 128 - mask_bits );
45 flow_record->V6.srcaddr[1] &= mask;
46 } else {
47 mask = 0xffffffffffffffffLL << ( 64 - mask_bits );
48 flow_record->V6.srcaddr[0] &= mask;
49 flow_record->V6.srcaddr[1] = 0;
50 }
51 }
52 if ( apply_netbits & 2 ) {
53 uint64_t mask;
54 uint32_t mask_bits = flow_record->dst_mask;
55
56 if ( mask_bits > 64 ) {
57 mask = 0xffffffffffffffffLL << ( 128 - mask_bits );
58 flow_record->V6.dstaddr[1] &= mask;
59 } else {
60 mask = 0xffffffffffffffffLL << ( 64 - mask_bits );
61 flow_record->V6.dstaddr[0] &= mask;
62 flow_record->V6.dstaddr[1] = 0;
63 }
64 }
65 } else { // IPv4
66 if ( apply_netbits & 1 ) {
67 uint32_t srcmask = 0xffffffff << ( 32 - flow_record->src_mask );
68 flow_record->V4.srcaddr &= srcmask;
69 }
70 if ( apply_netbits & 2 ) {
71 uint32_t dstmask = 0xffffffff << ( 32 - flow_record->dst_mask );
72 flow_record->V4.dstaddr &= dstmask;
73 }
74 }
75
76 } // End of ApplyNetMaskBits
77
ApplyAggrMask(master_record_t * record,master_record_t * mask)78 static inline void ApplyAggrMask(master_record_t *record, master_record_t *mask) {
79 uint64_t *r = (uint64_t *)record;
80 uint64_t *m = (uint64_t *)mask;
81 int i, max_offset;
82
83 max_offset = offsetof(master_record_t, map_ref) >> 3;
84 for (i=2; i<max_offset; i++) {
85 r[i] &= m[i];
86 }
87
88 } // End of ApplyAggrMask
89