Exemplo n.º 1
0
/* "ifconfig tunnel gre DEV local IP4ADDR remote IP4ADDR peer IP4ADDR IP4ADDR vrf NUMBER";*/
void f_ifconfig_tun(struct cli_conn *conn, const char *s)
{
	char dev[16], loc[16], rem[16], ip[16], peer[16];
	uint32_t tun_loc, tun_rem, addr, p2p;
	int port, vlan, vrf = 0, masklen = 32;
	const char *err;

	if (sscanf(s, "%s %s %s %s %s %d", dev, loc, rem, peer, ip, &vrf) < 5)
		return;

	port = ofp_name_to_port_vlan(dev, &vlan);

	if (port != GRE_PORTS) {
		ofp_sendf(conn->fd, "Invalid device name.\r\n");
		sendcrlf(conn);
		return;
	}

	if (!ip4addr_get(loc, &tun_loc))
		return;
	if (!ip4addr_get(rem, &tun_rem))
		return;
	if (!ip4addr_get(peer, &p2p))
		return;
	if (!ip4addr_get(ip, &addr))
		return;


	err = ofp_config_interface_up_tun(port, vlan, vrf, tun_loc, tun_rem,
					    p2p, addr, masklen);
	if (err != NULL)
		ofp_sendf(conn->fd, err);
	sendcrlf(conn);
}
Exemplo n.º 2
0
/* route -A inet4 add vrf NUMBER IP4NET gw IP4ADDR dev DEV */
void f_route_add_vrf(struct cli_conn *conn, const char *s)
{
	uint32_t gwaddr, destaddr;
	int a, b, c, d, e, f, g, h, port, mlen, vrf, vlan;
	char dev[16];

	if (sscanf(s, "%d %d.%d.%d.%d/%d %d.%d.%d.%d %s",
		   &vrf, &a, &b, &c, &d, &mlen,
		   &e, &f, &g, &h, dev) != 11)
		return;
	destaddr = odp_cpu_to_be_32((a << 24) | (b << 16) | (c << 8) | d);
	gwaddr = odp_cpu_to_be_32((e << 24) | (f << 16) | (g << 8) | h);

	port = ofp_name_to_port_vlan(dev, &vlan);
	if (port < 0 || port >= ofp_get_num_ports()) {
		ofp_sendf(conn->fd, "Invalid port!\r\n");
		sendcrlf(conn);
		return;
	}

	ofp_set_route_params(OFP_ROUTE_ADD, vrf, vlan, port, destaddr,
			     mlen, gwaddr);

	sendcrlf(conn);
}
Exemplo n.º 3
0
/**
 * @brief Send submission/nowplaying to server.
 *
 * @param snd Send string
 * @param url URL to post to
 */
static void scrob_send_submission(int sock, const char *snd, const char *url)
{
        char buf[1024];
        char *line;
        unsigned int i;
        unsigned int len;
        int ok; /* bool */
        int n;

        ok = 0;
        len = strlen(snd);
        
        for (i = 0; i < SCROB_RETRIES; i++) {
                sendcrlf(sock, "POST %s HTTP/1.1", url);
                sendcrlf(sock, "Host: %s", scrob_host);
                sendcrlf(sock, "User-Agent: %s/%s", SCROB_CLIENT, SCROB_VERSION);
                sendcrlf(sock, "Content-Type: application/x-www-form-urlencoded");
                sendcrlf(sock, "Content-Length: %d", len);
                sendx(sock, "\r\n");
                sendx(sock, snd);

                n = recv(sock, buf, sizeof(buf), 0);
                if (n <= 0)
                        return;

                buf[n] = '\0';

                for (line = strtok(buf, "\r\n");
                     line; line = strtok(NULL, "\r\n")) {
                        if (!strcmp(line, "OK")) {
                                ok = 1;
                                break;
                        }
                }

                if (ok) {
                        DEBUGF(("mpdscrob: Submission successful!\n"));
                        return;
                }

                /* We got something other than OK ;[ */
                close(sock);

                /* Connect to the scrobbler server. */
                sock = scrob_connect();
                if (sock == -1) {
                        fprintf(stderr,
                                "Could not connect to scrobbler server ;[\n");
                        return;
                }

                /* We most likely need to redo the handshake. */
                if ((scrob_handshake(sock) == -1)) {
                        scrob_shaked = 0;
                        return;
                }
        }
}
Exemplo n.º 4
0
void f_route_del_v6(struct cli_conn *conn, const char *s)
{
	uint8_t dst6[16];
	uint8_t gw6[16];
	int mlen;
	const char *tk;
	const char *tk_end;
	const char *last;

	last = s + strlen(s);

/* get IP6NET address*/
	tk = s;
	tk_end = strstr(tk, "/");
	if (!tk_end) {
		ofp_sendf(conn->fd, "Invalid IP6NET\r\n");
		sendcrlf(conn);
		return;
	}

	if (!ip6addr_get(tk, tk_end - tk, dst6)) {
		ofp_sendf(conn->fd, "Invalid IP6NET\r\n");
		sendcrlf(conn);
		return;
	}

/* get IP6NET prefix len*/
	tk = tk_end + 1;
	if (tk >= last) {
		ofp_sendf(conn->fd, "Invalid IP6NET\r\n");
		sendcrlf(conn);
		return;
	}

	tk_end = last;
	if (tk == tk_end) {
		ofp_sendf(conn->fd, "Invalid IP6NET\r\n");
		sendcrlf(conn);
		return;
	}

	mlen = atoi(tk);

	ofp_set_route6_params(OFP_ROUTE6_DEL, 0 /*vrf*/, 0 /*vlan*/, 0 /*port*/,
			      dst6, mlen, gw6);

	sendcrlf(conn);
}
Exemplo n.º 5
0
/* "ifconfig [-A inet 4] DEV IP4NET";*/
void f_ifconfig(struct cli_conn *conn, const char *s)
{

	char dev[16];
	int port, a, b, c, d, m, vlan, vrf = 0;
	uint32_t addr;
	const char *err;

	if (sscanf(s, "%s %d.%d.%d.%d/%d %d", dev, &a, &b,
		&c, &d, &m, &vrf) < 6)
		return;
	addr = odp_cpu_to_be_32((a << 24) | (b << 16) | (c << 8) | d);
	port = ofp_name_to_port_vlan(dev, &vlan);

	if (port == GRE_PORTS || port == VXLAN_PORTS) {
		ofp_sendf(conn->fd, "Invalid device name.\r\n");
		return;
	}

	if (PHYS_PORT(port))
		err = ofp_config_interface_up_v4(port, vlan, vrf,
						 addr, m);
	else
		err = ofp_config_interface_up_local(vlan, vrf,
						    addr, m);
	if (err != NULL)
		ofp_sendf(conn->fd, err);
	sendcrlf(conn);
}
Exemplo n.º 6
0
/* route show */
void f_route_show(struct cli_conn *conn, const char *s)
{
	(void)s;

	ofp_show_routes(conn->fd, OFP_SHOW_ROUTES);

	sendcrlf(conn);
}
Exemplo n.º 7
0
/* loglevel show */
void f_loglevel_show(struct cli_conn *conn, const char *s)
{
	(void)s;
	ofp_sendf(conn->fd, "Log level: %s\r\n",
		loglevel_descript[ofp_loglevel]);

	sendcrlf(conn);
}
Exemplo n.º 8
0
/* "show ifconfig" */
void f_ifconfig_show(struct cli_conn *conn, const char *s)
{
	(void)s;

	ofp_show_interfaces(conn->fd);

	sendcrlf(conn);
}
Exemplo n.º 9
0
void f_ifconfig_v6(struct cli_conn *conn, const char *s)
{
	char dev[16];
	uint8_t addr6[16];
	int prefix, port, vlan;
	const char *tk;
	const char *tk_end;
	const char *err;

	/*get DEV*/
	tk = s;
	tk_end = strstr(tk, " ");

	if (!tk_end || ((int)(tk_end - tk) > (int)(sizeof(dev) - 1))) {
		ofp_sendf(conn->fd, "Invalid device name.\r\n");
		sendcrlf(conn);
		return;
	}
	memcpy(dev, tk, tk_end - tk);
	dev[tk_end - tk] = 0;

	port = ofp_name_to_port_vlan(dev, &vlan);
	if (port == -1 || port == GRE_PORTS) {
		ofp_sendf(conn->fd, "Invalid device name.\r\n");
		sendcrlf(conn);
		return;
	}

	/*get IP6NET address*/
	tk = tk_end + 1;
	tk_end = strstr(tk, "/");

	if (!tk_end || tk_end - tk > 40) {
		ofp_sendf(conn->fd, "Invalid IP6NET address.\r\n");
		sendcrlf(conn);
		return;
	}

	if (!ip6addr_get(tk, tk_end - tk, addr6)) {
		ofp_sendf(conn->fd, "Invalid IP6NET address.\r\n");
		sendcrlf(conn);
		return;
	}

	/* get IP6NET prefix len*/
	tk = tk_end + 1;
	if (sscanf(tk, "%d", &prefix) < 1) {
		ofp_sendf(conn->fd, "Invalid IP6NET prefix.\r\n");
		sendcrlf(conn);
		return;
	}

	if (port == LOCAL_PORTS)
		err = ofp_config_interface_up_local_v6(vlan, addr6, prefix);
	else
		err = ofp_config_interface_up_v6(port, vlan, addr6, prefix);
	if (err != NULL)
		ofp_sendf(conn->fd, err);
	sendcrlf(conn);
}
Exemplo n.º 10
0
/* ifconfig vxlan DEV group IP4ADDR dev DEV IP4NET */
void f_ifconfig_vxlan(struct cli_conn *conn, const char *s)
{
	char dev[16], physdev[16], group[16];
	uint32_t vxlan_group, addr;
	int n, port, vlan, physport, physvlan, a, b, c, d, m;
	const char *err;

	if ((n = sscanf(s, "%s %s %s %d.%d.%d.%d/%d",
			dev, group, physdev,
			&a, &b, &c, &d, &m)) != 8) {
		return;
	}

	addr = odp_cpu_to_be_32((a << 24) | (b << 16) | (c << 8) | d);
	port = ofp_name_to_port_vlan(dev, &vlan);

	if (port != VXLAN_PORTS) {
		ofp_sendf(conn->fd, "Invalid device name %s.\r\n", dev);
		sendcrlf(conn);
		return;
	}

	physport = ofp_name_to_port_vlan(physdev, &physvlan);

	if (!ip4addr_get(group, &vxlan_group)) {
		ofp_sendf(conn->fd, "Invalid group address.\r\n");
		sendcrlf(conn);
		return;
	}

	/* vrf is copied from the physical port */
	err = ofp_config_interface_up_vxlan(0, addr, m, vlan, vxlan_group,
					    physport, physvlan);
	if (err != NULL)
		ofp_sendf(conn->fd, err);

	sendcrlf(conn);
}
Exemplo n.º 11
0
/* route -A inet4 delete vrf NUMBER IP4NET */
void f_route_del_vrf(struct cli_conn *conn, const char *s)
{
	uint32_t destaddr;
	int a, b, c, d, mlen, vrf;

	if (sscanf(s, "%d %d.%d.%d.%d/%d",
		&vrf, &a, &b, &c, &d, &mlen) != 6)
		return;
	destaddr = odp_cpu_to_be_32((a << 24) | (b << 16) | (c << 8) | d);

	ofp_set_route_params(OFP_ROUTE_DEL, vrf, 0 /*vlan*/, 0 /*port*/,
			     destaddr, mlen, 0 /*gw*/);

	sendcrlf(conn);
}
Exemplo n.º 12
0
void f_alias_show(struct cli_conn *conn, const char *s)
{
	int i;

	(void)s;
	ofp_sendf(conn->fd, "Alias      Command\r\n");
	for (i = 0; i < ALIAS_TABLE_LEN; i++) {
		if (alias_table[i].name != 0) {
			ofp_sendf(conn->fd, "%-10s %s\r\n",
				alias_table[i].name,
				alias_table[i].cmd);
		} else
			break;
	}
	sendcrlf(conn);
}
Exemplo n.º 13
0
/**
 * @brief Handle new donky connection.
 *
 * @param cur Listener connection
 */
static void donky_conn_new(donky_conn *cur)
{
        int newfd = accept(cur->sock, NULL, NULL);

        if (newfd == -1) {
                perror("donky_client_new: accept");
                return;
        }

        if (newfd > donky_fdmax)
                donky_fdmax = newfd;

        DEBUGF(("New connection, adding to client list.\n"));
        donky_conn_add(newfd);
        sendcrlf(newfd, PROTO_CONN_ACK);
}
Exemplo n.º 14
0
/* loglevel set */
void f_loglevel(struct cli_conn *conn, const char *s)
{
	int i;

	for (i = 0; i < OFP_LOG_MAX_LEVEL; i++) {
		if (strncmp(loglevel_descript[i], s,
			strlen(loglevel_descript[i])) == 0) {
			ofp_loglevel = i;
			sendcrlf(conn);
			return;
		}
	}

	ofp_sendf(conn->fd, "Invalid value!\r\nUsage:\r\n");

	f_help_loglevel(conn, NULL);
}
Exemplo n.º 15
0
/* help loglevel */
void f_help_loglevel(struct cli_conn *conn, const char *s)
{
	(void)s;

	ofp_sendf(conn->fd, "Show log level\r\n"
		"  loglevel show\r\n\r\n");
	ofp_sendf(conn->fd, "Set log level\r\n"
		"  loglevel set <debug|info|warning|error|disabled>\r\n"
                "  Note:\r\n"
                "    Debug level logs require --enable-debug configuration option\r\n"
                "  Example: Set log level to generate warning and error logs:\r\n"
		"    loglevel set warning\r\n\r\n");
	ofp_sendf(conn->fd, "Show log level help (this help)\r\n"
		"  loglevel help\r\n");

	sendcrlf(conn);
}
Exemplo n.º 16
0
void f_ifconfig_down(struct cli_conn *conn, const char *s)
{
	/* "ifconfig DEV down"; */
	char dev[16];
	int port, vlan;
	const char *err;

	if (sscanf(s, "%s", dev) < 1)
		return;
	port = ofp_name_to_port_vlan(dev, &vlan);

	err = ofp_config_interface_down(port, vlan);

	if (err != NULL)
		ofp_sendf(conn->fd, err);
	sendcrlf(conn);
}
Exemplo n.º 17
0
void f_help_alias(struct cli_conn *conn, const char *s)
{
	(void)s;
	ofp_sendf(conn->fd,
		"Add an alias for a command:\r\n"
		"  alias set <name> \"<command line>\"\r\n"
		"  Example:\r\n"
		"    alias set ll \"loglevel show\"\r\n\r\n");

	ofp_sendf(conn->fd,
		"Show alias table:\r\n"
		"  alias show\r\n\r\n");

	ofp_sendf(conn->fd,
		"Show (this) help:\r\n"
		"  alias help\r\n\r\n");
	sendcrlf(conn);
}
Exemplo n.º 18
0
/* route add from DEV to DEV */
void f_route_add_dev_to_dev(struct cli_conn *conn, const char *s)
{

	char dev[16], from[16];
	int from_port, to_port, vlan;

	if (sscanf(s, "%s %s", from, dev) != 2)
		return;
	from_port = ofp_name_to_port_vlan(from, &vlan);
	to_port = ofp_name_to_port_vlan(dev, &vlan);
	from_port = from_port; /* remove warnings*/
	to_port = to_port;
	/*set_port_params(16, ofp_ifnet_data[32].address,
	  ufp_ifnet_data[32].masklen, ufp_ifnet_data[32].mac,
	  ufp_ifnet_data[32].link_local);
	add_to_next_hop_table(ADD_ENTRY, ufp_ifnet_data[to_port].address,
	from_port, ufp_ifnet_data[to_port].masklen,
	  NH_FLAGS_TO_LOCAL_SEGMENT, to_port, 0, to_port, NULL, 0);*/
	sendcrlf(conn);
}
Exemplo n.º 19
0
void f_alias_set(struct cli_conn *conn, const char *s)
{
	const char *name;
	int name_len;
	const char *line;

	int i;

	name = s;
	while ((*s != ' ') && (*s != 0))
		s++;
	name_len = s - name;

	line  = NULL;
	if (*s != 0) {
		while (*s == ' ')
			s++;
		if (*s != 0)
			line  = s;
	}

	for (i = 0; i < ALIAS_TABLE_LEN; i++) {
		if (alias_table[i].name == 0) {

			alias_table[i].name = strndup(name, name_len);
			alias_table[i].cmd = strdup(line);
			f_add_alias_command(alias_table[i].name);
			break;
		} else {
			if (strncmp(alias_table[i].name, name, name_len) == 0) {
				if (alias_table[i].cmd)
					free(alias_table[i].cmd);
				alias_table[i].cmd = strdup(line);
				break;
			}
		}
	}

	sendcrlf(conn);
}
Exemplo n.º 20
0
/**
 * @brief Do da hand shake f00.
 *
 * @param sock Socket
 *
 * @return Error status
 */
static int scrob_handshake(int sock)
{
        char utm[96];
        char utm_md5[160];
        int n;
        char buf[1024];

        DEBUGF(("mpdscrob: Handshaking with (%s:%d)!\n",
                scrob_host, scrob_port));

        scrob_utime(utm, sizeof(utm));

        strfcpy(utm_md5, scrob_pass, sizeof(utm_md5));
        strfcat(utm_md5, utm, sizeof(utm_md5));

        scrob_md5(utm_md5);

        sendcrlf(sock,
                 "GET http://%s/"
                 "?hs=true&p=1.2&c=%s&v=%s&u=%s&t=%s&a=%s\n"
                 "Host: %s\r\n",
                 scrob_host,
                 SCROB_CLIENT,
                 SCROB_VERSION,
                 scrob_user,
                 utm,
                 utm_md5,
                 scrob_host);

        n = recv(sock, buf, sizeof(buf), 0);
        if (n <= 0) {
                fprintf(stderr, "mpdscrob: Socket disconnected!\n");
                return -1;
        }

        buf[n] = '\0';

        return scrob_handshake_parse(buf);
}
Exemplo n.º 21
0
/* "help ifconfig" */
void f_help_ifconfig(struct cli_conn *conn, const char *s)
{
	(void)s;

	ofp_sendf(conn->fd, "Show interfaces:\r\n"
		"  ifconfig [show]\r\n\r\n");

	ofp_sendf(conn->fd, "Create or configure an interface:\r\n"
		"  ifconfig [-A inet4] DEV IP4NET [vrf VRF]\r\n"
		"    DEV: ethernet, vlan or loopback interface name.\r\n"
		"         VLAN interfaces are named <phys dev>.<vlan_id>\r\n"
		"         Loopback interfaces are named lo0, lo1, ...\r\n"
		"    IP4NET: network address in a.b.c.d/e format\r\n"
		"    VRF: virtual routing and forwarding instance (a number)\r\n"
		"  Examples:\r\n"
		"    ifconfig %s0 192.168.200.1/24\r\n"
		"    ifconfig %s0.100 192.168.200.1/24\r\n"
		"    ifconfig %s0 192.168.200.1/24 vrf 2\r\n\r\n",
		OFP_IFNAME_PREFIX, OFP_IFNAME_PREFIX, OFP_IFNAME_PREFIX);
	ofp_sendf(conn->fd, "Create or configure a GRE tunnel:\r\n"
		"  ifconfig tunnel gre DEV local IP4ADDR remote IP4ADDR peer IP4ADDR IP4ADDR [vrf VRF]\r\n"
		"    DEV: gre interface name\r\n"
		"    local: local tunnel endpoint ip address in a.b.c.d format\r\n"
		"    remote: remote tunnel endpoint ip address in a.b.c.d format\r\n"
		"    peer: pointtopoint ip address in a.b.c.d format\r\n"
		"    IP4ADDR: interface ip address in a.b.c.d format\r\n"
		"    VRF: virtual routing and forwarding instance (a number)\r\n"
		"  Examples:\r\n"
		"    ifconfig tunnel gre %s100 local 192.168.200.1 remote 192.168.200.2 peer 10.10.10.2 10.10.10.1\r\n"
		"    ifconfig tunnel gre %s100 local 192.168.200.1 remote 192.168.200.2 peer 10.10.10.2 10.10.10.1 vrf 2\r\n\r\n",
		OFP_GRE_IFNAME_PREFIX, OFP_GRE_IFNAME_PREFIX);
	ofp_sendf(conn->fd, "Create or configure a VXLAN interface:\r\n"
		"  ifconfig vxlan DEV group IP4ADDR dev DEV_PHYS IP4NET\r\n"
		"    DEV: vxlan interface name (interface number is the vni)\r\n"
		"    IP4ADDR: group ip address in a.b.c.d format\r\n"
		"    DEV_PHYS: interface name of the physical device\r\n"
		"    IP4NET: network address in a.b.c.d/e format\r\n"
		"  Example:\r\n"
		"    ifconfig vxlan %s42 group 239.1.1.1 dev fp0 10.10.10.1/24\r\n"
		"    (vni = 42)\r\n\r\n",
		OFP_VXLAN_IFNAME_PREFIX);
#ifdef INET6
	ofp_sendf(conn->fd, "Create or configure an IPv6 interface:\r\n"
		"  ifconfig -A inet6 DEV IP6NET\r\n"
		"    DEV: ethernet interface name\r\n"
		"    IP6NET: network address in a:b:c:d:e:f:g:h/n or"
		" compressed format\r\n"
		"  Example:\r\n"
		"    ifconfig -A inet6 %s0 2000:1baf::/64\r\n\r\n",
		OFP_IFNAME_PREFIX);
#endif /* INET6 */
	ofp_sendf(conn->fd, "Delete or unconfigure an interface:\r\n"
		"  ifconfig DEV down\r\n"
		"    DEV: ethernet interface name\r\n"
		"  Example:\r\n"
		"    ifconfig %s0 down\r\n\r\n",
		OFP_IFNAME_PREFIX);

	ofp_sendf(conn->fd, "Show (this) help:\r\n"
		"  ifconfig help\r\n\r\n");

	sendcrlf(conn);
}
Exemplo n.º 22
0
void f_route_add_v6(struct cli_conn *conn, const char *s)
{
	uint8_t dst6[16];
	uint8_t gw6[16];
	int port, vlan, mlen;
	const char *tk;
	const char *tk_end;
	const char *last;

	last = s + strlen(s);

/* get IP6NET address*/
	tk = s;
	tk_end = strstr(tk, "/");
	if (!tk_end) {
		ofp_sendf(conn->fd, "Invalid IP6NET\r\n");
		sendcrlf(conn);
		return;
	}

	if (!ip6addr_get(tk, tk_end - tk, dst6)) {
		ofp_sendf(conn->fd, "Invalid IP6NET\r\n");
		sendcrlf(conn);
		return;
	}

/* get IP6NET prefix len*/
	tk = tk_end + 1;
	if (tk >= last) {
		ofp_sendf(conn->fd, "Invalid IP6NET\r\n");
		sendcrlf(conn);
		return;
	}

	tk_end = strstr(tk, " ");
	if (!tk_end || (tk == tk_end)) {
		ofp_sendf(conn->fd, "Invalid IP6NET\r\n");
		sendcrlf(conn);
		return;
	}

	mlen = atoi(tk);

/* get IP6ADDR */
	tk = tk_end + 1;
	if (tk >= last) {
		ofp_sendf(conn->fd, "Invalid IP6NET\r\n");
		sendcrlf(conn);
		return;
	}
	tk_end = strstr(tk, " ");
	if (tk_end == NULL) {
		ofp_sendf(conn->fd, "Invalid IP6ADDR\r\n");
		sendcrlf(conn);
		return;
	}

	if (!ip6addr_get(tk, tk_end - tk, gw6)) {
		ofp_sendf(conn->fd, "Invalid IP6NET\r\n");
		sendcrlf(conn);
		return;
	}

/* get DEV */
	tk = tk_end + 1;
	if (tk >= last) {
		ofp_sendf(conn->fd, "Invalid DEV\r\n");
		sendcrlf(conn);
		return;
	}
	tk_end = last;

	port = ofp_name_to_port_vlan(tk, &vlan);
	if (port < 0 || port >= ofp_get_num_ports()) {
		ofp_sendf(conn->fd, "Invalid port!\r\n");
		sendcrlf(conn);
		return;
	}

	ofp_set_route6_params(OFP_ROUTE6_ADD, 0 /*vrf*/, vlan, port, dst6,
			      mlen, gw6);

	sendcrlf(conn);
}
Exemplo n.º 23
0
void f_help_route(struct cli_conn *conn, const char *s)
{
	(void)s;

	ofp_sendf(conn->fd, "Show configured routes:\r\n"
		"  route show\r\n\r\n");

	ofp_sendf(conn->fd, "Add IPv4 route:\r\n"
		"  route [-A inet4 ] add IP4NET gw IP4ADDR dev DEV\r\n"
		"    IP4NET: network address in a.b.c.d/e format\r\n"
		"    IP4ADDR: IP address in a.b.c.d format\r\n"
		"    DEV: ethernet interface name\r\n"
		"  Example:\r\n"
		"    route add 192.168.200.0/24 gw 192.168.100.1"
		" dev %s0\r\n\r\n", OFP_IFNAME_PREFIX);

	ofp_sendf(conn->fd, "Delete IPv4 route:\r\n"
		"  route [-A inet4] delete IP4NET\r\n"
		"    IP4NET: network address in a.b.c.d/e format\r\n"
		"  Example:\r\n"
		"    route delete 192.168.200.0/24\r\n\r\n");

	ofp_sendf(conn->fd, "Add IPv4 route to virtual route table:\r\n"
		"  route [-A inet4 ] add vrf VRF IP4NET gw IP4ADDR dev DEV\r\n"
		"    VRF: number\r\n"
		"    IP4NET: network address in a.b.c.d/n format\r\n"
		"    IP4ADDR: IP address in a.b.c.d format\r\n"
		"    DEV: ethernet interface name\r\n"
		"  Example:\r\n"
		"    route add vrf 2 192.168.200.0/24 gw 192.168.100.1"
		" dev %s0\r\n\r\n", OFP_IFNAME_PREFIX);

	ofp_sendf(conn->fd, "Delete IPv4 route from virtual route table:\r\n"
		"  route [-A inet4] delete vrf VRF IP4NET\r\n"
		"    VRF: number\r\n"
		"    IP4NET: network address in a.b.c.d/e format\r\n"
		"  Example:\r\n"
		"    route del vrf 2 192.168.200.0/24\r\n\r\n");
#ifdef INET6
	ofp_sendf(conn->fd, "Add IPv6 route:\r\n"
		"  route -A inet6 add IP6NET gw IP6ADDR dev DEV\r\n"
		"    IP6NET: network address in a:b:c:d:e:f:g:h/n or"
		" compressed format\r\n"
		"    IP6ADDR: IPv6 address in a:b:c:d:e:f:g:h or"
		" compressed format\r\n"
		"    DEV: ethernet interface name\r\n"
		"  Example:\r\n"
		"    route -A inet6 add 2000:1baf::/64 gw 2001:db8:0:f101:0:0:0:1"
		" dev %s0\r\n\r\n", OFP_IFNAME_PREFIX);

	ofp_sendf(conn->fd, "Delete IPv6 route:\r\n"
		"  route -A inet6 delete IP6NET\r\n"
		"    IP6NET: network address in a:b:c:d:e:f:g:h/n or"
		" compressed format\r\n"
		"  Example:\r\n"
		"    route -A inet6 delete 2000:1baf::/64\r\n\r\n");
#endif /* INET6 */
	ofp_sendf(conn->fd, "Show (this) help.\r\n"
		"  route help\r\n\r\n");
	sendcrlf(conn);
}