/* "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); }
/* 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); }
/** * @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; } } }
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); }
/* "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); }
/* 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); }
/* 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); }
/* "show ifconfig" */ void f_ifconfig_show(struct cli_conn *conn, const char *s) { (void)s; ofp_show_interfaces(conn->fd); sendcrlf(conn); }
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); }
/* 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); }
/* 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); }
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); }
/** * @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); }
/* 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); }
/* 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); }
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); }
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); }
/* 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); }
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); }
/** * @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); }
/* "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); }
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); }
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); }