* Writes information related to @rtinfo object to newly-allocated mbuf. * Assumes MCLBYTES is enough to construct any message. * Used for OS notifications of vaious events (if/ifa announces,etc) * * Returns allocated mbuf or NULL on failure. */
| 1549 | * Returns allocated mbuf or NULL on failure. |
| 1550 | */ |
| 1551 | static struct mbuf * |
| 1552 | rtsock_msg_mbuf(int type, struct rt_addrinfo *rtinfo) |
| 1553 | { |
| 1554 | struct sockaddr_storage ss; |
| 1555 | struct rt_msghdr *rtm; |
| 1556 | struct mbuf *m; |
| 1557 | int i; |
| 1558 | struct sockaddr *sa; |
| 1559 | #ifdef INET6 |
| 1560 | struct sockaddr_in6 *sin6; |
| 1561 | #endif |
| 1562 | int len, dlen; |
| 1563 | |
| 1564 | switch (type) { |
| 1565 | case RTM_DELADDR: |
| 1566 | case RTM_NEWADDR: |
| 1567 | len = sizeof(struct ifa_msghdr); |
| 1568 | break; |
| 1569 | |
| 1570 | case RTM_DELMADDR: |
| 1571 | case RTM_NEWMADDR: |
| 1572 | len = sizeof(struct ifma_msghdr); |
| 1573 | break; |
| 1574 | |
| 1575 | case RTM_IFINFO: |
| 1576 | len = sizeof(struct if_msghdr); |
| 1577 | break; |
| 1578 | |
| 1579 | case RTM_IFANNOUNCE: |
| 1580 | case RTM_IEEE80211: |
| 1581 | len = sizeof(struct if_announcemsghdr); |
| 1582 | break; |
| 1583 | |
| 1584 | default: |
| 1585 | len = sizeof(struct rt_msghdr); |
| 1586 | } |
| 1587 | |
| 1588 | /* XXXGL: can we use MJUMPAGESIZE cluster here? */ |
| 1589 | KASSERT(len <= MCLBYTES, ("%s: message too big", __func__)); |
| 1590 | if (len > MHLEN) |
| 1591 | m = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR); |
| 1592 | else |
| 1593 | m = m_gethdr(M_NOWAIT, MT_DATA); |
| 1594 | if (m == NULL) |
| 1595 | return (m); |
| 1596 | |
| 1597 | m->m_pkthdr.len = m->m_len = len; |
| 1598 | rtm = mtod(m, struct rt_msghdr *); |
| 1599 | bzero((caddr_t)rtm, len); |
| 1600 | for (i = 0; i < RTAX_MAX; i++) { |
| 1601 | if ((sa = rtinfo->rti_info[i]) == NULL) |
| 1602 | continue; |
| 1603 | rtinfo->rti_addrs |= (1 << i); |
| 1604 | |
| 1605 | dlen = SA_SIZE(sa); |
| 1606 | KASSERT(dlen <= sizeof(ss), |
| 1607 | ("%s: sockaddr size overflow", __func__)); |
| 1608 | bzero(&ss, sizeof(ss)); |
no test coverage detected