Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ipv4 addr plus port #63

Open
wants to merge 56 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
233950b
added address plus port
Feb 1, 2018
43f201b
fixed merge
Feb 1, 2018
a238b7c
add static casts
Feb 1, 2018
67483dc
minor changes
Feb 1, 2018
0868823
minor changes
Feb 1, 2018
6012b29
fixed unit tests
Feb 2, 2018
62ce579
updated unit tests
Feb 2, 2018
26e8bf4
removed unsupported options
Feb 3, 2018
a875ea1
updated cql schema and added minor changes (including spelling mistak…
Feb 7, 2018
f804d7e
minor chnages
Feb 9, 2018
7ecf8fb
Merge remote-tracking branch 'isc-kea/master' into cql_clean_code
Feb 15, 2018
01d56b8
Merge remote-tracking branch 'isc-kea/master' into cql_clean_code
Feb 15, 2018
098865d
Merge remote-tracking branch 'isc-kea/master' into HEAD
Feb 15, 2018
10e19f3
Merge branch 'cql_clean_code' of https://github.com/razvan-becheriu/k…
Feb 15, 2018
e2317a1
Merge remote-tracking branch 'isc-kea/master' into ipv4_addr_plus_port
Feb 19, 2018
448cf73
Merge remote-tracking branch 'isc-kea/master' into ipv4_addr_plus_port
Feb 28, 2018
ae60f3f
Merge remote-tracking branch 'isc-kea/master' into cql_clean_code
Feb 28, 2018
14c3a55
minor changes - fixed eventual memory leak
Mar 1, 2018
45464c5
minor changes
Mar 1, 2018
16c80de
minor changes
Mar 1, 2018
5637d01
minor changes
Mar 1, 2018
4637a23
refactored cql recount leases plus minor changes
Mar 1, 2018
d3f8281
minor changes
Mar 1, 2018
b2d80eb
minor changes
Mar 1, 2018
ffc8c78
Merge remote-tracking branch 'isc-kea/master' into cassandra_improvem…
Mar 2, 2018
afddd8a
Merge remote-tracking branch 'isc-kea/master' into cql_clean_code
Mar 7, 2018
d32a318
Merge remote-tracking branch 'isc-kea/master' into cassandra_improvem…
Mar 7, 2018
c3e4fe2
enabled tests for cql
Mar 7, 2018
e728823
Merge remote-tracking branch 'isc-kea/master' into ipv4_addr_plus_port
Mar 7, 2018
8b1f21a
src/lib/dhcpsrv/tests/generic_host_data_source_unittest.cc
Mar 7, 2018
55a57d4
enabled tests for cql
Mar 7, 2018
38b5430
fixed unit tests
Mar 7, 2018
400abf1
fixed merge
Mar 13, 2018
33e4b4f
Merge remote-tracking branch 'isc-kea/master' into cassandra_improvem…
Mar 13, 2018
42d8ad3
minor changes
Mar 13, 2018
1b6df23
Merge remote-tracking branch 'isc-kea/master' into ipv4_addr_plus_port
Mar 13, 2018
39bc0b7
fixed merge
Mar 13, 2018
61f9562
Merge branch 'cql_clean_code' into ipv4_addr_plus_port
Mar 13, 2018
b65cd1f
fixed merge
Mar 13, 2018
a1ab751
fixed comments
Mar 13, 2018
387ffa4
minor changes
Mar 13, 2018
746acc8
minor changes
Mar 13, 2018
78f3ad6
Merge branch 'cassandra_improvements' into cql_clean_code
Mar 13, 2018
38a837f
minor changes
Mar 14, 2018
9ed1f3d
minor changes
Mar 14, 2018
d61a05b
minor changes
Mar 14, 2018
cc59e9a
minor changes
Mar 14, 2018
365e64f
minor changes
Mar 14, 2018
85e88a2
Merge remote-tracking branch 'isc-kea/master' into cql_clean_code
Mar 15, 2018
594bd9e
Merge branch 'cql_clean_code' into ipv4_addr_plus_port
Mar 15, 2018
053d2f3
Merge remote-tracking branch 'isc-kea/master' into ipv4_addr_plus_port
Mar 19, 2018
aac7d46
Merge remote-tracking branch 'isc-kea/master' into ipv4_addr_plus_port
May 24, 2018
8670f46
minor changes
May 24, 2018
552f467
Merge remote-tracking branch 'isc-kea/master' into ipv4_addr_plus_port
Jun 5, 2018
3d23cef
minor changes
Jun 14, 2018
0872bf5
Merge remote-tracking branch 'isc-kea/master' into ipv4_addr_plus_port
Jun 16, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -110,8 +110,8 @@ endif
--output report.info; \
sed --in-place --expression "s|$(abs_top_srcdir)|$(abs_top_builddir)|g" report.info; \
"$(GENHTML)" --frames --show-details --title 'Kea code coverage report' --legend \
--function-coverage --ignore-errors source --demangle-cpp \
--output "$(OVERALL_COVERAGE_DIR)" report.info; \
--function-coverage --ignore-errors source --demangle-cpp \
--output "$(OVERALL_COVERAGE_DIR)" report.info; \
printf "Generated C++ code coverage report in HTML at %s.\n" "$(OVERALL_COVERAGE_DIR)"; \
else \
echo "C++ code coverage not enabled at configuration time." ; \
Expand Down
25 changes: 13 additions & 12 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -62,15 +62,15 @@ AC_SUBST(SEP)
# If cross compiling assume the message compiler executable was
# magically already in place...
if test "$cross_compiling" = "yes"; then
AC_MSG_CHECKING("build (vs. host) compiled message compiler")
if test -x "${srcdir}/src/lib/log/compiler/message"; then
AC_MSG_RESULT(yes)
else
AC_MSG_RESULT(no)
AC_MSG_WARN("you must install a message compiler in:")
AC_MSG_WARN(" ${srcdir}/src/lib/log/compiler/message")
AC_MSG_WARN("compiled for build ($build).")
fi
AC_MSG_CHECKING("build (vs. host) compiled message compiler")
if test -x "${srcdir}/src/lib/log/compiler/message"; then
AC_MSG_RESULT(yes)
else
AC_MSG_RESULT(no)
AC_MSG_WARN("you must install a message compiler in:")
AC_MSG_WARN(" ${srcdir}/src/lib/log/compiler/message")
AC_MSG_WARN("compiled for build ($build).")
fi
fi
AM_CONDITIONAL([CROSS_COMPILING], [test "$cross_compiling" = "yes"])

Expand Down Expand Up @@ -1501,6 +1501,7 @@ AC_CONFIG_FILES([Makefile
src/share/database/scripts/mysql/upgrade_5.0_to_5.1.sh
src/share/database/scripts/mysql/upgrade_5.1_to_5.2.sh
src/share/database/scripts/mysql/upgrade_5.2_to_6.0.sh
src/share/database/scripts/mysql/upgrade_6.0_to_7.0.sh
src/share/database/scripts/pgsql/Makefile
src/share/database/scripts/pgsql/upgrade_1.0_to_2.0.sh
src/share/database/scripts/pgsql/upgrade_2.0_to_3.0.sh
Expand Down Expand Up @@ -1672,9 +1673,9 @@ if test "$CQL_CPPFLAGS" != "" ; then
cat >> config.report << END

Cassandra CQL:
CQL_VERSION: ${CQL_VERSION}
CQL_CPPFLAGS: ${CQL_CPPFLAGS}
CQL_LIBS: ${CQL_LIBS}
CQL_VERSION: ${CQL_VERSION}
CQL_CPPFLAGS: ${CQL_CPPFLAGS}
CQL_LIBS: ${CQL_LIBS}
END
else
cat >> config.report << END
Expand Down
8 changes: 4 additions & 4 deletions doc/guide/intro.xml
Original file line number Diff line number Diff line change
Expand Up @@ -79,23 +79,23 @@

<listitem>
<simpara>
In order to store lease information in a MySQL database, Kea requires MySQL
In order to store lease information in a MySQL database, Kea requires MySQL
headers and libraries. This is an optional dependency in that Kea can be
built without MySQL support.
</simpara>
</listitem>

<listitem>
<simpara>
In order to store lease information in a PostgreSQL database, Kea requires PostgreSQL
In order to store lease information in a PostgreSQL database, Kea requires PostgreSQL
headers and libraries. This is an optional dependency in that Kea can be
built without PostgreSQL support.
</simpara>
</listitem>

<listitem>
<simpara>
In order to store lease information in a Cassandra database (CQL), Kea
In order to store lease information in a Cassandra database (CQL), Kea
requires Cassandra headers and libraries. This is an optional dependency
in that Kea can be built without Cassandra support.
</simpara>
Expand Down Expand Up @@ -163,7 +163,7 @@
<command>kea-lfc</command> —
This process removes redundant information from the files used
to provide persistent storage for the memfile data base backend.
While it can be run standalone, it is normally run as and when
While it can be run standalone, it is normally run as and when
required by the Kea DHCP servers.
</simpara>
</listitem>
Expand Down
2 changes: 1 addition & 1 deletion doc/guide/lfc.xml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
<para><command>kea-lfc</command> is a service process that removes
redundant information from the files used to provide persistent storage
for the memfile data base backend. This service is written to run as a
stand alone process.
stand alone process.
</para>
<para>While <command>kea-lfc</command> can be started externally, there is
usually no need to do this. <command>kea-lfc</command> is run on a periodic
Expand Down
12 changes: 6 additions & 6 deletions src/bin/admin/tests/cql_tests.sh.in
Original file line number Diff line number Diff line change
Expand Up @@ -144,23 +144,23 @@ cql_lease4_dump_test() {
assert_eq 0 $? "kea-admin lease-init cql failed, expected exit code: %d, actual: %d"

# Insert the reference record.
# -1073741302 corresponds to 192.0.2.10
# -1073741301 corresponds to 192.0.2.11
# -1073741300 corresponds to 192.0.2.12
# 3221225994 corresponds to 192.0.2.10
# 3221225995 corresponds to 192.0.2.11
# 3221225996 corresponds to 192.0.2.12
# 1430694930 corresponds to 2015-04-04 01:15:30
# 1433464245 corresponds to 2015-05-05 02:30:45
# 1436173267 corresponds to 2015-06-06 11:01:07
insert_cql="\
INSERT INTO lease4(address, hwaddr, client_id, valid_lifetime, expire, subnet_id,\
fqdn_fwd, fqdn_rev, hostname, state)\
VALUES(-1073741302,textAsBlob('20'),textAsBlob('30'),40,1430694930,50,true,true,\
VALUES(3221225994,textAsBlob('20'),textAsBlob('30'),40,1430694930,50,true,true,\
'one.example.com', 0);\
INSERT INTO lease4(address, hwaddr, client_id, valid_lifetime, expire, subnet_id,\
fqdn_fwd, fqdn_rev, hostname, state)\
VALUES(-1073741301,NULL,textAsBlob('123'),40,1433464245,50,true,true,'', 1);\
VALUES(3221225995,NULL,textAsBlob('123'),40,1433464245,50,true,true,'', 1);\
INSERT INTO lease4(address, hwaddr, client_id, valid_lifetime, expire, subnet_id,\
fqdn_fwd, fqdn_rev, hostname, state)\
VALUES(-1073741300,textAsBlob('22'),NULL,40,1436173267,50,true,true,\
VALUES(3221225996,textAsBlob('22'),NULL,40,1436173267,50,true,true,\
'three.example.com', 2);"

cql_execute "$insert_cql"
Expand Down
6 changes: 3 additions & 3 deletions src/bin/admin/tests/data/cql.lease4_dump_test.reference.csv
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
address,hwaddr,client_id,valid_lifetime,expire,subnet_id,fqdn_fwd,fqdn_rev,hostname,state
-1073741302,0x3230,0x3330,40,1430694930,50,True,True,one.example.com,0
-1073741301,null,0x313233,40,1433464245,50,True,True,,1
-1073741300,0x3232,null,40,1436173267,50,True,True,three.example.com,2
3221225996,0x3232,null,40,1436173267,50,True,True,three.example.com,2
3221225995,null,0x313233,40,1433464245,50,True,True,,1
3221225994,0x3230,0x3330,40,1430694930,50,True,True,one.example.com,0
6 changes: 5 additions & 1 deletion src/bin/admin/tests/dhcpdb_create_1.0.cql
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@
-- Table `lease4`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS lease4 (
address int,
address bigint,
hwaddr blob,
client_id blob,
valid_lifetime bigint,
Expand Down Expand Up @@ -133,6 +133,8 @@ CREATE TABLE IF NOT EXISTS lease_hwaddr_source (
PRIMARY KEY ((hwaddr_source))
);

INSERT INTO lease_hwaddr_source (hwaddr_source, name) VALUES (0, 'HWADDR_SOURCE_UNKNOWN');

-- Hardware address obtained from raw sockets
INSERT INTO lease_hwaddr_source (hwaddr_source, name) VALUES (1, 'HWADDR_SOURCE_RAW');

Expand All @@ -154,6 +156,8 @@ INSERT INTO lease_hwaddr_source (hwaddr_source, name) VALUES (32, 'HWADDR_SOURCE
-- Hardware address extracted from docsis options
INSERT INTO lease_hwaddr_source (hwaddr_source, name) VALUES (64, 'HWADDR_SOURCE_DOCSIS_CMTS');

INSERT INTO lease_hwaddr_source (hwaddr_source, name) VALUES (128, 'HWADDR_SOURCE_DOCSIS_MODEM');

-- Create table holding mapping of the lease states to their names.
-- This is not used in queries from the DHCP server but rather in
-- direct queries from the lease database management tools.
Expand Down
2 changes: 1 addition & 1 deletion src/bin/admin/tests/dhcpdb_create_1.0.mysql
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ COMMIT;
#
# Portability
# ===========
# The "ENGINE = INNODB" on some tables is not portablea to another database
# The "ENGINE = INNODB" on some tables is not portable to another database
# and will need to be removed.
#
# Some columns contain binary data so are stored as VARBINARY instead of
Expand Down
11 changes: 9 additions & 2 deletions src/bin/admin/tests/mysql_tests.sh.in
Original file line number Diff line number Diff line change
Expand Up @@ -449,9 +449,16 @@ EOF

# lease4/6_stats changes are tested separately

# Verify upgraded schema reports version 6.0
# table: lease4 (upgrade 6.0 -> 7.0)
qry="SELECT address FROM lease4"
text=`mysql_execute "${qry}"`
ERRCODE=$?
assert_eq 0 $ERRCODE "lease4 table is missing or broken. (expected status code %d, returned %d)"

# Verify upgraded schema reports version 7.

version=$(${keaadmin} lease-version mysql -u $db_user -p $db_password -n $db_name -d $db_scripts_dir)
assert_str_eq "6.0" ${version} "Expected kea-admin to return %s, returned value was %s"
assert_str_eq "7.0" ${version} "Expected kea-admin to return %s, returned value was %s"

# Let's wipe the whole database
mysql_wipe
Expand Down
2 changes: 1 addition & 1 deletion src/bin/d2/d2_cfg_mgr.cc
Original file line number Diff line number Diff line change
Expand Up @@ -358,7 +358,7 @@ D2CfgMgr::buildParams(ConstElementPtr params_config) {

// Fetch the parameters in the config, performing any logical
// validation required.
asiolink::IOAddress ip_address(0);
asiolink::IOAddress ip_address(0U);
uint32_t port = 0;
uint32_t dns_server_timeout = 0;
dhcp_ddns::NameChangeProtocol ncr_protocol = dhcp_ddns::NCR_UDP;
Expand Down
2 changes: 1 addition & 1 deletion src/bin/dhcp4/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ EXTRA_DIST += dhcp4_parser.yy
if GENERATE_DOCS
kea-dhcp4.8: kea-dhcp4.xml
@XSLTPROC@ --novalid --xinclude --nonet -o $@ \
http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl \
http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl \
$(srcdir)/kea-dhcp4.xml

else
Expand Down
2 changes: 1 addition & 1 deletion src/bin/dhcp4/ctrl_dhcp4_srv.h
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ class ControlledDhcpv4Srv : public isc::dhcp::Dhcpv4Srv {
/// @brief Callback that will be called from iface_mgr when data
/// is received over control socket.
///
/// This static callback method is called from IfaceMgr::receive6() method,
/// This static callback method is called from IfaceMgr::receive4() method,
/// when there is a new command or configuration sent over control socket
/// (that was sent from some yet unspecified sender).
static void sessionReader(void);
Expand Down
2 changes: 1 addition & 1 deletion src/bin/dhcp4/dhcp4_messages.mes
Original file line number Diff line number Diff line change
Expand Up @@ -233,7 +233,7 @@ the message.

% DHCP4_DHCP4O6_RECEIVING receiving DHCPv4o6 packet from DHCPv6 server
This debug message is printed when the server is receiving a DHCPv4o6
from the DHCPv6 server over inter-process communication socket.
from the DHCPv4 server over inter-process communication socket.

% DHCP4_DHCP4O6_RESPONSE_DATA %1: responding with packet %2 (type %3), packet details: %4
A debug message including the detailed data about the packet being
Expand Down
65 changes: 46 additions & 19 deletions src/bin/dhcp4/dhcp4_parser.yy
Original file line number Diff line number Diff line change
Expand Up @@ -82,13 +82,13 @@ using namespace std;
LFC_INTERVAL "lfc-interval"
READONLY "readonly"
CONNECT_TIMEOUT "connect-timeout"
CONTACT_POINTS "contact-points"
KEYSPACE "keyspace"
MAX_RECONNECT_TRIES "max-reconnect-tries"
TCP_NODELAY "tcp-nodelay"
RECONNECT_WAIT_TIME "reconnect-wait-time"
REQUEST_TIMEOUT "request-timeout"
TCP_KEEPALIVE "tcp-keepalive"
TCP_NODELAY "tcp-nodelay"
CONTACT_POINTS "contact-points"
KEYSPACE "keyspace"
MAX_RECONNECT_TRIES "max-reconnect-tries"

VALID_LIFETIME "valid-lifetime"
RENEW_TIMER "renew-timer"
Expand All @@ -98,6 +98,9 @@ using namespace std;
SUBNET_4O6_INTERFACE "4o6-interface"
SUBNET_4O6_INTERFACE_ID "4o6-interface-id"
SUBNET_4O6_SUBNET "4o6-subnet"
SUBNET_V4_PSID_OFFSET "v4-psid-offset"
SUBNET_V4_PSID_LEN "v4-psid-len"
SUBNET_V4_EXCLUDED_PSIDS "v4-excluded-psids"
OPTION_DEF "option-def"
OPTION_DATA "option-data"
NAME "name"
Expand Down Expand Up @@ -480,7 +483,6 @@ match_client_id: MATCH_CLIENT_ID COLON BOOLEAN {
ctx.stack_.back()->set("match-client-id", match);
};


interfaces_config: INTERFACES_CONFIG {
ElementPtr i(new MapElement(ctx.loc2pos(@1)));
ctx.stack_.back()->set("interfaces-config", i);
Expand Down Expand Up @@ -620,12 +622,12 @@ database_map_param: database_type
| lfc_interval
| readonly
| connect_timeout
| contact_points
| max_reconnect_tries
| tcp_nodelay
| reconnect_wait_time
| request_timeout
| tcp_keepalive
| tcp_nodelay
| contact_points
| max_reconnect_tries
| keyspace
| unknown_map_entry
;
Expand Down Expand Up @@ -700,6 +702,16 @@ connect_timeout: CONNECT_TIMEOUT COLON INTEGER {
ctx.stack_.back()->set("connect-timeout", n);
};

tcp_nodelay: TCP_NODELAY COLON BOOLEAN {
ElementPtr n(new BoolElement($3, ctx.loc2pos(@3)));
ctx.stack_.back()->set("tcp-nodelay", n);
};

reconnect_wait_time: RECONNECT_WAIT_TIME COLON INTEGER {
ElementPtr n(new IntElement($3, ctx.loc2pos(@3)));
ctx.stack_.back()->set("reconnect-wait-time", n);
};

request_timeout: REQUEST_TIMEOUT COLON INTEGER {
ElementPtr n(new IntElement($3, ctx.loc2pos(@3)));
ctx.stack_.back()->set("request-timeout", n);
Expand All @@ -710,11 +722,6 @@ tcp_keepalive: TCP_KEEPALIVE COLON INTEGER {
ctx.stack_.back()->set("tcp-keepalive", n);
};

tcp_nodelay: TCP_NODELAY COLON BOOLEAN {
ElementPtr n(new BoolElement($3, ctx.loc2pos(@3)));
ctx.stack_.back()->set("tcp-nodelay", n);
};

contact_points: CONTACT_POINTS {
ctx.enter(ctx.NO_KEYWORD);
} COLON STRING {
Expand All @@ -736,11 +743,6 @@ max_reconnect_tries: MAX_RECONNECT_TRIES COLON INTEGER {
ctx.stack_.back()->set("max-reconnect-tries", n);
};

reconnect_wait_time: RECONNECT_WAIT_TIME COLON INTEGER {
ElementPtr n(new IntElement($3, ctx.loc2pos(@3)));
ctx.stack_.back()->set("reconnect-wait-time", n);
};

host_reservation_identifiers: HOST_RESERVATION_IDENTIFIERS {
ElementPtr l(new ListElement(ctx.loc2pos(@1)));
ctx.stack_.back()->set("host-reservation-identifiers", l);
Expand Down Expand Up @@ -995,6 +997,9 @@ subnet4_param: valid_lifetime
| subnet_4o6_interface
| subnet_4o6_interface_id
| subnet_4o6_subnet
| subnet_v4_psid_offset
| subnet_v4_psid_len
| subnet_v4_excluded_psids
| user_context
| comment
| unknown_map_entry
Expand Down Expand Up @@ -1032,6 +1037,28 @@ subnet_4o6_subnet: SUBNET_4O6_SUBNET {
ctx.leave();
};

subnet_v4_psid_offset: SUBNET_V4_PSID_OFFSET COLON INTEGER {
ElementPtr offset(new IntElement($3, ctx.loc2pos(@3)));
ctx.stack_.back()->set("v4-psid-offset", offset);
};

subnet_v4_psid_len: SUBNET_V4_PSID_LEN COLON INTEGER {
ElementPtr psid_len(new IntElement($3, ctx.loc2pos(@3)));
ctx.stack_.back()->set("v4-psid-len", psid_len);
};

// This defines the "v4-excluded-psids": [ ... ] entry that may appear
// in subnet4 entries.
subnet_v4_excluded_psids: SUBNET_V4_EXCLUDED_PSIDS {
ElementPtr l(new ListElement(ctx.loc2pos(@1)));
ctx.stack_.back()->set("v4-excluded-psids", l);
ctx.stack_.push_back(l);
ctx.enter(ctx.NO_KEYWORD);
} COLON LSQUARE_BRACKET list_content RSQUARE_BRACKET {
ctx.stack_.pop_back();
ctx.leave();
};

interface: INTERFACE {
ctx.enter(ctx.NO_KEYWORD);
} COLON STRING {
Expand Down Expand Up @@ -1918,7 +1945,7 @@ replace_client_name: REPLACE_CLIENT_NAME {

replace_client_name_value:
WHEN_PRESENT {
$$ = ElementPtr(new StringElement("when-present", ctx.loc2pos(@1)));
$$ = ElementPtr(new StringElement("when-present", ctx.loc2pos(@1)));
}
| NEVER {
$$ = ElementPtr(new StringElement("never", ctx.loc2pos(@1)));
Expand Down
Loading