| 1743 | } |
| 1744 | |
| 1745 | int |
| 1746 | ff_route_ctl(enum FF_ROUTE_CTL req, enum FF_ROUTE_FLAG flag, |
| 1747 | struct linux_sockaddr *dst, struct linux_sockaddr *gw, |
| 1748 | struct linux_sockaddr *netmask) |
| 1749 | |
| 1750 | { |
| 1751 | struct sockaddr_storage sa_gw, sa_dst, sa_nm; |
| 1752 | struct sockaddr *psa_gw, *psa_dst, *psa_nm; |
| 1753 | int rtreq, rtflag; |
| 1754 | int rc; |
| 1755 | struct rt_addrinfo info; |
| 1756 | struct rib_cmd_info rci; |
| 1757 | |
| 1758 | switch (req) { |
| 1759 | case FF_ROUTE_ADD: |
| 1760 | rtreq = RTM_ADD; |
| 1761 | break; |
| 1762 | case FF_ROUTE_DEL: |
| 1763 | rtreq = RTM_DELETE; |
| 1764 | break; |
| 1765 | case FF_ROUTE_CHANGE: |
| 1766 | rtreq = RTM_CHANGE; |
| 1767 | break; |
| 1768 | default: |
| 1769 | rc = EINVAL; |
| 1770 | goto kern_fail; |
| 1771 | } |
| 1772 | |
| 1773 | switch (flag) { |
| 1774 | case FF_RTF_HOST: |
| 1775 | rtflag = RTF_HOST; |
| 1776 | break; |
| 1777 | case FF_RTF_GATEWAY: |
| 1778 | rtflag = RTF_GATEWAY; |
| 1779 | break; |
| 1780 | default: |
| 1781 | rc = EINVAL; |
| 1782 | goto kern_fail; |
| 1783 | }; |
| 1784 | |
| 1785 | bzero((caddr_t)&info, sizeof(info)); |
| 1786 | info.rti_flags = rtflag; |
| 1787 | |
| 1788 | if (gw != NULL) { |
| 1789 | psa_gw = (struct sockaddr *)&sa_gw; |
| 1790 | linux2freebsd_sockaddr(gw, sizeof(*gw), psa_gw); |
| 1791 | info.rti_info[RTAX_GATEWAY] = psa_gw; |
| 1792 | } else { |
| 1793 | psa_gw = NULL; |
| 1794 | } |
| 1795 | |
| 1796 | if (dst != NULL) { |
| 1797 | psa_dst = (struct sockaddr *)&sa_dst; |
| 1798 | linux2freebsd_sockaddr(dst, sizeof(*dst), psa_dst); |
| 1799 | info.rti_info[RTAX_DST] = psa_dst; |
| 1800 | } else { |
| 1801 | psa_dst = NULL; |
| 1802 | } |
nothing calls this directly
no test coverage detected