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

Function rtsock_msg_buffer

lib/ff_route.c:731–841  ·  view source on GitHub ↗

* Writes information related to @rtinfo object to preallocated buffer. * Stores needed size in @plen. If @w is NULL, calculates size without * writing. * Used for sysctl dumps and rtsock answers (RTM_DEL/RTM_GET) generation. * * Returns 0 on success. * */

Source from the content-addressed store, hash-verified

729 *
730 */
731static int
732rtsock_msg_buffer(int type, struct rt_addrinfo *rtinfo, struct walkarg *w, int *plen)
733{
734 int i;
735 int len, buflen = 0, dlen;
736 caddr_t cp = NULL;
737 struct rt_msghdr *rtm = NULL;
738#ifdef INET6
739 struct sockaddr_storage ss;
740 struct sockaddr_in6 *sin6;
741#endif
742
743 switch (type) {
744
745 case RTM_DELADDR:
746 case RTM_NEWADDR:
747 if (w != NULL && w->w_op == NET_RT_IFLISTL) {
748#ifdef COMPAT_FREEBSD32
749 if (w->w_req->flags & SCTL_MASK32)
750 len = sizeof(struct ifa_msghdrl32);
751 else
752#endif
753 len = sizeof(struct ifa_msghdrl);
754 } else
755 len = sizeof(struct ifa_msghdr);
756 break;
757
758 case RTM_IFINFO:
759#ifdef COMPAT_FREEBSD32
760 if (w != NULL && w->w_req->flags & SCTL_MASK32) {
761 if (w->w_op == NET_RT_IFLISTL)
762 len = sizeof(struct if_msghdrl32);
763 else
764 len = sizeof(struct if_msghdr32);
765 break;
766 }
767#endif
768 if (w != NULL && w->w_op == NET_RT_IFLISTL)
769 len = sizeof(struct if_msghdrl);
770 else
771 len = sizeof(struct if_msghdr);
772 break;
773
774 case RTM_NEWMADDR:
775 len = sizeof(struct ifma_msghdr);
776 break;
777
778 default:
779 len = sizeof(struct rt_msghdr);
780 }
781
782 if (w != NULL) {
783 rtm = (struct rt_msghdr *)w->w_tmem;
784 buflen = w->w_tmemsize - len;
785 cp = (caddr_t)w->w_tmem + len;
786 }
787
788 rtinfo->rti_addrs = 0;

Callers 2

update_rtm_from_rcFunction · 0.70
ff_rtioctl_oldFunction · 0.70

Calls 1

sa6_recoverscopeFunction · 0.85

Tested by

no test coverage detected