drop_monitor: Update netlink protocol to include netlink attribute header in alert...
[linux-2.6.git] / net / core / drop_monitor.c
index 9fd0dc3..2797b71 100644 (file)
@@ -51,7 +51,7 @@ static struct genl_family net_drop_monitor_family = {
        .id             = GENL_ID_GENERATE,
        .hdrsize        = 0,
        .name           = "NET_DM",
-       .version        = 1,
+       .version        = 2,
        .maxattr        = NET_DM_CMD_MAX,
 };
 
@@ -65,13 +65,17 @@ static void reset_per_cpu_data(struct per_cpu_dm_data *data)
 {
        size_t al;
        struct net_dm_alert_msg *msg;
+       struct nlattr *nla;
 
        al = sizeof(struct net_dm_alert_msg);
        al += dm_hit_limit * sizeof(struct net_dm_drop_point);
+       al += sizeof(struct nlattr);
+
        data->skb = genlmsg_new(al, GFP_KERNEL);
        genlmsg_put(data->skb, 0, 0, &net_drop_monitor_family,
                        0, NET_DM_CMD_ALERT);
-       msg = __nla_reserve_nohdr(data->skb, sizeof(struct net_dm_alert_msg));
+       nla = nla_reserve(data->skb, NLA_UNSPEC, sizeof(struct net_dm_alert_msg));
+       msg = nla_data(nla);
        memset(msg, 0, al);
        atomic_set(&data->dm_hit_count, dm_hit_limit);
 }
@@ -115,6 +119,7 @@ static void trace_kfree_skb_hit(struct sk_buff *skb, void *location)
 {
        struct net_dm_alert_msg *msg;
        struct nlmsghdr *nlh;
+       struct nlattr *nla;
        int i;
        struct per_cpu_dm_data *data = &__get_cpu_var(dm_cpu_data);
 
@@ -127,7 +132,8 @@ static void trace_kfree_skb_hit(struct sk_buff *skb, void *location)
        }
 
        nlh = (struct nlmsghdr *)data->skb->data;
-       msg = genlmsg_data(nlmsg_data(nlh));
+       nla = genlmsg_data(nlmsg_data(nlh));
+       msg = nla_data(nla);
        for (i = 0; i < msg->entries; i++) {
                if (!memcmp(&location, msg->points[i].pc, sizeof(void *))) {
                        msg->points[i].count++;
@@ -139,6 +145,7 @@ static void trace_kfree_skb_hit(struct sk_buff *skb, void *location)
         * We need to create a new entry
         */
        __nla_reserve_nohdr(data->skb, sizeof(struct net_dm_drop_point));
+       nla->nla_len += NLA_ALIGN(sizeof(struct net_dm_drop_point));
        memcpy(msg->points[msg->entries].pc, &location, sizeof(void *));
        msg->points[msg->entries].count = 1;
        msg->entries++;