+
+ argc -= optind;
+ argv += optind;
+ if (argc < 1 || argc > 2) {
+ fatal(0, "need one or two non-option arguments; use --help for usage");
+ }
+
+ /* Local and remote vconns. */
+ s->nl_name = argv[0];
+ if (strncmp(s->nl_name, "nl:", 3)
+ || strlen(s->nl_name) < 4
+ || s->nl_name[strspn(s->nl_name + 3, "0123456789") + 3]) {
+ fatal(0, "%s: argument is not of the form \"nl:DP_IDX\"", s->nl_name);
+ }
+ s->of_name = xasprintf("of%s", s->nl_name + 3);
+ s->controller_name = argc > 1 ? xstrdup(argv[1]) : NULL;
+
+ /* Set accept_controller_regex. */
+ if (!accept_re) {
+ accept_re = vconn_ssl_is_configured() ? "^ssl:.*" : ".*";
+ }
+ retval = regcomp(&s->accept_controller_regex, accept_re,
+ REG_NOSUB | REG_EXTENDED);
+ if (retval) {
+ size_t length = regerror(retval, &s->accept_controller_regex, NULL, 0);
+ char *buffer = xmalloc(length);
+ regerror(retval, &s->accept_controller_regex, buffer, length);
+ fatal(0, "%s: %s", accept_re, buffer);
+ }
+ s->accept_controller_re = accept_re;
+
+ /* Mode of operation. */
+ s->discovery = s->controller_name == NULL;
+ if (s->discovery) {
+ s->in_band = true;
+ } else {
+ enum netdev_flags flags;
+ struct netdev *netdev;
+
+ retval = netdev_open(s->of_name, NETDEV_ETH_TYPE_NONE, &netdev);
+ if (retval) {
+ fatal(retval, "Could not open %s device", s->of_name);
+ }
+
+ retval = netdev_get_flags(netdev, &flags);
+ if (retval) {
+ fatal(retval, "Could not get flags for %s device", s->of_name);
+ }
+
+ s->in_band = (flags & NETDEV_UP) != 0;
+ if (s->in_band && netdev_get_in6(netdev, NULL)) {
+ VLOG_WARN("Ignoring IPv6 address on %s device: IPv6 not supported",
+ s->of_name);
+ }
+
+ netdev_close(netdev);
+ }