// detach a VIF from a vrf void vif_del(struct vif* vif) { ipv4_route_del(vif->label, vif->ip); rte_vhost_driver_unregister(vif->path); free(vif); }
int cmd_ipcfg(FILE *f, int argc, char ** argv) { struct ifnet * ifn; struct route * rt; in_addr_t ipv4_addr; in_addr_t ipv4_mask = INADDR_ANY; in_addr_t gw_addr = INADDR_ANY; int use_dhcp = 0; int change = 0; char s[64]; char ip[16]; char * env; char * cp; if (argc > 1) return SHELL_ERR_EXTRA_ARGS; fprintf(f, "\n** IP configuration utility **\n\n"); /* get current configuration */ if ((ifn = get_ifn_byname("eth0")) == NULL) return -1; ifn_ipv4_get(ifn, &ipv4_addr, &ipv4_mask); if ((rt = ipv4_route_get(INADDR_ANY, INADDR_ANY)) == NULL) gw_addr = INADDR_ANY; else gw_addr = rt->rt_gateway; use_dhcp = 0; /* get environment variable */ if ((env = getenv("IPCFG")) != NULL) { strcpy(s, env); if (!inet_aton(strtok(s, " ,"), (struct in_addr *)&ipv4_addr)) { return -1; } if (inet_aton(strtok(NULL, " ,"), (struct in_addr *)&ipv4_mask)) { if (inet_aton(strtok(NULL, " ,"), (struct in_addr *)&gw_addr)) { use_dhcp = strtoul(strtok(NULL, " , "), NULL, 0); } } } for(;;) { fprintf(f, " - IP addr(%s): ", inet_ntop(AF_INET, (void *)&ipv4_addr, ip, 16)); fgets(s, 32, f); if (s[0] == '\n') break; if (inet_aton(s, (struct in_addr *)&ipv4_addr)) { change++; break; } } for(;;) { fprintf(f, " - Network mask(%s): ", inet_ntop(AF_INET, (void *)&ipv4_mask, ip, 16)); fgets(s, 32, f); if (s[0] == '\n') break; if (inet_aton(s, (struct in_addr *)&ipv4_mask)) { change++; break; } } for (;;) { fprintf(f, " - Gateway addr(%s): ", inet_ntop(AF_INET, (void *)&gw_addr, ip, 16)); fgets(s, 32, f); if (s[0] == '\n') break; if (inet_aton(s, (struct in_addr *)&gw_addr)) { change++; break; } } #if 0 for (;;) { int c; fprintf(f, " - Enable DHCP [y/n]? (%c): ", use_dhcp ? 'y' : 'n'); fgets(s, 32, f); if (s[0] == '\n') break; c = tolower(s[0]); if ((c == 'y') || (c == 'n')) { use_dhcp = (c == 'y') ? 1 : 0; change++; break; } }; #endif if (!change) { fprintf(f, "\nKeeping current configuration.\n"); return 0; } cp = s + sprintf(s, "%s", inet_ntop(AF_INET, (void *)&ipv4_addr, ip, 16)); cp += sprintf(cp, " %s", inet_ntop(AF_INET, (void *)&ipv4_mask, ip, 16)); cp += sprintf(cp, " %s", inet_ntop(AF_INET, (void *)&gw_addr, ip, 16)); sprintf(cp, " %d", use_dhcp); if (setenv("IPCFG", s, 1) < 0) { fprintf(f, "setenv() error!\n"); return -1; } fprintf(f, "\nConfiguration saved.\n"); ifn_ipv4_set(ifn, ipv4_addr, ipv4_mask); /* set the default route */ ipv4_route_del(INADDR_ANY); ipv4_route_add(INADDR_ANY, INADDR_ANY, gw_addr, ifn); #if 0 fprintf(f, "\n - Restart the system [y/n]? "); fgets(s, 32, f); if ((tolower(s[0]) == 'y')) { cmd_reboot(f, 0, NULL); }; #endif return 0; }