| 401 | } |
| 402 | |
| 403 | static int |
| 404 | me_set_tunnel(struct me_softc *sc, in_addr_t src, in_addr_t dst) |
| 405 | { |
| 406 | struct me_softc *tmp; |
| 407 | |
| 408 | sx_assert(&me_ioctl_sx, SA_XLOCKED); |
| 409 | |
| 410 | if (V_me_hashtbl == NULL) { |
| 411 | V_me_hashtbl = me_hashinit(); |
| 412 | V_me_srchashtbl = me_hashinit(); |
| 413 | } |
| 414 | |
| 415 | if (sc->me_src.s_addr == src && sc->me_dst.s_addr == dst) |
| 416 | return (0); |
| 417 | |
| 418 | CK_LIST_FOREACH(tmp, &ME_HASH(src, dst), chain) { |
| 419 | if (tmp == sc) |
| 420 | continue; |
| 421 | if (tmp->me_src.s_addr == src && |
| 422 | tmp->me_dst.s_addr == dst) |
| 423 | return (EADDRNOTAVAIL); |
| 424 | } |
| 425 | |
| 426 | me_delete_tunnel(sc); |
| 427 | sc->me_dst.s_addr = dst; |
| 428 | sc->me_src.s_addr = src; |
| 429 | CK_LIST_INSERT_HEAD(&ME_HASH(src, dst), sc, chain); |
| 430 | CK_LIST_INSERT_HEAD(&ME_SRCHASH(src), sc, srchash); |
| 431 | |
| 432 | me_set_running(sc); |
| 433 | if_link_state_change(ME2IFP(sc), LINK_STATE_UP); |
| 434 | return (0); |
| 435 | } |
| 436 | |
| 437 | static void |
| 438 | me_delete_tunnel(struct me_softc *sc) |
no test coverage detected