New loopback device module does not show trace in wiresharkModule Stacking in Linux device driversRmmod...
Employer wants to use my work email account after I quit, is this legal under German law? Is this a GDPR waiver?
Smooth Julia set for quadratic polynomials
Story-based adventure with functions and relationships
Using “sparkling” as a diminutive of “spark” in a poem
How to append a matrix element by element
Would a two-seat light aircaft with a landing speed of 20 knots and a top speed of 180 knots be technically possible?
Distance Matrix (plugin) - QGIS
A player is constantly pestering me about rules, what do I do as a DM?
What happens when your group is victim of a surprise attack but you can't be surprised?
Is it damaging to turn off a small fridge for two days every week?
What do you call a weak person's act of taking on bigger opponents?
No IMPLICIT_CONVERSION warning in this query plan
How can I deal with a coworker killed on the job
First-year PhD giving a talk among well-established researchers in the field
Links to webpages in books
Why do some professors with PhDs leave their professorships to teach high school?
Change the boot order with no option in UEFI settings
Inverse-quotes-quine
Can ADFS connect to other SSO services?
How can I convince my reader that I will not use a certain trope?
What are the penalties for overstaying in USA?
What is the legal status of travelling with (unprescribed) methadone in your carry-on?
ては's role in this 「追いかけては来ないでしょう」
Why doesn't a marching band have strings?
New loopback device module does not show trace in wireshark
Module Stacking in Linux device driversRmmod module reappeared after plugging back deviceinsmod: ERROR: could not insert module 8188eu.ko: Invalid module formatintel_agp kernel module not foundKernel not recognizing new devices from DKMS module?OpenBSD: Defining a new loopback interfaceIs it possible to put a real IP on a loopback device?Persistent module loading not workingDoes “loopback” in a loopback file mean the same as in loopback IP address?Trying to make loopback device as Alsa-to-Jack bridge
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ margin-bottom:0;
}
I am trying to write a network device driver that can duplicate the functionality of the loopback device. I modified the code available at the link. I am testing on Linux 4.8. I removed code related to stats and loopback registration with network namespace. For this variable, I couldn't find the definition, so for now its removed.
/* testlo.c */
#include <linux/kernel.h>
#include <linux/jiffies.h>
#include <linux/module.h>
#include <linux/interrupt.h>
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/string.h>
#include <linux/socket.h>
#include <linux/errno.h>
#include <linux/fcntl.h>
#include <linux/in.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include <linux/inet.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/skbuff.h>
#include <linux/ethtool.h>
#include <net/sock.h>
#include <net/checksum.h>
#include <linux/if_ether.h> /* For the statistics structure. */
#include <linux/if_arp.h> /* For ARPHRD_ETHER */
#include <linux/ip.h>
#include <linux/tcp.h>
#include <linux/percpu.h>
#include <net/net_namespace.h>
#include <linux/u64_stats_sync.h>
/*
* The higher levels take care of making this non-reentrant (it's
* called with bh's disabled).
*/
netdev_tx_t loopback_xmit(struct sk_buff *skb,
struct net_device *dev)
{
//struct pcpu_lstats *lb_stats;
int len;
skb_orphan(skb);
/* Before queueing this packet to netif_rx(),
* make sure dst is refcounted.
*/
skb_dst_force(skb);
skb->protocol = eth_type_trans(skb, dev);
len = skb->len;
if (likely(netif_rx(skb) == NET_RX_SUCCESS)) { }
printk("Received packet at device driver n");
return NETDEV_TX_OK;
}
u32 always_on(struct net_device *dev)
{
return 1;
}
const struct ethtool_ops loopback_ethtool_ops = {
.get_link = always_on,
};
int loopback_dev_init(struct net_device *dev)
{
return 0;
}
void loopback_dev_free(struct net_device *dev)
{
free_netdev(dev);
}
const struct net_device_ops loopback_ops = {
.ndo_init = loopback_dev_init,
.ndo_start_xmit= loopback_xmit,
.ndo_set_mac_address = eth_mac_addr,
};
/*
* The loopback device is special. There is only one instance
* per network namespace.
*/
void loopback_setup(struct net_device *dev)
{
dev->mtu = 64 * 1024;
dev->hard_header_len = ETH_HLEN; /* 14 */
dev->addr_len = ETH_ALEN; /* 6 */
dev->type = ARPHRD_LOOPBACK; /* 0x0001*/
dev->flags = IFF_LOOPBACK;
dev->priv_flags |= IFF_LIVE_ADDR_CHANGE | IFF_NO_QUEUE;
netif_keep_dst(dev);
dev->hw_features = NETIF_F_GSO_SOFTWARE;
dev->features = NETIF_F_SG | NETIF_F_FRAGLIST
| NETIF_F_GSO_SOFTWARE
| NETIF_F_HW_CSUM
| NETIF_F_RXCSUM
| NETIF_F_SCTP_CRC
| NETIF_F_HIGHDMA
| NETIF_F_LLTX
| NETIF_F_NETNS_LOCAL
| NETIF_F_VLAN_CHALLENGED
| NETIF_F_LOOPBACK;
dev->ethtool_ops = &loopback_ethtool_ops;
dev->netdev_ops = &loopback_ops;
dev->destructor = loopback_dev_free;
}
struct net_device *global_dev;
/* Setup and register the loopback device. */
int init_dev (void)
{
struct net_device *dev;
int err;
printk ("Init Modulen");
err = -ENOMEM;
dev = alloc_netdev(0, "testlo", NET_NAME_UNKNOWN, loopback_setup);
if (!dev)
goto out;
err = register_netdev(dev);
if (err)
goto out_free_netdev;
BUG_ON(dev->ifindex != LOOPBACK_IFINDEX);
global_dev = dev;
return 0;
out_free_netdev:
free_netdev(dev);
out:
return err;
}
void cleanup (void)
{
printk ("Cleaning Up Modulen");
unregister_netdev (global_dev);
return;
}
module_init (init_dev);
module_exit (cleanup);
Makefile:
obj-m += testlo.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
Once I compile the code and insert the kernel module, I can see my new device (testlo) in the list from ip a
. I can set the device state to up and assign it an IP address. However, the code's function loopback_xmit()
doesn't get triggered if I try to ping that IP (I do see ping responses). If I check in wireshark, there is no trace if I ping the new device's IP. In the default loopback device (lo), pinging 127.0.0.1
shows a trace in wireshark.
Can someone tell what is missing in the code to make it behave like a loopback device ?
networking kernel-modules loopback
add a comment |
I am trying to write a network device driver that can duplicate the functionality of the loopback device. I modified the code available at the link. I am testing on Linux 4.8. I removed code related to stats and loopback registration with network namespace. For this variable, I couldn't find the definition, so for now its removed.
/* testlo.c */
#include <linux/kernel.h>
#include <linux/jiffies.h>
#include <linux/module.h>
#include <linux/interrupt.h>
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/string.h>
#include <linux/socket.h>
#include <linux/errno.h>
#include <linux/fcntl.h>
#include <linux/in.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include <linux/inet.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/skbuff.h>
#include <linux/ethtool.h>
#include <net/sock.h>
#include <net/checksum.h>
#include <linux/if_ether.h> /* For the statistics structure. */
#include <linux/if_arp.h> /* For ARPHRD_ETHER */
#include <linux/ip.h>
#include <linux/tcp.h>
#include <linux/percpu.h>
#include <net/net_namespace.h>
#include <linux/u64_stats_sync.h>
/*
* The higher levels take care of making this non-reentrant (it's
* called with bh's disabled).
*/
netdev_tx_t loopback_xmit(struct sk_buff *skb,
struct net_device *dev)
{
//struct pcpu_lstats *lb_stats;
int len;
skb_orphan(skb);
/* Before queueing this packet to netif_rx(),
* make sure dst is refcounted.
*/
skb_dst_force(skb);
skb->protocol = eth_type_trans(skb, dev);
len = skb->len;
if (likely(netif_rx(skb) == NET_RX_SUCCESS)) { }
printk("Received packet at device driver n");
return NETDEV_TX_OK;
}
u32 always_on(struct net_device *dev)
{
return 1;
}
const struct ethtool_ops loopback_ethtool_ops = {
.get_link = always_on,
};
int loopback_dev_init(struct net_device *dev)
{
return 0;
}
void loopback_dev_free(struct net_device *dev)
{
free_netdev(dev);
}
const struct net_device_ops loopback_ops = {
.ndo_init = loopback_dev_init,
.ndo_start_xmit= loopback_xmit,
.ndo_set_mac_address = eth_mac_addr,
};
/*
* The loopback device is special. There is only one instance
* per network namespace.
*/
void loopback_setup(struct net_device *dev)
{
dev->mtu = 64 * 1024;
dev->hard_header_len = ETH_HLEN; /* 14 */
dev->addr_len = ETH_ALEN; /* 6 */
dev->type = ARPHRD_LOOPBACK; /* 0x0001*/
dev->flags = IFF_LOOPBACK;
dev->priv_flags |= IFF_LIVE_ADDR_CHANGE | IFF_NO_QUEUE;
netif_keep_dst(dev);
dev->hw_features = NETIF_F_GSO_SOFTWARE;
dev->features = NETIF_F_SG | NETIF_F_FRAGLIST
| NETIF_F_GSO_SOFTWARE
| NETIF_F_HW_CSUM
| NETIF_F_RXCSUM
| NETIF_F_SCTP_CRC
| NETIF_F_HIGHDMA
| NETIF_F_LLTX
| NETIF_F_NETNS_LOCAL
| NETIF_F_VLAN_CHALLENGED
| NETIF_F_LOOPBACK;
dev->ethtool_ops = &loopback_ethtool_ops;
dev->netdev_ops = &loopback_ops;
dev->destructor = loopback_dev_free;
}
struct net_device *global_dev;
/* Setup and register the loopback device. */
int init_dev (void)
{
struct net_device *dev;
int err;
printk ("Init Modulen");
err = -ENOMEM;
dev = alloc_netdev(0, "testlo", NET_NAME_UNKNOWN, loopback_setup);
if (!dev)
goto out;
err = register_netdev(dev);
if (err)
goto out_free_netdev;
BUG_ON(dev->ifindex != LOOPBACK_IFINDEX);
global_dev = dev;
return 0;
out_free_netdev:
free_netdev(dev);
out:
return err;
}
void cleanup (void)
{
printk ("Cleaning Up Modulen");
unregister_netdev (global_dev);
return;
}
module_init (init_dev);
module_exit (cleanup);
Makefile:
obj-m += testlo.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
Once I compile the code and insert the kernel module, I can see my new device (testlo) in the list from ip a
. I can set the device state to up and assign it an IP address. However, the code's function loopback_xmit()
doesn't get triggered if I try to ping that IP (I do see ping responses). If I check in wireshark, there is no trace if I ping the new device's IP. In the default loopback device (lo), pinging 127.0.0.1
shows a trace in wireshark.
Can someone tell what is missing in the code to make it behave like a loopback device ?
networking kernel-modules loopback
add a comment |
I am trying to write a network device driver that can duplicate the functionality of the loopback device. I modified the code available at the link. I am testing on Linux 4.8. I removed code related to stats and loopback registration with network namespace. For this variable, I couldn't find the definition, so for now its removed.
/* testlo.c */
#include <linux/kernel.h>
#include <linux/jiffies.h>
#include <linux/module.h>
#include <linux/interrupt.h>
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/string.h>
#include <linux/socket.h>
#include <linux/errno.h>
#include <linux/fcntl.h>
#include <linux/in.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include <linux/inet.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/skbuff.h>
#include <linux/ethtool.h>
#include <net/sock.h>
#include <net/checksum.h>
#include <linux/if_ether.h> /* For the statistics structure. */
#include <linux/if_arp.h> /* For ARPHRD_ETHER */
#include <linux/ip.h>
#include <linux/tcp.h>
#include <linux/percpu.h>
#include <net/net_namespace.h>
#include <linux/u64_stats_sync.h>
/*
* The higher levels take care of making this non-reentrant (it's
* called with bh's disabled).
*/
netdev_tx_t loopback_xmit(struct sk_buff *skb,
struct net_device *dev)
{
//struct pcpu_lstats *lb_stats;
int len;
skb_orphan(skb);
/* Before queueing this packet to netif_rx(),
* make sure dst is refcounted.
*/
skb_dst_force(skb);
skb->protocol = eth_type_trans(skb, dev);
len = skb->len;
if (likely(netif_rx(skb) == NET_RX_SUCCESS)) { }
printk("Received packet at device driver n");
return NETDEV_TX_OK;
}
u32 always_on(struct net_device *dev)
{
return 1;
}
const struct ethtool_ops loopback_ethtool_ops = {
.get_link = always_on,
};
int loopback_dev_init(struct net_device *dev)
{
return 0;
}
void loopback_dev_free(struct net_device *dev)
{
free_netdev(dev);
}
const struct net_device_ops loopback_ops = {
.ndo_init = loopback_dev_init,
.ndo_start_xmit= loopback_xmit,
.ndo_set_mac_address = eth_mac_addr,
};
/*
* The loopback device is special. There is only one instance
* per network namespace.
*/
void loopback_setup(struct net_device *dev)
{
dev->mtu = 64 * 1024;
dev->hard_header_len = ETH_HLEN; /* 14 */
dev->addr_len = ETH_ALEN; /* 6 */
dev->type = ARPHRD_LOOPBACK; /* 0x0001*/
dev->flags = IFF_LOOPBACK;
dev->priv_flags |= IFF_LIVE_ADDR_CHANGE | IFF_NO_QUEUE;
netif_keep_dst(dev);
dev->hw_features = NETIF_F_GSO_SOFTWARE;
dev->features = NETIF_F_SG | NETIF_F_FRAGLIST
| NETIF_F_GSO_SOFTWARE
| NETIF_F_HW_CSUM
| NETIF_F_RXCSUM
| NETIF_F_SCTP_CRC
| NETIF_F_HIGHDMA
| NETIF_F_LLTX
| NETIF_F_NETNS_LOCAL
| NETIF_F_VLAN_CHALLENGED
| NETIF_F_LOOPBACK;
dev->ethtool_ops = &loopback_ethtool_ops;
dev->netdev_ops = &loopback_ops;
dev->destructor = loopback_dev_free;
}
struct net_device *global_dev;
/* Setup and register the loopback device. */
int init_dev (void)
{
struct net_device *dev;
int err;
printk ("Init Modulen");
err = -ENOMEM;
dev = alloc_netdev(0, "testlo", NET_NAME_UNKNOWN, loopback_setup);
if (!dev)
goto out;
err = register_netdev(dev);
if (err)
goto out_free_netdev;
BUG_ON(dev->ifindex != LOOPBACK_IFINDEX);
global_dev = dev;
return 0;
out_free_netdev:
free_netdev(dev);
out:
return err;
}
void cleanup (void)
{
printk ("Cleaning Up Modulen");
unregister_netdev (global_dev);
return;
}
module_init (init_dev);
module_exit (cleanup);
Makefile:
obj-m += testlo.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
Once I compile the code and insert the kernel module, I can see my new device (testlo) in the list from ip a
. I can set the device state to up and assign it an IP address. However, the code's function loopback_xmit()
doesn't get triggered if I try to ping that IP (I do see ping responses). If I check in wireshark, there is no trace if I ping the new device's IP. In the default loopback device (lo), pinging 127.0.0.1
shows a trace in wireshark.
Can someone tell what is missing in the code to make it behave like a loopback device ?
networking kernel-modules loopback
I am trying to write a network device driver that can duplicate the functionality of the loopback device. I modified the code available at the link. I am testing on Linux 4.8. I removed code related to stats and loopback registration with network namespace. For this variable, I couldn't find the definition, so for now its removed.
/* testlo.c */
#include <linux/kernel.h>
#include <linux/jiffies.h>
#include <linux/module.h>
#include <linux/interrupt.h>
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/string.h>
#include <linux/socket.h>
#include <linux/errno.h>
#include <linux/fcntl.h>
#include <linux/in.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include <linux/inet.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/skbuff.h>
#include <linux/ethtool.h>
#include <net/sock.h>
#include <net/checksum.h>
#include <linux/if_ether.h> /* For the statistics structure. */
#include <linux/if_arp.h> /* For ARPHRD_ETHER */
#include <linux/ip.h>
#include <linux/tcp.h>
#include <linux/percpu.h>
#include <net/net_namespace.h>
#include <linux/u64_stats_sync.h>
/*
* The higher levels take care of making this non-reentrant (it's
* called with bh's disabled).
*/
netdev_tx_t loopback_xmit(struct sk_buff *skb,
struct net_device *dev)
{
//struct pcpu_lstats *lb_stats;
int len;
skb_orphan(skb);
/* Before queueing this packet to netif_rx(),
* make sure dst is refcounted.
*/
skb_dst_force(skb);
skb->protocol = eth_type_trans(skb, dev);
len = skb->len;
if (likely(netif_rx(skb) == NET_RX_SUCCESS)) { }
printk("Received packet at device driver n");
return NETDEV_TX_OK;
}
u32 always_on(struct net_device *dev)
{
return 1;
}
const struct ethtool_ops loopback_ethtool_ops = {
.get_link = always_on,
};
int loopback_dev_init(struct net_device *dev)
{
return 0;
}
void loopback_dev_free(struct net_device *dev)
{
free_netdev(dev);
}
const struct net_device_ops loopback_ops = {
.ndo_init = loopback_dev_init,
.ndo_start_xmit= loopback_xmit,
.ndo_set_mac_address = eth_mac_addr,
};
/*
* The loopback device is special. There is only one instance
* per network namespace.
*/
void loopback_setup(struct net_device *dev)
{
dev->mtu = 64 * 1024;
dev->hard_header_len = ETH_HLEN; /* 14 */
dev->addr_len = ETH_ALEN; /* 6 */
dev->type = ARPHRD_LOOPBACK; /* 0x0001*/
dev->flags = IFF_LOOPBACK;
dev->priv_flags |= IFF_LIVE_ADDR_CHANGE | IFF_NO_QUEUE;
netif_keep_dst(dev);
dev->hw_features = NETIF_F_GSO_SOFTWARE;
dev->features = NETIF_F_SG | NETIF_F_FRAGLIST
| NETIF_F_GSO_SOFTWARE
| NETIF_F_HW_CSUM
| NETIF_F_RXCSUM
| NETIF_F_SCTP_CRC
| NETIF_F_HIGHDMA
| NETIF_F_LLTX
| NETIF_F_NETNS_LOCAL
| NETIF_F_VLAN_CHALLENGED
| NETIF_F_LOOPBACK;
dev->ethtool_ops = &loopback_ethtool_ops;
dev->netdev_ops = &loopback_ops;
dev->destructor = loopback_dev_free;
}
struct net_device *global_dev;
/* Setup and register the loopback device. */
int init_dev (void)
{
struct net_device *dev;
int err;
printk ("Init Modulen");
err = -ENOMEM;
dev = alloc_netdev(0, "testlo", NET_NAME_UNKNOWN, loopback_setup);
if (!dev)
goto out;
err = register_netdev(dev);
if (err)
goto out_free_netdev;
BUG_ON(dev->ifindex != LOOPBACK_IFINDEX);
global_dev = dev;
return 0;
out_free_netdev:
free_netdev(dev);
out:
return err;
}
void cleanup (void)
{
printk ("Cleaning Up Modulen");
unregister_netdev (global_dev);
return;
}
module_init (init_dev);
module_exit (cleanup);
Makefile:
obj-m += testlo.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
Once I compile the code and insert the kernel module, I can see my new device (testlo) in the list from ip a
. I can set the device state to up and assign it an IP address. However, the code's function loopback_xmit()
doesn't get triggered if I try to ping that IP (I do see ping responses). If I check in wireshark, there is no trace if I ping the new device's IP. In the default loopback device (lo), pinging 127.0.0.1
shows a trace in wireshark.
Can someone tell what is missing in the code to make it behave like a loopback device ?
networking kernel-modules loopback
networking kernel-modules loopback
asked 38 mins ago
JakeJake
5798 silver badges22 bronze badges
5798 silver badges22 bronze badges
add a comment |
add a comment |
0
active
oldest
votes
Your Answer
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "106"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f526324%2fnew-loopback-device-module-does-not-show-trace-in-wireshark%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
0
active
oldest
votes
0
active
oldest
votes
active
oldest
votes
active
oldest
votes
Thanks for contributing an answer to Unix & Linux Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f526324%2fnew-loopback-device-module-does-not-show-trace-in-wireshark%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown