| 502 | } |
| 503 | |
| 504 | static int |
| 505 | ff_veth_setvaddr(struct ff_veth_softc *sc, struct ff_port_cfg *cfg, const char *if_name) |
| 506 | { |
| 507 | struct in_aliasreq req; |
| 508 | bzero(&req, sizeof req); |
| 509 | |
| 510 | if (if_name) { |
| 511 | strlcpy(req.ifra_name, if_name, IFNAMSIZ); |
| 512 | } else if (cfg->vip_ifname) { |
| 513 | strlcpy(req.ifra_name, cfg->vip_ifname, IFNAMSIZ); |
| 514 | } else { |
| 515 | strlcpy(req.ifra_name, sc->ifp->if_dname, IFNAMSIZ); |
| 516 | } |
| 517 | |
| 518 | struct sockaddr_in sa; |
| 519 | bzero(&sa, sizeof(sa)); |
| 520 | sa.sin_len = sizeof(sa); |
| 521 | sa.sin_family = AF_INET; |
| 522 | |
| 523 | int i, ret; |
| 524 | struct socket *so = NULL; |
| 525 | socreate(AF_INET, &so, SOCK_DGRAM, 0, curthread->td_ucred, curthread); |
| 526 | |
| 527 | for (i = 0; i < sc->nb_vip; ++i) { |
| 528 | sa.sin_addr.s_addr = sc->vip[i]; |
| 529 | bcopy(&sa, &req.ifra_addr, sizeof(sa)); |
| 530 | |
| 531 | // Only support '255.255.255.255' netmask now |
| 532 | sa.sin_addr.s_addr = 0xFFFFFFFF; |
| 533 | bcopy(&sa, &req.ifra_mask, sizeof(sa)); |
| 534 | |
| 535 | // Only support 'x.x.x.x' broadaddr now |
| 536 | sa.sin_addr.s_addr = sc->vip[i] /*| 0xFF000000*/; |
| 537 | bcopy(&sa, &req.ifra_broadaddr, sizeof(sa)); |
| 538 | |
| 539 | ret = ifioctl(so, SIOCAIFADDR, (caddr_t)&req, curthread); |
| 540 | if (ret < 0) { |
| 541 | printf("ff_veth_setvaddr ifioctl SIOCAIFADDR error\n"); |
| 542 | goto done; |
| 543 | } |
| 544 | } |
| 545 | |
| 546 | done: |
| 547 | soclose(so); |
| 548 | |
| 549 | return ret; |
| 550 | } |
| 551 | |
| 552 | #ifdef FF_IPFW |
| 553 | /* |