| 402 | } |
| 403 | |
| 404 | static void |
| 405 | toe_lle_event(void *arg __unused, struct llentry *lle, int evt) |
| 406 | { |
| 407 | struct toedev *tod; |
| 408 | struct ifnet *ifp; |
| 409 | struct sockaddr *sa; |
| 410 | uint8_t *lladdr; |
| 411 | uint16_t vid, pcp; |
| 412 | int family; |
| 413 | struct sockaddr_in6 sin6; |
| 414 | |
| 415 | LLE_WLOCK_ASSERT(lle); |
| 416 | |
| 417 | ifp = lltable_get_ifp(lle->lle_tbl); |
| 418 | family = lltable_get_af(lle->lle_tbl); |
| 419 | |
| 420 | if (family != AF_INET && family != AF_INET6) |
| 421 | return; |
| 422 | /* |
| 423 | * Not interested if the interface's TOE capability is not enabled. |
| 424 | */ |
| 425 | if ((family == AF_INET && !(ifp->if_capenable & IFCAP_TOE4)) || |
| 426 | (family == AF_INET6 && !(ifp->if_capenable & IFCAP_TOE6))) |
| 427 | return; |
| 428 | |
| 429 | tod = TOEDEV(ifp); |
| 430 | if (tod == NULL) |
| 431 | return; |
| 432 | |
| 433 | sa = (struct sockaddr *)&sin6; |
| 434 | lltable_fill_sa_entry(lle, sa); |
| 435 | |
| 436 | vid = 0xfff; |
| 437 | pcp = 0; |
| 438 | if (evt != LLENTRY_RESOLVED) { |
| 439 | /* |
| 440 | * LLENTRY_TIMEDOUT, LLENTRY_DELETED, LLENTRY_EXPIRED all mean |
| 441 | * this entry is going to be deleted. |
| 442 | */ |
| 443 | |
| 444 | lladdr = NULL; |
| 445 | } else { |
| 446 | KASSERT(lle->la_flags & LLE_VALID, |
| 447 | ("%s: %p resolved but not valid?", __func__, lle)); |
| 448 | |
| 449 | lladdr = (uint8_t *)lle->ll_addr; |
| 450 | VLAN_TAG(ifp, &vid); |
| 451 | VLAN_PCP(ifp, &pcp); |
| 452 | } |
| 453 | |
| 454 | tod->tod_l2_update(tod, ifp, sa, lladdr, EVL_MAKETAG(vid, pcp, 0)); |
| 455 | } |
| 456 | |
| 457 | /* |
| 458 | * Returns 0 or EWOULDBLOCK on success (any other value is an error). 0 means |
nothing calls this directly
no test coverage detected