2 * Copyright (C) 2002 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
3 * Licensed under the GPL.
6 #include "linux/init.h"
7 #include <linux/netdevice.h>
18 void pcap_init(struct net_device
*dev
, void *data
)
20 struct uml_net_private
*pri
;
21 struct pcap_data
*ppri
;
22 struct pcap_init
*init
= data
;
25 ppri
= (struct pcap_data
*) pri
->user
;
26 ppri
->host_if
= init
->host_if
;
27 ppri
->promisc
= init
->promisc
;
28 ppri
->optimize
= init
->optimize
;
29 ppri
->filter
= init
->filter
;
31 printk("pcap backend, host interface %s\n", ppri
->host_if
);
34 static int pcap_read(int fd
, struct sk_buff
**skb
,
35 struct uml_net_private
*lp
)
37 *skb
= ether_adjust_skb(*skb
, ETH_HEADER_OTHER
);
41 return pcap_user_read(fd
, skb_mac_header(*skb
),
42 (*skb
)->dev
->mtu
+ ETH_HEADER_OTHER
,
43 (struct pcap_data
*) &lp
->user
);
46 static int pcap_write(int fd
, struct sk_buff
**skb
, struct uml_net_private
*lp
)
51 static const struct net_kern_info pcap_kern_info
= {
53 .protocol
= eth_protocol
,
58 int pcap_setup(char *str
, char **mac_out
, void *data
)
60 struct pcap_init
*init
= data
;
61 char *remain
, *host_if
= NULL
, *options
[2] = { NULL
, NULL
};
64 *init
= ((struct pcap_init
)
70 remain
= split_if_spec(str
, &host_if
, &init
->filter
,
71 &options
[0], &options
[1], mac_out
, NULL
);
73 printk(KERN_ERR
"pcap_setup - Extra garbage on "
74 "specification : '%s'\n", remain
);
79 init
->host_if
= host_if
;
81 for (i
= 0; i
< ARRAY_SIZE(options
); i
++) {
82 if (options
[i
] == NULL
)
84 if (!strcmp(options
[i
], "promisc"))
86 else if (!strcmp(options
[i
], "nopromisc"))
88 else if (!strcmp(options
[i
], "optimize"))
90 else if (!strcmp(options
[i
], "nooptimize"))
93 printk(KERN_ERR
"pcap_setup : bad option - '%s'\n",
102 static struct transport pcap_transport
= {
103 .list
= LIST_HEAD_INIT(pcap_transport
.list
),
106 .user
= &pcap_user_info
,
107 .kern
= &pcap_kern_info
,
108 .private_size
= sizeof(struct pcap_data
),
109 .setup_size
= sizeof(struct pcap_init
),
112 static int register_pcap(void)
114 register_transport(&pcap_transport
);
118 late_initcall(register_pcap
);