* 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. * */
| 729 | * |
| 730 | */ |
| 731 | static int |
| 732 | rtsock_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; |
no test coverage detected