* Tries to update @lle link-level address. * Since update requires AFDATA WLOCK, function * drops @lle lock, acquires AFDATA lock and then acquires * @lle lock to maintain lock order. * * Returns 1 on success. */
| 326 | * Returns 1 on success. |
| 327 | */ |
| 328 | int |
| 329 | lltable_try_set_entry_addr(struct ifnet *ifp, struct llentry *lle, |
| 330 | const char *linkhdr, size_t linkhdrsize, int lladdr_off) |
| 331 | { |
| 332 | |
| 333 | /* Perform real LLE update */ |
| 334 | /* use afdata WLOCK to update fields */ |
| 335 | LLE_WLOCK_ASSERT(lle); |
| 336 | LLE_ADDREF(lle); |
| 337 | LLE_WUNLOCK(lle); |
| 338 | IF_AFDATA_WLOCK(ifp); |
| 339 | LLE_WLOCK(lle); |
| 340 | |
| 341 | /* |
| 342 | * Since we droppped LLE lock, other thread might have deleted |
| 343 | * this lle. Check and return |
| 344 | */ |
| 345 | if ((lle->la_flags & LLE_DELETED) != 0) { |
| 346 | IF_AFDATA_WUNLOCK(ifp); |
| 347 | LLE_FREE_LOCKED(lle); |
| 348 | return (0); |
| 349 | } |
| 350 | |
| 351 | /* Update data */ |
| 352 | lltable_set_entry_addr(ifp, lle, linkhdr, linkhdrsize, lladdr_off); |
| 353 | |
| 354 | IF_AFDATA_WUNLOCK(ifp); |
| 355 | |
| 356 | LLE_REMREF(lle); |
| 357 | |
| 358 | return (1); |
| 359 | } |
| 360 | |
| 361 | /* |
| 362 | * Helper function used to pre-compute full/partial link-layer |
no test coverage detected