aboutsummaryrefslogtreecommitdiffstats
path: root/arch/um/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'arch/um/drivers')
-rw-r--r--arch/um/drivers/net_kern.c15
-rw-r--r--arch/um/drivers/pcap_kern.c25
-rw-r--r--arch/um/drivers/pcap_user.c23
3 files changed, 38 insertions, 25 deletions
diff --git a/arch/um/drivers/net_kern.c b/arch/um/drivers/net_kern.c
index baac4ad5e68e..72773dd54425 100644
--- a/arch/um/drivers/net_kern.c
+++ b/arch/um/drivers/net_kern.c
@@ -316,12 +316,14 @@ static void setup_etheraddr(char *str, unsigned char *addr, char *name)
316 } 316 }
317 if (!is_local_ether_addr(addr)) { 317 if (!is_local_ether_addr(addr)) {
318 printk(KERN_WARNING 318 printk(KERN_WARNING
319 "Warning: attempt to assign a globally valid ethernet address to a " 319 "Warning: attempt to assign a globally valid ethernet "
320 "device\n"); 320 "address to a device\n");
321 printk(KERN_WARNING "You should better enable the 2nd rightmost bit " 321 printk(KERN_WARNING "You should better enable the 2nd "
322 "in the first byte of the MAC, i.e. " 322 "rightmost bit in the first byte of the MAC,\n");
323 "%02x:%02x:%02x:%02x:%02x:%02x\n", 323 printk(KERN_WARNING "i.e. %02x:%02x:%02x:%02x:%02x:%02x\n",
324 addr[0] | 0x02, addr[1], addr[2], addr[3], addr[4], addr[5]); 324 addr[0] | 0x02, addr[1], addr[2], addr[3], addr[4],
325 addr[5]);
326 goto random;
325 } 327 }
326 return; 328 return;
327 329
@@ -478,6 +480,7 @@ out_undo_user_init:
478 (*transport->user->remove)(&lp->user); 480 (*transport->user->remove)(&lp->user);
479out_unregister: 481out_unregister:
480 platform_device_unregister(&device->pdev); 482 platform_device_unregister(&device->pdev);
483 return; /* platform_device_unregister frees dev and device */
481out_free_netdev: 484out_free_netdev:
482 free_netdev(dev); 485 free_netdev(dev);
483out_free_device: 486out_free_device:
diff --git a/arch/um/drivers/pcap_kern.c b/arch/um/drivers/pcap_kern.c
index 948849343ca4..8b27eae357ef 100644
--- a/arch/um/drivers/pcap_kern.c
+++ b/arch/um/drivers/pcap_kern.c
@@ -29,21 +29,25 @@ void pcap_init(struct net_device *dev, void *data)
29 ppri->promisc = init->promisc; 29 ppri->promisc = init->promisc;
30 ppri->optimize = init->optimize; 30 ppri->optimize = init->optimize;
31 ppri->filter = init->filter; 31 ppri->filter = init->filter;
32
33 printk("pcap backend, host interface %s\n", ppri->host_if);
32} 34}
33 35
34static int pcap_read(int fd, struct sk_buff **skb, 36static int pcap_read(int fd, struct sk_buff **skb,
35 struct uml_net_private *lp) 37 struct uml_net_private *lp)
36{ 38{
37 *skb = ether_adjust_skb(*skb, ETH_HEADER_OTHER); 39 *skb = ether_adjust_skb(*skb, ETH_HEADER_OTHER);
38 if(*skb == NULL) return(-ENOMEM); 40 if(*skb == NULL)
39 return(pcap_user_read(fd, skb_mac_header(*skb), 41 return -ENOMEM;
42
43 return pcap_user_read(fd, skb_mac_header(*skb),
40 (*skb)->dev->mtu + ETH_HEADER_OTHER, 44 (*skb)->dev->mtu + ETH_HEADER_OTHER,
41 (struct pcap_data *) &lp->user)); 45 (struct pcap_data *) &lp->user);
42} 46}
43 47
44static int pcap_write(int fd, struct sk_buff **skb, struct uml_net_private *lp) 48static int pcap_write(int fd, struct sk_buff **skb, struct uml_net_private *lp)
45{ 49{
46 return(-EPERM); 50 return -EPERM;
47} 51}
48 52
49static const struct net_kern_info pcap_kern_info = { 53static const struct net_kern_info pcap_kern_info = {
@@ -65,12 +69,12 @@ int pcap_setup(char *str, char **mac_out, void *data)
65 .optimize = 0, 69 .optimize = 0,
66 .filter = NULL }); 70 .filter = NULL });
67 71
68 remain = split_if_spec(str, &host_if, &init->filter, 72 remain = split_if_spec(str, &host_if, &init->filter,
69 &options[0], &options[1], NULL); 73 &options[0], &options[1], NULL);
70 if(remain != NULL){ 74 if(remain != NULL){
71 printk(KERN_ERR "pcap_setup - Extra garbage on " 75 printk(KERN_ERR "pcap_setup - Extra garbage on "
72 "specification : '%s'\n", remain); 76 "specification : '%s'\n", remain);
73 return(0); 77 return 0;
74 } 78 }
75 79
76 if(host_if != NULL) 80 if(host_if != NULL)
@@ -87,10 +91,13 @@ int pcap_setup(char *str, char **mac_out, void *data)
87 init->optimize = 1; 91 init->optimize = 1;
88 else if(!strcmp(options[i], "nooptimize")) 92 else if(!strcmp(options[i], "nooptimize"))
89 init->optimize = 0; 93 init->optimize = 0;
90 else printk("pcap_setup : bad option - '%s'\n", options[i]); 94 else {
95 printk("pcap_setup : bad option - '%s'\n", options[i]);
96 return 0;
97 }
91 } 98 }
92 99
93 return(1); 100 return 1;
94} 101}
95 102
96static struct transport pcap_transport = { 103static struct transport pcap_transport = {
diff --git a/arch/um/drivers/pcap_user.c b/arch/um/drivers/pcap_user.c
index dc0a903ef9a6..483aa15222a4 100644
--- a/arch/um/drivers/pcap_user.c
+++ b/arch/um/drivers/pcap_user.c
@@ -13,6 +13,7 @@
13#include "pcap_user.h" 13#include "pcap_user.h"
14#include "user.h" 14#include "user.h"
15#include "um_malloc.h" 15#include "um_malloc.h"
16#include "kern_constants.h"
16 17
17#define MAX_PACKET (ETH_MAX_PACKET + ETH_HEADER_OTHER) 18#define MAX_PACKET (ETH_MAX_PACKET + ETH_HEADER_OTHER)
18 19
@@ -26,8 +27,8 @@ static int pcap_user_init(void *data, void *dev)
26 27
27 p = pcap_open_live(pri->host_if, MAX_PACKET, pri->promisc, 0, errors); 28 p = pcap_open_live(pri->host_if, MAX_PACKET, pri->promisc, 0, errors);
28 if(p == NULL){ 29 if(p == NULL){
29 printk("pcap_user_init : pcap_open_live failed - '%s'\n", 30 printk(UM_KERN_ERR "pcap_user_init : pcap_open_live failed - "
30 errors); 31 "'%s'\n", errors);
31 return -EINVAL; 32 return -EINVAL;
32 } 33 }
33 34
@@ -48,13 +49,13 @@ static int pcap_open(void *data)
48 if(pri->filter != NULL){ 49 if(pri->filter != NULL){
49 err = dev_netmask(pri->dev, &netmask); 50 err = dev_netmask(pri->dev, &netmask);
50 if(err < 0){ 51 if(err < 0){
51 printk("pcap_open : dev_netmask failed\n"); 52 printk(UM_KERN_ERR "pcap_open : dev_netmask failed\n");
52 return -EIO; 53 return -EIO;
53 } 54 }
54 55
55 pri->compiled = um_kmalloc(sizeof(struct bpf_program)); 56 pri->compiled = um_kmalloc(sizeof(struct bpf_program));
56 if(pri->compiled == NULL){ 57 if(pri->compiled == NULL){
57 printk("pcap_open : kmalloc failed\n"); 58 printk(UM_KERN_ERR "pcap_open : kmalloc failed\n");
58 return -ENOMEM; 59 return -ENOMEM;
59 } 60 }
60 61
@@ -62,15 +63,15 @@ static int pcap_open(void *data)
62 (struct bpf_program *) pri->compiled, 63 (struct bpf_program *) pri->compiled,
63 pri->filter, pri->optimize, netmask); 64 pri->filter, pri->optimize, netmask);
64 if(err < 0){ 65 if(err < 0){
65 printk("pcap_open : pcap_compile failed - '%s'\n", 66 printk(UM_KERN_ERR "pcap_open : pcap_compile failed - "
66 pcap_geterr(pri->pcap)); 67 "'%s'\n", pcap_geterr(pri->pcap));
67 return -EIO; 68 return -EIO;
68 } 69 }
69 70
70 err = pcap_setfilter(pri->pcap, pri->compiled); 71 err = pcap_setfilter(pri->pcap, pri->compiled);
71 if(err < 0){ 72 if(err < 0){
72 printk("pcap_open : pcap_setfilter failed - '%s'\n", 73 printk(UM_KERN_ERR "pcap_open : pcap_setfilter "
73 pcap_geterr(pri->pcap)); 74 "failed - '%s'\n", pcap_geterr(pri->pcap));
74 return -EIO; 75 return -EIO;
75 } 76 }
76 } 77 }
@@ -85,7 +86,8 @@ static void pcap_remove(void *data)
85 if(pri->compiled != NULL) 86 if(pri->compiled != NULL)
86 pcap_freecode(pri->compiled); 87 pcap_freecode(pri->compiled);
87 88
88 pcap_close(pri->pcap); 89 if(pri->pcap != NULL)
90 pcap_close(pri->pcap);
89} 91}
90 92
91struct pcap_handler_data { 93struct pcap_handler_data {
@@ -114,7 +116,8 @@ int pcap_user_read(int fd, void *buffer, int len, struct pcap_data *pri)
114 116
115 n = pcap_dispatch(pri->pcap, 1, handler, (u_char *) &hdata); 117 n = pcap_dispatch(pri->pcap, 1, handler, (u_char *) &hdata);
116 if(n < 0){ 118 if(n < 0){
117 printk("pcap_dispatch failed - %s\n", pcap_geterr(pri->pcap)); 119 printk(UM_KERN_ERR "pcap_dispatch failed - %s\n",
120 pcap_geterr(pri->pcap));
118 return -EIO; 121 return -EIO;
119 } 122 }
120 else if(n == 0) 123 else if(n == 0)