1 // SPDX-License-Identifier: GPL-2.0-only
3 #include <linux/debugfs.h>
4 #include <linux/fault-inject.h>
5 #include <linux/netdevice.h>
6 #include <linux/skbuff.h>
9 struct fault_attr attr
;
10 char devname
[IFNAMSIZ
];
13 .attr
= FAULT_ATTR_INITIALIZER
,
17 static bool should_fail_net_realloc_skb(struct sk_buff
*skb
)
19 struct net_device
*net
= skb
->dev
;
21 if (skb_realloc
.filtered
&&
22 strncmp(net
->name
, skb_realloc
.devname
, IFNAMSIZ
))
23 /* device name filter set, but names do not match */
26 if (!should_fail(&skb_realloc
.attr
, 1))
31 ALLOW_ERROR_INJECTION(should_fail_net_realloc_skb
, TRUE
);
33 void skb_might_realloc(struct sk_buff
*skb
)
35 if (!should_fail_net_realloc_skb(skb
))
38 pskb_expand_head(skb
, 0, 0, GFP_ATOMIC
);
40 EXPORT_SYMBOL(skb_might_realloc
);
42 static int __init
fail_skb_realloc_setup(char *str
)
44 return setup_fault_attr(&skb_realloc
.attr
, str
);
46 __setup("fail_skb_realloc=", fail_skb_realloc_setup
);
48 static void reset_settings(void)
50 skb_realloc
.filtered
= false;
51 memset(&skb_realloc
.devname
, 0, IFNAMSIZ
);
54 static ssize_t
devname_write(struct file
*file
, const char __user
*buffer
,
55 size_t count
, loff_t
*ppos
)
60 ret
= simple_write_to_buffer(&skb_realloc
.devname
, IFNAMSIZ
,
65 skb_realloc
.devname
[IFNAMSIZ
- 1] = '\0';
66 /* Remove a possible \n at the end of devname */
67 strim(skb_realloc
.devname
);
69 if (strnlen(skb_realloc
.devname
, IFNAMSIZ
))
70 skb_realloc
.filtered
= true;
75 static ssize_t
devname_read(struct file
*file
,
77 size_t size
, loff_t
*ppos
)
79 if (!skb_realloc
.filtered
)
82 return simple_read_from_buffer(buffer
, size
, ppos
, &skb_realloc
.devname
,
83 strlen(skb_realloc
.devname
));
86 static const struct file_operations devname_ops
= {
87 .write
= devname_write
,
91 static int __init
fail_skb_realloc_debugfs(void)
93 umode_t mode
= S_IFREG
| 0600;
96 dir
= fault_create_debugfs_attr("fail_skb_realloc", NULL
,
101 debugfs_create_file("devname", mode
, dir
, NULL
, &devname_ops
);
106 late_initcall(fail_skb_realloc_debugfs
);