@@ -6377,73 +6377,6 @@ get_localnet_vifs_l3gwports(
sbrec_port_binding_index_destroy_row(target);
}
-
-/* Extracts the mac, IPv4 and IPv6 addresses, and logical port from
- * 'addresses' which should be of the format 'MAC [IP1 IP2 ..]
- * [is_chassis_resident("LPORT_NAME")]', where IPn should be a valid IPv4
- * or IPv6 address, and stores them in the 'ipv4_addrs' and 'ipv6_addrs'
- * fields of 'laddrs'. The logical port name is stored in 'lport'.
- *
- * Returns true if at least 'MAC' is found in 'address', false otherwise.
- *
- * The caller must call destroy_lport_addresses() and free(*lport). */
-static bool
-extract_addresses_with_port(const char *addresses,
- struct lport_addresses *laddrs,
- char **lport)
-{
- int ofs;
- if (!extract_addresses(addresses, laddrs, &ofs)) {
- return false;
- } else if (!addresses[ofs]) {
- return true;
- }
-
- struct lexer lexer;
- lexer_init(&lexer, addresses + ofs);
- lexer_get(&lexer);
-
- if (lexer.error || lexer.token.type != LEX_T_ID
- || !lexer_match_id(&lexer, "is_chassis_resident")) {
- static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1);
- VLOG_INFO_RL(&rl, "invalid syntax '%s' in address", addresses);
- lexer_destroy(&lexer);
- return true;
- }
-
- if (!lexer_match(&lexer, LEX_T_LPAREN)) {
- static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1);
- VLOG_INFO_RL(&rl, "Syntax error: expecting '(' after "
- "'is_chassis_resident' in address '%s'", addresses);
- lexer_destroy(&lexer);
- return false;
- }
-
- if (lexer.token.type != LEX_T_STRING) {
- static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1);
- VLOG_INFO_RL(&rl,
- "Syntax error: expecting quoted string after "
- "'is_chassis_resident' in address '%s'", addresses);
- lexer_destroy(&lexer);
- return false;
- }
-
- *lport = xstrdup(lexer.token.s);
-
- lexer_get(&lexer);
- if (!lexer_match(&lexer, LEX_T_RPAREN)) {
- static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1);
- VLOG_INFO_RL(&rl, "Syntax error: expecting ')' after quoted string in "
- "'is_chassis_resident()' in address '%s'",
- addresses);
- lexer_destroy(&lexer);
- return false;
- }
-
- lexer_destroy(&lexer);
- return true;
-}
-
static void
consider_nat_address(struct ovsdb_idl_index *sbrec_port_binding_by_name,
const char *nat_address,
@@ -1314,3 +1314,69 @@ ovn_update_swconn_at(struct rconn *swconn, const char *target,
return notify;
}
+
+/* Extracts the mac, IPv4 and IPv6 addresses, and logical port from
+ * 'addresses' which should be of the format 'MAC [IP1 IP2 ..]
+ * [is_chassis_resident("LPORT_NAME")]', where IPn should be a valid IPv4
+ * or IPv6 address, and stores them in the 'ipv4_addrs' and 'ipv6_addrs'
+ * fields of 'laddrs'. The logical port name is stored in 'lport'.
+ *
+ * Returns true if at least 'MAC' is found in 'address', false otherwise.
+ *
+ * The caller must call destroy_lport_addresses() and free(*lport). */
+bool
+extract_addresses_with_port(const char *addresses,
+ struct lport_addresses *laddrs,
+ char **lport)
+{
+ int ofs;
+ if (!extract_addresses(addresses, laddrs, &ofs)) {
+ return false;
+ } else if (!addresses[ofs]) {
+ return true;
+ }
+
+ struct lexer lexer;
+ lexer_init(&lexer, addresses + ofs);
+ lexer_get(&lexer);
+
+ if (lexer.error || lexer.token.type != LEX_T_ID
+ || !lexer_match_id(&lexer, "is_chassis_resident")) {
+ static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1);
+ VLOG_INFO_RL(&rl, "invalid syntax '%s' in address", addresses);
+ lexer_destroy(&lexer);
+ return true;
+ }
+
+ if (!lexer_match(&lexer, LEX_T_LPAREN)) {
+ static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1);
+ VLOG_INFO_RL(&rl, "Syntax error: expecting '(' after "
+ "'is_chassis_resident' in address '%s'", addresses);
+ lexer_destroy(&lexer);
+ return false;
+ }
+
+ if (lexer.token.type != LEX_T_STRING) {
+ static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1);
+ VLOG_INFO_RL(&rl,
+ "Syntax error: expecting quoted string after "
+ "'is_chassis_resident' in address '%s'", addresses);
+ lexer_destroy(&lexer);
+ return false;
+ }
+
+ *lport = xstrdup(lexer.token.s);
+
+ lexer_get(&lexer);
+ if (!lexer_match(&lexer, LEX_T_RPAREN)) {
+ static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1);
+ VLOG_INFO_RL(&rl, "Syntax error: expecting ')' after quoted string in "
+ "'is_chassis_resident()' in address '%s'",
+ addresses);
+ lexer_destroy(&lexer);
+ return false;
+ }
+
+ lexer_destroy(&lexer);
+ return true;
+}
@@ -481,4 +481,8 @@ void ovn_exit_args_finish(struct ovn_exit_args *exit_args);
bool ovn_update_swconn_at(struct rconn *swconn, const char *target,
int probe_interval, const char *where);
+bool extract_addresses_with_port(const char *addresses,
+ struct lport_addresses *laddrs,
+ char **lport);
+
#endif /* OVN_UTIL_H */
We will need parsing of Port_Binding->nat_addresses in other parts of the ovn-controller in subsequent patches. Move extract_addresses_with_port() to the lib/ ovn-util module. Signed-off-by: Frode Nordahl <fnordahl@ubuntu.com> --- controller/pinctrl.c | 67 -------------------------------------------- lib/ovn-util.c | 66 +++++++++++++++++++++++++++++++++++++++++++ lib/ovn-util.h | 4 +++ 3 files changed, 70 insertions(+), 67 deletions(-)