MCPcopy Create free account
hub / github.com/F-Stack/f-stack / in_aifaddr_ioctl

Function in_aifaddr_ioctl

freebsd/netinet/in.c:341–549  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

339}
340
341static int
342in_aifaddr_ioctl(u_long cmd, caddr_t data, struct ifnet *ifp, struct thread *td)
343{
344 const struct in_aliasreq *ifra = (struct in_aliasreq *)data;
345 const struct sockaddr_in *addr = &ifra->ifra_addr;
346 const struct sockaddr_in *broadaddr = &ifra->ifra_broadaddr;
347 const struct sockaddr_in *mask = &ifra->ifra_mask;
348 const struct sockaddr_in *dstaddr = &ifra->ifra_dstaddr;
349 const int vhid = (cmd == SIOCAIFADDR) ? ifra->ifra_vhid : 0;
350 struct epoch_tracker et;
351 struct ifaddr *ifa;
352 struct in_ifaddr *ia;
353 bool iaIsFirst;
354 int error = 0;
355
356 error = priv_check(td, PRIV_NET_ADDIFADDR);
357 if (error)
358 return (error);
359
360 /*
361 * ifra_addr must be present and be of INET family.
362 * ifra_broadaddr/ifra_dstaddr and ifra_mask are optional.
363 */
364 if (addr->sin_len != sizeof(struct sockaddr_in) ||
365 addr->sin_family != AF_INET)
366 return (EINVAL);
367 if (broadaddr->sin_len != 0 &&
368 (broadaddr->sin_len != sizeof(struct sockaddr_in) ||
369 broadaddr->sin_family != AF_INET))
370 return (EINVAL);
371 if (mask->sin_len != 0 &&
372 (mask->sin_len != sizeof(struct sockaddr_in) ||
373 mask->sin_family != AF_INET))
374 return (EINVAL);
375 if ((ifp->if_flags & IFF_POINTOPOINT) &&
376 (dstaddr->sin_len != sizeof(struct sockaddr_in) ||
377 dstaddr->sin_addr.s_addr == INADDR_ANY))
378 return (EDESTADDRREQ);
379 if (vhid > 0 && carp_attach_p == NULL)
380 return (EPROTONOSUPPORT);
381
382 /*
383 * See whether address already exist.
384 */
385 iaIsFirst = true;
386 ia = NULL;
387 NET_EPOCH_ENTER(et);
388 CK_STAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
389 struct in_ifaddr *it;
390
391 if (ifa->ifa_addr->sa_family != AF_INET)
392 continue;
393
394 it = (struct in_ifaddr *)ifa;
395 if (it->ia_addr.sin_addr.s_addr == addr->sin_addr.s_addr &&
396 prison_check_ip4(td->td_ucred, &addr->sin_addr) == 0)
397 ia = it;
398 else

Callers 1

in_controlFunction · 0.85

Calls 13

in_difaddr_ioctlFunction · 0.85
ifa_allocFunction · 0.85
in_socktrimFunction · 0.85
ifa_refFunction · 0.85
in_addprefixFunction · 0.85
ia_need_loopback_routeFunction · 0.85
in_localip_moreFunction · 0.85
ifa_add_loopback_routeFunction · 0.85
ifa_freeFunction · 0.85
in_joingroupFunction · 0.85
in_scrubprefixFunction · 0.85
prison_check_ip4Function · 0.70

Tested by

no test coverage detected