|
@@ -1550,7 +1550,7 @@ static void ip6_mc_hdr(struct sock *sk, struct sk_buff *skb,
|
|
hdr->daddr = *daddr;
|
|
hdr->daddr = *daddr;
|
|
}
|
|
}
|
|
|
|
|
|
-static struct sk_buff *mld_newpack(struct inet6_dev *idev, int size)
|
|
|
|
|
|
+static struct sk_buff *mld_newpack(struct inet6_dev *idev, unsigned int mtu)
|
|
{
|
|
{
|
|
struct net_device *dev = idev->dev;
|
|
struct net_device *dev = idev->dev;
|
|
struct net *net = dev_net(dev);
|
|
struct net *net = dev_net(dev);
|
|
@@ -1561,13 +1561,13 @@ static struct sk_buff *mld_newpack(struct inet6_dev *idev, int size)
|
|
const struct in6_addr *saddr;
|
|
const struct in6_addr *saddr;
|
|
int hlen = LL_RESERVED_SPACE(dev);
|
|
int hlen = LL_RESERVED_SPACE(dev);
|
|
int tlen = dev->needed_tailroom;
|
|
int tlen = dev->needed_tailroom;
|
|
|
|
+ unsigned int size = mtu + hlen + tlen;
|
|
int err;
|
|
int err;
|
|
u8 ra[8] = { IPPROTO_ICMPV6, 0,
|
|
u8 ra[8] = { IPPROTO_ICMPV6, 0,
|
|
IPV6_TLV_ROUTERALERT, 2, 0, 0,
|
|
IPV6_TLV_ROUTERALERT, 2, 0, 0,
|
|
IPV6_TLV_PADN, 0 };
|
|
IPV6_TLV_PADN, 0 };
|
|
|
|
|
|
/* we assume size > sizeof(ra) here */
|
|
/* we assume size > sizeof(ra) here */
|
|
- size += hlen + tlen;
|
|
|
|
/* limit our allocations to order-0 page */
|
|
/* limit our allocations to order-0 page */
|
|
size = min_t(int, size, SKB_MAX_ORDER(0, 0));
|
|
size = min_t(int, size, SKB_MAX_ORDER(0, 0));
|
|
skb = sock_alloc_send_skb(sk, size, 1, &err);
|
|
skb = sock_alloc_send_skb(sk, size, 1, &err);
|
|
@@ -1576,6 +1576,8 @@ static struct sk_buff *mld_newpack(struct inet6_dev *idev, int size)
|
|
return NULL;
|
|
return NULL;
|
|
|
|
|
|
skb->priority = TC_PRIO_CONTROL;
|
|
skb->priority = TC_PRIO_CONTROL;
|
|
|
|
+ skb->reserved_tailroom = skb_end_offset(skb) -
|
|
|
|
+ min(mtu, skb_end_offset(skb));
|
|
skb_reserve(skb, hlen);
|
|
skb_reserve(skb, hlen);
|
|
|
|
|
|
if (__ipv6_get_lladdr(idev, &addr_buf, IFA_F_TENTATIVE)) {
|
|
if (__ipv6_get_lladdr(idev, &addr_buf, IFA_F_TENTATIVE)) {
|
|
@@ -1690,8 +1692,7 @@ static struct sk_buff *add_grhead(struct sk_buff *skb, struct ifmcaddr6 *pmc,
|
|
return skb;
|
|
return skb;
|
|
}
|
|
}
|
|
|
|
|
|
-#define AVAILABLE(skb) ((skb) ? ((skb)->dev ? (skb)->dev->mtu - (skb)->len : \
|
|
|
|
- skb_tailroom(skb)) : 0)
|
|
|
|
|
|
+#define AVAILABLE(skb) ((skb) ? skb_availroom(skb) : 0)
|
|
|
|
|
|
static struct sk_buff *add_grec(struct sk_buff *skb, struct ifmcaddr6 *pmc,
|
|
static struct sk_buff *add_grec(struct sk_buff *skb, struct ifmcaddr6 *pmc,
|
|
int type, int gdeleted, int sdeleted, int crsend)
|
|
int type, int gdeleted, int sdeleted, int crsend)
|