@@ -34,20 +34,21 @@ Sender and receiver configuration:
It takes a string configuration parameter "netconsole" in the
following format::
- netconsole=[+][src-port]@[src-ip]/[<dev>],[tgt-port]@<tgt-ip>/[tgt-macaddr]
+ netconsole=[+][src-port]@[src-ip]/[<dev>][*],[tgt-port]@<tgt-ip>/[tgt-macaddr]
where
+ if present, enable extended console support
src-port source for UDP packets (defaults to 6665)
src-ip source IP to use (interface address)
dev network interface (eth0)
+ * if present, allow runtime network interface renaming
tgt-port port for logging agent (6666)
tgt-ip IP address for logging agent
tgt-macaddr ethernet MAC address for logging agent (broadcast)
Examples::
- linux netconsole=4444@10.0.0.1/eth1,9353@10.0.0.2/12:34:56:78:9a:bc
+ linux netconsole=4444@10.0.0.1/eth1*,9353@10.0.0.2/12:34:56:78:9a:bc
or::
@@ -32,6 +32,7 @@ struct netpoll {
bool ipv6;
u16 local_port, remote_port;
u8 remote_mac[ETH_ALEN];
+ bool iface_live_renaming;
};
struct netpoll_info {
@@ -51,9 +52,11 @@ struct netpoll_info {
void netpoll_poll_dev(struct net_device *dev);
void netpoll_poll_disable(struct net_device *dev);
void netpoll_poll_enable(struct net_device *dev);
+bool netpoll_live_renaming_enabled(struct net_device *dev);
#else
static inline void netpoll_poll_disable(struct net_device *dev) { return; }
static inline void netpoll_poll_enable(struct net_device *dev) { return; }
+static inline bool netpoll_live_renaming_enabled(struct net_device *dev) { return false; }
#endif
void netpoll_send_udp(struct netpoll *np, const char *msg, int len);
@@ -1176,7 +1176,8 @@ int dev_change_name(struct net_device *dev, const char *newname)
* directly.
*/
if (dev->flags & IFF_UP &&
- likely(!(dev->priv_flags & IFF_LIVE_RENAME_OK)))
+ likely(!(dev->priv_flags & IFF_LIVE_RENAME_OK) &&
+ !netpoll_live_renaming_enabled(dev)))
return -EBUSY;
down_write(&devnet_rename_sem);
@@ -224,6 +224,15 @@ void netpoll_poll_enable(struct net_device *dev)
}
EXPORT_SYMBOL(netpoll_poll_enable);
+bool netpoll_live_renaming_enabled(struct net_device *dev)
+{
+ if (dev->npinfo && dev->npinfo->netpoll->iface_live_renaming)
+ return true;
+
+ return false;
+}
+EXPORT_SYMBOL(netpoll_live_renaming_enabled);
+
static void refill_skbs(void)
{
struct sk_buff *skb;
@@ -523,7 +532,7 @@ static int netpoll_parse_ip_addr(const char *str, union inet_addr *addr)
int netpoll_parse_options(struct netpoll *np, char *opt)
{
- char *cur=opt, *delim;
+ char *cur = opt, *delim, *asterisk;
int ipv6;
bool ipversion_set = false;
@@ -556,6 +565,13 @@ int netpoll_parse_options(struct netpoll *np, char *opt)
if ((delim = strchr(cur, ',')) == NULL)
goto parse_failed;
*delim = 0;
+
+ asterisk = strchr(cur, '*');
+ if (asterisk) {
+ np->iface_live_renaming = true;
+ *asterisk = 0;
+ }
+
strscpy(np->dev_name, cur, sizeof(np->dev_name));
cur = delim;
}
@@ -62,6 +62,7 @@
#include <net/gro.h>
#include <linux/uaccess.h>
#include <net/pkt_sched.h>
+#include <linux/netpoll.h>
/**
* eth_header - create the Ethernet header
@@ -288,8 +289,10 @@ int eth_prepare_mac_addr_change(struct net_device *dev, void *p)
{
struct sockaddr *addr = p;
- if (!(dev->priv_flags & IFF_LIVE_ADDR_CHANGE) && netif_running(dev))
+ if (!(dev->priv_flags & IFF_LIVE_ADDR_CHANGE) && netif_running(dev) &&
+ !netpoll_live_renaming_enabled(dev))
return -EBUSY;
+
if (!is_valid_ether_addr(addr->sa_data))
return -EADDRNOTAVAIL;
return 0;