*/
 static int hsr_get_node_list(struct sk_buff *skb_in, struct genl_info *info)
 {
-       /* For receiving */
-       struct nlattr *na;
+       unsigned char addr[ETH_ALEN];
        struct net_device *hsr_dev;
-
-       /* For sending */
        struct sk_buff *skb_out;
-       void *msg_head;
        struct hsr_priv *hsr;
-       void *pos;
-       unsigned char addr[ETH_ALEN];
+       bool restart = false;
+       struct nlattr *na;
+       void *pos = NULL;
+       void *msg_head;
        int res;
 
        if (!info)
        if (!is_hsr_master(hsr_dev))
                goto rcu_unlock;
 
+restart:
        /* Send reply */
-       skb_out = genlmsg_new(NLMSG_GOODSIZE, GFP_ATOMIC);
+       skb_out = genlmsg_new(GENLMSG_DEFAULT_SIZE, GFP_ATOMIC);
        if (!skb_out) {
                res = -ENOMEM;
                goto fail;
                goto nla_put_failure;
        }
 
-       res = nla_put_u32(skb_out, HSR_A_IFINDEX, hsr_dev->ifindex);
-       if (res < 0)
-               goto nla_put_failure;
+       if (!restart) {
+               res = nla_put_u32(skb_out, HSR_A_IFINDEX, hsr_dev->ifindex);
+               if (res < 0)
+                       goto nla_put_failure;
+       }
 
        hsr = netdev_priv(hsr_dev);
 
-       pos = hsr_get_next_node(hsr, NULL, addr);
+       if (!pos)
+               pos = hsr_get_next_node(hsr, NULL, addr);
        while (pos) {
                res = nla_put(skb_out, HSR_A_NODE_ADDR, ETH_ALEN, addr);
-               if (res < 0)
+               if (res < 0) {
+                       if (res == -EMSGSIZE) {
+                               genlmsg_end(skb_out, msg_head);
+                               genlmsg_unicast(genl_info_net(info), skb_out,
+                                               info->snd_portid);
+                               restart = true;
+                               goto restart;
+                       }
                        goto nla_put_failure;
+               }
                pos = hsr_get_next_node(hsr, pos, addr);
        }
        rcu_read_unlock();
        return 0;
 
 nla_put_failure:
-       kfree_skb(skb_out);
+       nlmsg_free(skb_out);
        /* Fall through */
 
 fail: