Home
last modified time | relevance | path

Searched refs:tuple (Results 1 – 25 of 63) sorted by relevance

123

/net/ipv4/netfilter/
Dnf_nat_h323.c106 if (addr.ip == ct->tuplehash[dir].tuple.src.u3.ip && in set_sig_addr()
119 &ct->tuplehash[!dir].tuple.dst.u3.ip, in set_sig_addr()
124 tuple.dst.u3, in set_sig_addr()
126 } else if (addr.ip == ct->tuplehash[dir].tuple.dst.u3.ip && in set_sig_addr()
131 &ct->tuplehash[!dir].tuple.src.u3.ip, in set_sig_addr()
136 tuple.src.u3, in set_sig_addr()
158 addr.ip == ct->tuplehash[dir].tuple.src.u3.ip && in set_ras_addr()
159 port == ct->tuplehash[dir].tuple.src.u.udp.port) { in set_ras_addr()
162 &ct->tuplehash[!dir].tuple.dst.u3.ip, in set_ras_addr()
163 ntohs(ct->tuplehash[!dir].tuple.dst.u.udp.port)); in set_ras_addr()
[all …]
Dnf_conntrack_l3proto_ipv4.c35 struct nf_conntrack_tuple *tuple) in ipv4_pkt_to_tuple() argument
44 tuple->src.u3.ip = ap[0]; in ipv4_pkt_to_tuple()
45 tuple->dst.u3.ip = ap[1]; in ipv4_pkt_to_tuple()
50 static bool ipv4_invert_tuple(struct nf_conntrack_tuple *tuple, in ipv4_invert_tuple() argument
53 tuple->src.u3.ip = orig->dst.u3.ip; in ipv4_invert_tuple()
54 tuple->dst.u3.ip = orig->src.u3.ip; in ipv4_invert_tuple()
60 const struct nf_conntrack_tuple *tuple) in ipv4_print_tuple() argument
63 &tuple->src.u3.ip, &tuple->dst.u3.ip); in ipv4_print_tuple()
218 struct nf_conntrack_tuple tuple; in getorigdst() local
220 memset(&tuple, 0, sizeof(tuple)); in getorigdst()
[all …]
Dnf_conntrack_proto_icmp.c33 struct net *net, struct nf_conntrack_tuple *tuple) in icmp_pkt_to_tuple() argument
42 tuple->dst.u.icmp.type = hp->type; in icmp_pkt_to_tuple()
43 tuple->src.u.icmp.id = hp->un.echo.id; in icmp_pkt_to_tuple()
44 tuple->dst.u.icmp.code = hp->code; in icmp_pkt_to_tuple()
61 static bool icmp_invert_tuple(struct nf_conntrack_tuple *tuple, in icmp_invert_tuple() argument
68 tuple->src.u.icmp.id = orig->src.u.icmp.id; in icmp_invert_tuple()
69 tuple->dst.u.icmp.type = invmap[orig->dst.u.icmp.type] - 1; in icmp_invert_tuple()
70 tuple->dst.u.icmp.code = orig->dst.u.icmp.code; in icmp_invert_tuple()
76 const struct nf_conntrack_tuple *tuple) in icmp_print_tuple() argument
79 tuple->dst.u.icmp.type, in icmp_print_tuple()
[all …]
Dnf_nat_proto_icmp.c21 icmp_in_range(const struct nf_conntrack_tuple *tuple, in icmp_in_range() argument
26 return ntohs(tuple->src.u.icmp.id) >= ntohs(min->icmp.id) && in icmp_in_range()
27 ntohs(tuple->src.u.icmp.id) <= ntohs(max->icmp.id); in icmp_in_range()
32 struct nf_conntrack_tuple *tuple, in icmp_unique_tuple() argument
48 tuple->src.u.icmp.id = htons(ntohs(range->min_proto.icmp.id) + in icmp_unique_tuple()
50 if (++i == range_size || !nf_nat_used_tuple(tuple, ct)) in icmp_unique_tuple()
60 const struct nf_conntrack_tuple *tuple, in icmp_manip_pkt() argument
70 hdr->un.echo.id, tuple->src.u.icmp.id, false); in icmp_manip_pkt()
71 hdr->un.echo.id = tuple->src.u.icmp.id; in icmp_manip_pkt()
Dnf_nat_proto_gre.c43 struct nf_conntrack_tuple *tuple, in gre_unique_tuple() argument
58 keyptr = &tuple->src.u.gre.key; in gre_unique_tuple()
60 keyptr = &tuple->dst.u.gre.key; in gre_unique_tuple()
75 if (++i == range_size || !nf_nat_used_tuple(tuple, ct)) in gre_unique_tuple()
88 const struct nf_conntrack_tuple *tuple, in gre_manip_pkt() argument
113 pr_debug("call_id -> 0x%04x\n", ntohs(tuple->dst.u.gre.key)); in gre_manip_pkt()
114 pgreh->call_id = tuple->dst.u.gre.key; in gre_manip_pkt()
/net/netfilter/
Dnf_nat_sip.c105 if (nf_inet_addr_cmp(&ct->tuplehash[dir].tuple.src.u3, addr) && in map_addr()
106 ct->tuplehash[dir].tuple.src.u.udp.port == port) { in map_addr()
107 newaddr = ct->tuplehash[!dir].tuple.dst.u3; in map_addr()
108 newport = ct->tuplehash[!dir].tuple.dst.u.udp.port; in map_addr()
109 } else if (nf_inet_addr_cmp(&ct->tuplehash[dir].tuple.dst.u3, addr) && in map_addr()
110 ct->tuplehash[dir].tuple.dst.u.udp.port == port) { in map_addr()
111 newaddr = ct->tuplehash[!dir].tuple.src.u3; in map_addr()
113 ct->tuplehash[!dir].tuple.src.u.udp.port; in map_addr()
187 &ct->tuplehash[dir].tuple.src.u3) || in nf_nat_sip()
188 port != ct->tuplehash[dir].tuple.src.u.udp.port) in nf_nat_sip()
[all …]
Dnf_conntrack_l3proto_generic.c35 struct nf_conntrack_tuple *tuple) in generic_pkt_to_tuple() argument
37 memset(&tuple->src.u3, 0, sizeof(tuple->src.u3)); in generic_pkt_to_tuple()
38 memset(&tuple->dst.u3, 0, sizeof(tuple->dst.u3)); in generic_pkt_to_tuple()
43 static bool generic_invert_tuple(struct nf_conntrack_tuple *tuple, in generic_invert_tuple() argument
46 memset(&tuple->src.u3, 0, sizeof(tuple->src.u3)); in generic_invert_tuple()
47 memset(&tuple->dst.u3, 0, sizeof(tuple->dst.u3)); in generic_invert_tuple()
53 const struct nf_conntrack_tuple *tuple) in generic_print_tuple() argument
Dnf_conntrack_expect.c80 …tic unsigned int nf_ct_expect_dst_hash(const struct net *n, const struct nf_conntrack_tuple *tuple) in nf_ct_expect_dst_hash() argument
88 hash = jhash2(tuple->dst.u3.all, ARRAY_SIZE(tuple->dst.u3.all), in nf_ct_expect_dst_hash()
89 (((tuple->dst.protonum ^ tuple->src.l3num) << 16) | in nf_ct_expect_dst_hash()
90 (__force __u16)tuple->dst.u.all) ^ seed); in nf_ct_expect_dst_hash()
96 nf_ct_exp_equal(const struct nf_conntrack_tuple *tuple, in nf_ct_exp_equal() argument
101 return nf_ct_tuple_mask_cmp(tuple, &i->tuple, &i->mask) && in nf_ct_exp_equal()
109 const struct nf_conntrack_tuple *tuple) in __nf_ct_expect_find() argument
117 h = nf_ct_expect_dst_hash(net, tuple); in __nf_ct_expect_find()
119 if (nf_ct_exp_equal(tuple, i, zone, net)) in __nf_ct_expect_find()
130 const struct nf_conntrack_tuple *tuple) in nf_ct_expect_find_get() argument
[all …]
Dnf_nat_core.c72 family = ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.l3num; in __nf_nat_decode_session()
124 hash_by_src(const struct net *n, const struct nf_conntrack_tuple *tuple) in hash_by_src() argument
131 hash = jhash2((u32 *)&tuple->src, sizeof(tuple->src) / sizeof(u32), in hash_by_src()
132 tuple->dst.protonum ^ nf_nat_hash_rnd ^ net_hash_mix(n)); in hash_by_src()
139 nf_nat_used_tuple(const struct nf_conntrack_tuple *tuple, in nf_nat_used_tuple() argument
150 nf_ct_invert_tuplepr(&reply, tuple); in nf_nat_used_tuple()
160 const struct nf_conntrack_tuple *tuple, in in_range() argument
167 !l3proto->in_range(tuple, range)) in in_range()
171 l4proto->in_range(tuple, NF_NAT_MANIP_SRC, in in_range()
180 const struct nf_conntrack_tuple *tuple) in same_src() argument
[all …]
Dxt_conntrack.c47 return conntrack_addrcmp(&ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u3, in conntrack_mt_origsrc()
56 return conntrack_addrcmp(&ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.u3, in conntrack_mt_origdst()
65 return conntrack_addrcmp(&ct->tuplehash[IP_CT_DIR_REPLY].tuple.src.u3, in conntrack_mt_replsrc()
74 return conntrack_addrcmp(&ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.u3, in conntrack_mt_repldst()
82 const struct nf_conntrack_tuple *tuple; in ct_proto_port_check() local
84 tuple = &ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple; in ct_proto_port_check()
92 (tuple->src.u.all == info->origsrc_port) ^ in ct_proto_port_check()
97 (tuple->dst.u.all == info->origdst_port) ^ in ct_proto_port_check()
101 tuple = &ct->tuplehash[IP_CT_DIR_REPLY].tuple; in ct_proto_port_check()
104 (tuple->src.u.all == info->replsrc_port) ^ in ct_proto_port_check()
[all …]
Dnf_conntrack_h323_main.c275 memcmp(&addr, &ct->tuplehash[dir].tuple.src.u3, sizeof(addr)) || in expect_rtp_rtcp()
287 &ct->tuplehash[!dir].tuple.src.u3, in expect_rtp_rtcp()
288 &ct->tuplehash[!dir].tuple.dst.u3, in expect_rtp_rtcp()
297 &ct->tuplehash[!dir].tuple.src.u3, in expect_rtp_rtcp()
298 &ct->tuplehash[!dir].tuple.dst.u3, in expect_rtp_rtcp()
301 if (memcmp(&ct->tuplehash[dir].tuple.src.u3, in expect_rtp_rtcp()
302 &ct->tuplehash[!dir].tuple.dst.u3, in expect_rtp_rtcp()
303 sizeof(ct->tuplehash[dir].tuple.src.u3)) && in expect_rtp_rtcp()
314 nf_ct_dump_tuple(&rtp_exp->tuple); in expect_rtp_rtcp()
316 nf_ct_dump_tuple(&rtcp_exp->tuple); in expect_rtp_rtcp()
[all …]
Dnf_conntrack_proto_gre.c85 return km->tuple.src.l3num == t->src.l3num && in gre_key_cmpfn()
86 !memcmp(&km->tuple.src.u3, &t->src.u3, sizeof(t->src.u3)) && in gre_key_cmpfn()
87 !memcmp(&km->tuple.dst.u3, &t->dst.u3, sizeof(t->dst.u3)) && in gre_key_cmpfn()
88 km->tuple.dst.protonum == t->dst.protonum && in gre_key_cmpfn()
89 km->tuple.dst.u.all == t->dst.u.all; in gre_key_cmpfn()
102 key = km->tuple.src.u.gre.key; in gre_keymap_lookup()
142 memcpy(&km->tuple, t, sizeof(*t)); in nf_ct_gre_keymap_add()
146 nf_ct_dump_tuple(&km->tuple); in nf_ct_gre_keymap_add()
183 static bool gre_invert_tuple(struct nf_conntrack_tuple *tuple, in gre_invert_tuple() argument
186 tuple->dst.u.gre.key = orig->src.u.gre.key; in gre_invert_tuple()
[all …]
Dnf_nat_proto_common.c20 bool nf_nat_l4proto_in_range(const struct nf_conntrack_tuple *tuple, in nf_nat_l4proto_in_range() argument
28 port = tuple->src.u.all; in nf_nat_l4proto_in_range()
30 port = tuple->dst.u.all; in nf_nat_l4proto_in_range()
38 struct nf_conntrack_tuple *tuple, in nf_nat_l4proto_unique_tuple() argument
49 portptr = &tuple->src.u.all; in nf_nat_l4proto_unique_tuple()
51 portptr = &tuple->dst.u.all; in nf_nat_l4proto_unique_tuple()
81 off = l3proto->secure_port(tuple, maniptype == NF_NAT_MANIP_SRC in nf_nat_l4proto_unique_tuple()
82 ? tuple->dst.u.all in nf_nat_l4proto_unique_tuple()
83 : tuple->src.u.all); in nf_nat_l4proto_unique_tuple()
92 if (++i != range_size && nf_nat_used_tuple(tuple, ct)) in nf_nat_l4proto_unique_tuple()
Dnf_conntrack_helper.c109 static unsigned int helper_hash(const struct nf_conntrack_tuple *tuple) in helper_hash() argument
111 return (((tuple->src.l3num << 8) | tuple->dst.protonum) ^ in helper_hash()
112 (__force __u16)tuple->src.u.all) % nf_ct_helper_hsize; in helper_hash()
116 __nf_ct_helper_find(const struct nf_conntrack_tuple *tuple) in __nf_ct_helper_find() argument
125 h = helper_hash(tuple); in __nf_ct_helper_find()
127 if (nf_ct_tuple_src_mask_cmp(tuple, &helper->tuple, &mask)) in __nf_ct_helper_find()
144 if (h->tuple.src.l3num != NFPROTO_UNSPEC && in __nf_conntrack_helper_find()
145 h->tuple.src.l3num != l3num) in __nf_conntrack_helper_find()
148 if (h->tuple.dst.protonum == protonum) in __nf_conntrack_helper_find()
197 if (!__nf_ct_helper_find(&ct->tuplehash[IP_CT_DIR_REPLY].tuple)) in nf_ct_lookup_helper()
[all …]
Dxt_connlimit.c48 struct nf_conntrack_tuple tuple; member
120 const struct nf_conntrack_tuple *tuple, in add_hlist() argument
128 conn->tuple = *tuple; in add_hlist()
136 const struct nf_conntrack_tuple *tuple, in check_hlist() argument
151 found = nf_conntrack_find_get(net, zone, &conn->tuple); in check_hlist()
160 if (nf_ct_tuple_equal(&conn->tuple, tuple)) { in check_hlist()
202 const struct nf_conntrack_tuple *tuple, in count_tree() argument
232 count = check_hlist(net, &rbconn->hhead, tuple, zone, &addit); in count_tree()
238 if (!add_hlist(&rbconn->hhead, tuple, addr)) in count_tree()
248 check_hlist(net, &rbconn->hhead, tuple, zone, &addit); in count_tree()
[all …]
Dnfnetlink_cthelper.c75 nfnl_cthelper_parse_tuple(struct nf_conntrack_tuple *tuple, in nfnl_cthelper_parse_tuple() argument
89 memset(tuple, 0, sizeof(struct nf_conntrack_tuple)); in nfnl_cthelper_parse_tuple()
91 tuple->src.l3num = ntohs(nla_get_be16(tb[NFCTH_TUPLE_L3PROTONUM])); in nfnl_cthelper_parse_tuple()
92 tuple->dst.protonum = nla_get_u8(tb[NFCTH_TUPLE_L4PROTONUM]); in nfnl_cthelper_parse_tuple()
213 struct nf_conntrack_tuple *tuple) in nfnl_cthelper_create() argument
234 memcpy(&helper->tuple, tuple, sizeof(struct nf_conntrack_tuple)); in nfnl_cthelper_create()
392 struct nf_conntrack_tuple tuple; in nfnl_cthelper_new() local
404 ret = nfnl_cthelper_parse_tuple(&tuple, tb[NFCTH_TUPLE]); in nfnl_cthelper_new()
414 if ((tuple.src.l3num != cur->tuple.src.l3num || in nfnl_cthelper_new()
415 tuple.dst.protonum != cur->tuple.dst.protonum)) in nfnl_cthelper_new()
[all …]
Dnf_conntrack_core.c195 static u32 hash_conntrack_raw(const struct nf_conntrack_tuple *tuple, in hash_conntrack_raw() argument
208 n = (sizeof(tuple->src) + sizeof(tuple->dst.u3)) / sizeof(u32); in hash_conntrack_raw()
209 return jhash2((u32 *)tuple, n, seed ^ in hash_conntrack_raw()
210 (((__force __u16)tuple->dst.u.all << 16) | in hash_conntrack_raw()
211 tuple->dst.protonum)); in hash_conntrack_raw()
220 const struct nf_conntrack_tuple *tuple, in __hash_conntrack() argument
223 return reciprocal_scale(hash_conntrack_raw(tuple, net), size); in __hash_conntrack()
227 const struct nf_conntrack_tuple *tuple) in hash_conntrack() argument
229 return scale_hash(hash_conntrack_raw(tuple, net)); in hash_conntrack()
239 struct nf_conntrack_tuple *tuple, in nf_ct_get_tuple() argument
[all …]
Dnf_conntrack_tftp.c48 struct nf_conntrack_tuple *tuple; in tftp_help() local
61 nf_ct_dump_tuple(&ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple); in tftp_help()
62 nf_ct_dump_tuple(&ct->tuplehash[IP_CT_DIR_REPLY].tuple); in tftp_help()
69 tuple = &ct->tuplehash[IP_CT_DIR_REPLY].tuple; in tftp_help()
72 &tuple->src.u3, &tuple->dst.u3, in tftp_help()
73 IPPROTO_UDP, NULL, &tuple->dst.u.udp.port); in tftp_help()
76 nf_ct_dump_tuple(&exp->tuple); in tftp_help()
Dnf_conntrack_amanda.c92 struct nf_conntrack_tuple *tuple; in amanda_help() local
149 tuple = &ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple; in amanda_help()
152 &tuple->src.u3, &tuple->dst.u3, in amanda_help()
180 .tuple.src.l3num = AF_INET,
181 .tuple.src.u.udp.port = cpu_to_be16(10080),
182 .tuple.dst.protonum = IPPROTO_UDP,
189 .tuple.src.l3num = AF_INET6,
190 .tuple.src.u.udp.port = cpu_to_be16(10080),
191 .tuple.dst.protonum = IPPROTO_UDP,
Dnf_conntrack_irc.c119 struct nf_conntrack_tuple *tuple; in help() local
189 tuple = &ct->tuplehash[dir].tuple; in help()
190 if (tuple->src.u3.ip != dcc_ip && in help()
191 tuple->dst.u3.ip != dcc_ip) { in help()
193 &tuple->src.u3.ip, in help()
205 tuple = &ct->tuplehash[!dir].tuple; in help()
208 tuple->src.l3num, in help()
209 NULL, &tuple->dst.u3, in help()
Dnf_nat_proto_tcp.c25 struct nf_conntrack_tuple *tuple, in tcp_unique_tuple() argument
30 nf_nat_l4proto_unique_tuple(l3proto, tuple, range, maniptype, ct, in tcp_unique_tuple()
38 const struct nf_conntrack_tuple *tuple, in tcp_manip_pkt() argument
58 newport = tuple->src.u.tcp.port; in tcp_manip_pkt()
62 newport = tuple->dst.u.tcp.port; in tcp_manip_pkt()
72 l3proto->csum_update(skb, iphdroff, &hdr->check, tuple, maniptype); in tcp_manip_pkt()
/net/ipv6/netfilter/
Dnf_conntrack_l3proto_ipv6.c38 struct nf_conntrack_tuple *tuple) in ipv6_pkt_to_tuple() argument
48 memcpy(tuple->src.u3.ip6, ap, sizeof(tuple->src.u3.ip6)); in ipv6_pkt_to_tuple()
49 memcpy(tuple->dst.u3.ip6, ap + 4, sizeof(tuple->dst.u3.ip6)); in ipv6_pkt_to_tuple()
54 static bool ipv6_invert_tuple(struct nf_conntrack_tuple *tuple, in ipv6_invert_tuple() argument
57 memcpy(tuple->src.u3.ip6, orig->dst.u3.ip6, sizeof(tuple->src.u3.ip6)); in ipv6_invert_tuple()
58 memcpy(tuple->dst.u3.ip6, orig->src.u3.ip6, sizeof(tuple->dst.u3.ip6)); in ipv6_invert_tuple()
64 const struct nf_conntrack_tuple *tuple) in ipv6_print_tuple() argument
67 tuple->src.u3.ip6, tuple->dst.u3.ip6); in ipv6_print_tuple()
229 struct nf_conntrack_tuple tuple = { .src.l3num = NFPROTO_IPV6 }; in ipv6_getorigdst() local
239 tuple.src.u3.in6 = sk->sk_v6_rcv_saddr; in ipv6_getorigdst()
[all …]
Dnf_conntrack_proto_icmpv6.c40 struct nf_conntrack_tuple *tuple) in icmpv6_pkt_to_tuple() argument
48 tuple->dst.u.icmp.type = hp->icmp6_type; in icmpv6_pkt_to_tuple()
49 tuple->src.u.icmp.id = hp->icmp6_identifier; in icmpv6_pkt_to_tuple()
50 tuple->dst.u.icmp.code = hp->icmp6_code; in icmpv6_pkt_to_tuple()
74 static bool icmpv6_invert_tuple(struct nf_conntrack_tuple *tuple, in icmpv6_invert_tuple() argument
81 tuple->src.u.icmp.id = orig->src.u.icmp.id; in icmpv6_invert_tuple()
82 tuple->dst.u.icmp.type = invmap[type] - 1; in icmpv6_invert_tuple()
83 tuple->dst.u.icmp.code = orig->dst.u.icmp.code; in icmpv6_invert_tuple()
89 const struct nf_conntrack_tuple *tuple) in icmpv6_print_tuple() argument
92 tuple->dst.u.icmp.type, in icmpv6_print_tuple()
[all …]
Dnf_nat_proto_icmpv6.c23 icmpv6_in_range(const struct nf_conntrack_tuple *tuple, in icmpv6_in_range() argument
28 return ntohs(tuple->src.u.icmp.id) >= ntohs(min->icmp.id) && in icmpv6_in_range()
29 ntohs(tuple->src.u.icmp.id) <= ntohs(max->icmp.id); in icmpv6_in_range()
34 struct nf_conntrack_tuple *tuple, in icmpv6_unique_tuple() argument
50 tuple->src.u.icmp.id = htons(ntohs(range->min_proto.icmp.id) + in icmpv6_unique_tuple()
52 if (++i == range_size || !nf_nat_used_tuple(tuple, ct)) in icmpv6_unique_tuple()
61 const struct nf_conntrack_tuple *tuple, in icmpv6_manip_pkt() argument
71 tuple, maniptype); in icmpv6_manip_pkt()
76 tuple->src.u.icmp.id, false); in icmpv6_manip_pkt()
77 hdr->icmp6_identifier = tuple->src.u.icmp.id; in icmpv6_manip_pkt()
/net/netfilter/ipvs/
Dip_vs_nfct.c115 new_tuple = ct->tuplehash[IP_CT_DIR_REPLY].tuple; in ip_vs_update_conntrack()
134 ARG_TUPLE(&ct->tuplehash[IP_CT_DIR_REPLY].tuple), in ip_vs_update_conntrack()
155 if (exp->tuple.src.l3num != PF_INET) in ip_vs_nfct_expect_callback()
167 orig = &ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple; in ip_vs_nfct_expect_callback()
168 ip_vs_conn_fill_param(net_ipvs(net), exp->tuple.src.l3num, orig->dst.protonum, in ip_vs_nfct_expect_callback()
174 new_reply = ct->tuplehash[IP_CT_DIR_REPLY].tuple; in ip_vs_nfct_expect_callback()
194 new_reply = ct->tuplehash[IP_CT_DIR_REPLY].tuple; in ip_vs_nfct_expect_callback()
251 __func__, ct, ARG_TUPLE(&exp->tuple)); in ip_vs_nfct_expect_related()
264 struct nf_conntrack_tuple tuple; in ip_vs_conn_drop_conntrack() local
269 tuple = (struct nf_conntrack_tuple) { in ip_vs_conn_drop_conntrack()
[all …]

123