Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
Conflicts: drivers/net/wireless/orinoco/orinoco.c
This commit is contained in:
@@ -1451,6 +1451,14 @@ static const struct usb_device_id products [] = {
|
|||||||
// Cables-to-Go USB Ethernet Adapter
|
// Cables-to-Go USB Ethernet Adapter
|
||||||
USB_DEVICE(0x0b95, 0x772a),
|
USB_DEVICE(0x0b95, 0x772a),
|
||||||
.driver_info = (unsigned long) &ax88772_info,
|
.driver_info = (unsigned long) &ax88772_info,
|
||||||
|
}, {
|
||||||
|
// ABOCOM for pci
|
||||||
|
USB_DEVICE(0x14ea, 0xab11),
|
||||||
|
.driver_info = (unsigned long) &ax88178_info,
|
||||||
|
}, {
|
||||||
|
// ASIX 88772a
|
||||||
|
USB_DEVICE(0x0db0, 0xa877),
|
||||||
|
.driver_info = (unsigned long) &ax88772_info,
|
||||||
},
|
},
|
||||||
{ }, // END
|
{ }, // END
|
||||||
};
|
};
|
||||||
|
@@ -1558,6 +1558,7 @@ bad2:
|
|||||||
bad:
|
bad:
|
||||||
if (ah)
|
if (ah)
|
||||||
ath9k_hw_detach(ah);
|
ath9k_hw_detach(ah);
|
||||||
|
ath9k_exit_debug(sc);
|
||||||
|
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
@@ -1565,7 +1566,7 @@ bad:
|
|||||||
int ath_attach(u16 devid, struct ath_softc *sc)
|
int ath_attach(u16 devid, struct ath_softc *sc)
|
||||||
{
|
{
|
||||||
struct ieee80211_hw *hw = sc->hw;
|
struct ieee80211_hw *hw = sc->hw;
|
||||||
int error = 0;
|
int error = 0, i;
|
||||||
|
|
||||||
DPRINTF(sc, ATH_DBG_CONFIG, "Attach ATH hw\n");
|
DPRINTF(sc, ATH_DBG_CONFIG, "Attach ATH hw\n");
|
||||||
|
|
||||||
@@ -1617,11 +1618,11 @@ int ath_attach(u16 devid, struct ath_softc *sc)
|
|||||||
/* initialize tx/rx engine */
|
/* initialize tx/rx engine */
|
||||||
error = ath_tx_init(sc, ATH_TXBUF);
|
error = ath_tx_init(sc, ATH_TXBUF);
|
||||||
if (error != 0)
|
if (error != 0)
|
||||||
goto detach;
|
goto error_attach;
|
||||||
|
|
||||||
error = ath_rx_init(sc, ATH_RXBUF);
|
error = ath_rx_init(sc, ATH_RXBUF);
|
||||||
if (error != 0)
|
if (error != 0)
|
||||||
goto detach;
|
goto error_attach;
|
||||||
|
|
||||||
#if defined(CONFIG_RFKILL) || defined(CONFIG_RFKILL_MODULE)
|
#if defined(CONFIG_RFKILL) || defined(CONFIG_RFKILL_MODULE)
|
||||||
/* Initialze h/w Rfkill */
|
/* Initialze h/w Rfkill */
|
||||||
@@ -1629,8 +1630,9 @@ int ath_attach(u16 devid, struct ath_softc *sc)
|
|||||||
INIT_DELAYED_WORK(&sc->rf_kill.rfkill_poll, ath_rfkill_poll);
|
INIT_DELAYED_WORK(&sc->rf_kill.rfkill_poll, ath_rfkill_poll);
|
||||||
|
|
||||||
/* Initialize s/w rfkill */
|
/* Initialize s/w rfkill */
|
||||||
if (ath_init_sw_rfkill(sc))
|
error = ath_init_sw_rfkill(sc);
|
||||||
goto detach;
|
if (error)
|
||||||
|
goto error_attach;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (ath9k_is_world_regd(sc->sc_ah)) {
|
if (ath9k_is_world_regd(sc->sc_ah)) {
|
||||||
@@ -1664,8 +1666,16 @@ int ath_attach(u16 devid, struct ath_softc *sc)
|
|||||||
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
detach:
|
|
||||||
ath_detach(sc);
|
error_attach:
|
||||||
|
/* cleanup tx queues */
|
||||||
|
for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++)
|
||||||
|
if (ATH_TXQ_SETUP(sc, i))
|
||||||
|
ath_tx_cleanupq(sc, &sc->tx.txq[i]);
|
||||||
|
|
||||||
|
ath9k_hw_detach(sc->sc_ah);
|
||||||
|
ath9k_exit_debug(sc);
|
||||||
|
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -2076,8 +2076,20 @@ static int orinoco_pm_notifier(struct notifier_block *notifier,
|
|||||||
|
|
||||||
return NOTIFY_DONE;
|
return NOTIFY_DONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void orinoco_register_pm_notifier(struct orinoco_private *priv)
|
||||||
|
{
|
||||||
|
priv->pm_notifier.notifier_call = orinoco_pm_notifier;
|
||||||
|
register_pm_notifier(&priv->pm_notifier);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void orinoco_unregister_pm_notifier(struct orinoco_private *priv)
|
||||||
|
{
|
||||||
|
unregister_pm_notifier(&priv->pm_notifier);
|
||||||
|
}
|
||||||
#else /* !PM_SLEEP || HERMES_CACHE_FW_ON_INIT */
|
#else /* !PM_SLEEP || HERMES_CACHE_FW_ON_INIT */
|
||||||
#define orinoco_pm_notifier NULL
|
#define orinoco_register_pm_notifier(priv) do { } while(0)
|
||||||
|
#define orinoco_unregister_pm_notifier(priv) do { } while(0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/********************************************************************/
|
/********************************************************************/
|
||||||
@@ -2572,8 +2584,7 @@ struct net_device
|
|||||||
priv->cached_fw = NULL;
|
priv->cached_fw = NULL;
|
||||||
|
|
||||||
/* Register PM notifiers */
|
/* Register PM notifiers */
|
||||||
priv->pm_notifier.notifier_call = orinoco_pm_notifier;
|
orinoco_register_pm_notifier(priv);
|
||||||
register_pm_notifier(&priv->pm_notifier);
|
|
||||||
|
|
||||||
return dev;
|
return dev;
|
||||||
}
|
}
|
||||||
@@ -2598,7 +2609,7 @@ void free_orinocodev(struct net_device *dev)
|
|||||||
kfree(rx_data);
|
kfree(rx_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
unregister_pm_notifier(&priv->pm_notifier);
|
orinoco_unregister_pm_notifier(priv);
|
||||||
orinoco_uncache_fw(priv);
|
orinoco_uncache_fw(priv);
|
||||||
|
|
||||||
priv->wpa_ie_len = 0;
|
priv->wpa_ie_len = 0;
|
||||||
|
@@ -48,6 +48,10 @@ static struct usb_device_id rtl8187_table[] __devinitdata = {
|
|||||||
{USB_DEVICE(0x0bda, 0x8189), .driver_info = DEVICE_RTL8187B},
|
{USB_DEVICE(0x0bda, 0x8189), .driver_info = DEVICE_RTL8187B},
|
||||||
{USB_DEVICE(0x0bda, 0x8197), .driver_info = DEVICE_RTL8187B},
|
{USB_DEVICE(0x0bda, 0x8197), .driver_info = DEVICE_RTL8187B},
|
||||||
{USB_DEVICE(0x0bda, 0x8198), .driver_info = DEVICE_RTL8187B},
|
{USB_DEVICE(0x0bda, 0x8198), .driver_info = DEVICE_RTL8187B},
|
||||||
|
/* Surecom */
|
||||||
|
{USB_DEVICE(0x0769, 0x11F2), .driver_info = DEVICE_RTL8187},
|
||||||
|
/* Logitech */
|
||||||
|
{USB_DEVICE(0x0789, 0x010C), .driver_info = DEVICE_RTL8187},
|
||||||
/* Netgear */
|
/* Netgear */
|
||||||
{USB_DEVICE(0x0846, 0x6100), .driver_info = DEVICE_RTL8187},
|
{USB_DEVICE(0x0846, 0x6100), .driver_info = DEVICE_RTL8187},
|
||||||
{USB_DEVICE(0x0846, 0x6a00), .driver_info = DEVICE_RTL8187},
|
{USB_DEVICE(0x0846, 0x6a00), .driver_info = DEVICE_RTL8187},
|
||||||
@@ -57,8 +61,16 @@ static struct usb_device_id rtl8187_table[] __devinitdata = {
|
|||||||
/* Sitecom */
|
/* Sitecom */
|
||||||
{USB_DEVICE(0x0df6, 0x000d), .driver_info = DEVICE_RTL8187},
|
{USB_DEVICE(0x0df6, 0x000d), .driver_info = DEVICE_RTL8187},
|
||||||
{USB_DEVICE(0x0df6, 0x0028), .driver_info = DEVICE_RTL8187B},
|
{USB_DEVICE(0x0df6, 0x0028), .driver_info = DEVICE_RTL8187B},
|
||||||
|
/* Sphairon Access Systems GmbH */
|
||||||
|
{USB_DEVICE(0x114B, 0x0150), .driver_info = DEVICE_RTL8187},
|
||||||
|
/* Dick Smith Electronics */
|
||||||
|
{USB_DEVICE(0x1371, 0x9401), .driver_info = DEVICE_RTL8187},
|
||||||
/* Abocom */
|
/* Abocom */
|
||||||
{USB_DEVICE(0x13d1, 0xabe6), .driver_info = DEVICE_RTL8187},
|
{USB_DEVICE(0x13d1, 0xabe6), .driver_info = DEVICE_RTL8187},
|
||||||
|
/* Qcom */
|
||||||
|
{USB_DEVICE(0x18E8, 0x6232), .driver_info = DEVICE_RTL8187},
|
||||||
|
/* AirLive */
|
||||||
|
{USB_DEVICE(0x1b75, 0x8187), .driver_info = DEVICE_RTL8187},
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
#define _XT_NFLOG_TARGET
|
#define _XT_NFLOG_TARGET
|
||||||
|
|
||||||
#define XT_NFLOG_DEFAULT_GROUP 0x1
|
#define XT_NFLOG_DEFAULT_GROUP 0x1
|
||||||
#define XT_NFLOG_DEFAULT_THRESHOLD 1
|
#define XT_NFLOG_DEFAULT_THRESHOLD 0
|
||||||
|
|
||||||
#define XT_NFLOG_MASK 0x0
|
#define XT_NFLOG_MASK 0x0
|
||||||
|
|
||||||
|
@@ -59,7 +59,7 @@ static inline int nf_conntrack_confirm(struct sk_buff *skb)
|
|||||||
struct nf_conn *ct = (struct nf_conn *)skb->nfct;
|
struct nf_conn *ct = (struct nf_conn *)skb->nfct;
|
||||||
int ret = NF_ACCEPT;
|
int ret = NF_ACCEPT;
|
||||||
|
|
||||||
if (ct) {
|
if (ct && ct != &nf_conntrack_untracked) {
|
||||||
if (!nf_ct_is_confirmed(ct) && !nf_ct_is_dying(ct))
|
if (!nf_ct_is_confirmed(ct) && !nf_ct_is_dying(ct))
|
||||||
ret = __nf_conntrack_confirm(skb);
|
ret = __nf_conntrack_confirm(skb);
|
||||||
nf_ct_deliver_cached_events(ct);
|
nf_ct_deliver_cached_events(ct);
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
/* Tom Kelly's Scalable TCP
|
/* Tom Kelly's Scalable TCP
|
||||||
*
|
*
|
||||||
* See htt://www-lce.eng.cam.ac.uk/~ctk21/scalable/
|
* See http://www.deneholme.net/tom/scalable/
|
||||||
*
|
*
|
||||||
* John Heffner <jheffner@sc.edu>
|
* John Heffner <jheffner@sc.edu>
|
||||||
*/
|
*/
|
||||||
|
@@ -201,8 +201,9 @@ icmpv6_error(struct net *net, struct sk_buff *skb, unsigned int dataoff,
|
|||||||
|
|
||||||
if (net->ct.sysctl_checksum && hooknum == NF_INET_PRE_ROUTING &&
|
if (net->ct.sysctl_checksum && hooknum == NF_INET_PRE_ROUTING &&
|
||||||
nf_ip6_checksum(skb, hooknum, dataoff, IPPROTO_ICMPV6)) {
|
nf_ip6_checksum(skb, hooknum, dataoff, IPPROTO_ICMPV6)) {
|
||||||
nf_log_packet(PF_INET6, 0, skb, NULL, NULL, NULL,
|
if (LOG_INVALID(net, IPPROTO_ICMPV6))
|
||||||
"nf_ct_icmpv6: ICMPv6 checksum failed\n");
|
nf_log_packet(PF_INET6, 0, skb, NULL, NULL, NULL,
|
||||||
|
"nf_ct_icmpv6: ICMPv6 checksum failed ");
|
||||||
return -NF_ACCEPT;
|
return -NF_ACCEPT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -39,7 +39,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define NFULNL_NLBUFSIZ_DEFAULT NLMSG_GOODSIZE
|
#define NFULNL_NLBUFSIZ_DEFAULT NLMSG_GOODSIZE
|
||||||
#define NFULNL_TIMEOUT_DEFAULT HZ /* every second */
|
#define NFULNL_TIMEOUT_DEFAULT 100 /* every second */
|
||||||
#define NFULNL_QTHRESH_DEFAULT 100 /* 100 packets */
|
#define NFULNL_QTHRESH_DEFAULT 100 /* 100 packets */
|
||||||
#define NFULNL_COPY_RANGE_MAX 0xFFFF /* max packet size is limited by 16-bit struct nfattr nfa_len field */
|
#define NFULNL_COPY_RANGE_MAX 0xFFFF /* max packet size is limited by 16-bit struct nfattr nfa_len field */
|
||||||
|
|
||||||
@@ -590,8 +590,10 @@ nfulnl_log_packet(u_int8_t pf,
|
|||||||
|
|
||||||
qthreshold = inst->qthreshold;
|
qthreshold = inst->qthreshold;
|
||||||
/* per-rule qthreshold overrides per-instance */
|
/* per-rule qthreshold overrides per-instance */
|
||||||
if (qthreshold > li->u.ulog.qthreshold)
|
if (li->u.ulog.qthreshold)
|
||||||
qthreshold = li->u.ulog.qthreshold;
|
if (qthreshold > li->u.ulog.qthreshold)
|
||||||
|
qthreshold = li->u.ulog.qthreshold;
|
||||||
|
|
||||||
|
|
||||||
switch (inst->copy_mode) {
|
switch (inst->copy_mode) {
|
||||||
case NFULNL_COPY_META:
|
case NFULNL_COPY_META:
|
||||||
|
@@ -827,59 +827,143 @@ static const struct file_operations xt_table_ops = {
|
|||||||
.release = seq_release_net,
|
.release = seq_release_net,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Traverse state for ip{,6}_{tables,matches} for helping crossing
|
||||||
|
* the multi-AF mutexes.
|
||||||
|
*/
|
||||||
|
struct nf_mttg_trav {
|
||||||
|
struct list_head *head, *curr;
|
||||||
|
uint8_t class, nfproto;
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
MTTG_TRAV_INIT,
|
||||||
|
MTTG_TRAV_NFP_UNSPEC,
|
||||||
|
MTTG_TRAV_NFP_SPEC,
|
||||||
|
MTTG_TRAV_DONE,
|
||||||
|
};
|
||||||
|
|
||||||
|
static void *xt_mttg_seq_next(struct seq_file *seq, void *v, loff_t *ppos,
|
||||||
|
bool is_target)
|
||||||
|
{
|
||||||
|
static const uint8_t next_class[] = {
|
||||||
|
[MTTG_TRAV_NFP_UNSPEC] = MTTG_TRAV_NFP_SPEC,
|
||||||
|
[MTTG_TRAV_NFP_SPEC] = MTTG_TRAV_DONE,
|
||||||
|
};
|
||||||
|
struct nf_mttg_trav *trav = seq->private;
|
||||||
|
|
||||||
|
switch (trav->class) {
|
||||||
|
case MTTG_TRAV_INIT:
|
||||||
|
trav->class = MTTG_TRAV_NFP_UNSPEC;
|
||||||
|
mutex_lock(&xt[NFPROTO_UNSPEC].mutex);
|
||||||
|
trav->head = trav->curr = is_target ?
|
||||||
|
&xt[NFPROTO_UNSPEC].target : &xt[NFPROTO_UNSPEC].match;
|
||||||
|
break;
|
||||||
|
case MTTG_TRAV_NFP_UNSPEC:
|
||||||
|
trav->curr = trav->curr->next;
|
||||||
|
if (trav->curr != trav->head)
|
||||||
|
break;
|
||||||
|
mutex_unlock(&xt[NFPROTO_UNSPEC].mutex);
|
||||||
|
mutex_lock(&xt[trav->nfproto].mutex);
|
||||||
|
trav->head = trav->curr = is_target ?
|
||||||
|
&xt[trav->nfproto].target : &xt[trav->nfproto].match;
|
||||||
|
trav->class = next_class[trav->class];
|
||||||
|
break;
|
||||||
|
case MTTG_TRAV_NFP_SPEC:
|
||||||
|
trav->curr = trav->curr->next;
|
||||||
|
if (trav->curr != trav->head)
|
||||||
|
break;
|
||||||
|
/* fallthru, _stop will unlock */
|
||||||
|
default:
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ppos != NULL)
|
||||||
|
++*ppos;
|
||||||
|
return trav;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void *xt_mttg_seq_start(struct seq_file *seq, loff_t *pos,
|
||||||
|
bool is_target)
|
||||||
|
{
|
||||||
|
struct nf_mttg_trav *trav = seq->private;
|
||||||
|
unsigned int j;
|
||||||
|
|
||||||
|
trav->class = MTTG_TRAV_INIT;
|
||||||
|
for (j = 0; j < *pos; ++j)
|
||||||
|
if (xt_mttg_seq_next(seq, NULL, NULL, is_target) == NULL)
|
||||||
|
return NULL;
|
||||||
|
return trav;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void xt_mttg_seq_stop(struct seq_file *seq, void *v)
|
||||||
|
{
|
||||||
|
struct nf_mttg_trav *trav = seq->private;
|
||||||
|
|
||||||
|
switch (trav->class) {
|
||||||
|
case MTTG_TRAV_NFP_UNSPEC:
|
||||||
|
mutex_unlock(&xt[NFPROTO_UNSPEC].mutex);
|
||||||
|
break;
|
||||||
|
case MTTG_TRAV_NFP_SPEC:
|
||||||
|
mutex_unlock(&xt[trav->nfproto].mutex);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void *xt_match_seq_start(struct seq_file *seq, loff_t *pos)
|
static void *xt_match_seq_start(struct seq_file *seq, loff_t *pos)
|
||||||
{
|
{
|
||||||
struct proc_dir_entry *pde = (struct proc_dir_entry *)seq->private;
|
return xt_mttg_seq_start(seq, pos, false);
|
||||||
u_int16_t af = (unsigned long)pde->data;
|
|
||||||
|
|
||||||
mutex_lock(&xt[af].mutex);
|
|
||||||
return seq_list_start(&xt[af].match, *pos);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *xt_match_seq_next(struct seq_file *seq, void *v, loff_t *pos)
|
static void *xt_match_seq_next(struct seq_file *seq, void *v, loff_t *ppos)
|
||||||
{
|
{
|
||||||
struct proc_dir_entry *pde = (struct proc_dir_entry *)seq->private;
|
return xt_mttg_seq_next(seq, v, ppos, false);
|
||||||
u_int16_t af = (unsigned long)pde->data;
|
|
||||||
|
|
||||||
return seq_list_next(v, &xt[af].match, pos);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void xt_match_seq_stop(struct seq_file *seq, void *v)
|
|
||||||
{
|
|
||||||
struct proc_dir_entry *pde = seq->private;
|
|
||||||
u_int16_t af = (unsigned long)pde->data;
|
|
||||||
|
|
||||||
mutex_unlock(&xt[af].mutex);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int xt_match_seq_show(struct seq_file *seq, void *v)
|
static int xt_match_seq_show(struct seq_file *seq, void *v)
|
||||||
{
|
{
|
||||||
struct xt_match *match = list_entry(v, struct xt_match, list);
|
const struct nf_mttg_trav *trav = seq->private;
|
||||||
|
const struct xt_match *match;
|
||||||
|
|
||||||
if (strlen(match->name))
|
switch (trav->class) {
|
||||||
return seq_printf(seq, "%s\n", match->name);
|
case MTTG_TRAV_NFP_UNSPEC:
|
||||||
else
|
case MTTG_TRAV_NFP_SPEC:
|
||||||
return 0;
|
if (trav->curr == trav->head)
|
||||||
|
return 0;
|
||||||
|
match = list_entry(trav->curr, struct xt_match, list);
|
||||||
|
return (*match->name == '\0') ? 0 :
|
||||||
|
seq_printf(seq, "%s\n", match->name);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct seq_operations xt_match_seq_ops = {
|
static const struct seq_operations xt_match_seq_ops = {
|
||||||
.start = xt_match_seq_start,
|
.start = xt_match_seq_start,
|
||||||
.next = xt_match_seq_next,
|
.next = xt_match_seq_next,
|
||||||
.stop = xt_match_seq_stop,
|
.stop = xt_mttg_seq_stop,
|
||||||
.show = xt_match_seq_show,
|
.show = xt_match_seq_show,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int xt_match_open(struct inode *inode, struct file *file)
|
static int xt_match_open(struct inode *inode, struct file *file)
|
||||||
{
|
{
|
||||||
|
struct seq_file *seq;
|
||||||
|
struct nf_mttg_trav *trav;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = seq_open(file, &xt_match_seq_ops);
|
trav = kmalloc(sizeof(*trav), GFP_KERNEL);
|
||||||
if (!ret) {
|
if (trav == NULL)
|
||||||
struct seq_file *seq = file->private_data;
|
return -ENOMEM;
|
||||||
|
|
||||||
seq->private = PDE(inode);
|
ret = seq_open(file, &xt_match_seq_ops);
|
||||||
|
if (ret < 0) {
|
||||||
|
kfree(trav);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
return ret;
|
|
||||||
|
seq = file->private_data;
|
||||||
|
seq->private = trav;
|
||||||
|
trav->nfproto = (unsigned long)PDE(inode)->data;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct file_operations xt_match_ops = {
|
static const struct file_operations xt_match_ops = {
|
||||||
@@ -887,62 +971,63 @@ static const struct file_operations xt_match_ops = {
|
|||||||
.open = xt_match_open,
|
.open = xt_match_open,
|
||||||
.read = seq_read,
|
.read = seq_read,
|
||||||
.llseek = seq_lseek,
|
.llseek = seq_lseek,
|
||||||
.release = seq_release,
|
.release = seq_release_private,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void *xt_target_seq_start(struct seq_file *seq, loff_t *pos)
|
static void *xt_target_seq_start(struct seq_file *seq, loff_t *pos)
|
||||||
{
|
{
|
||||||
struct proc_dir_entry *pde = (struct proc_dir_entry *)seq->private;
|
return xt_mttg_seq_start(seq, pos, true);
|
||||||
u_int16_t af = (unsigned long)pde->data;
|
|
||||||
|
|
||||||
mutex_lock(&xt[af].mutex);
|
|
||||||
return seq_list_start(&xt[af].target, *pos);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *xt_target_seq_next(struct seq_file *seq, void *v, loff_t *pos)
|
static void *xt_target_seq_next(struct seq_file *seq, void *v, loff_t *ppos)
|
||||||
{
|
{
|
||||||
struct proc_dir_entry *pde = (struct proc_dir_entry *)seq->private;
|
return xt_mttg_seq_next(seq, v, ppos, true);
|
||||||
u_int16_t af = (unsigned long)pde->data;
|
|
||||||
|
|
||||||
return seq_list_next(v, &xt[af].target, pos);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void xt_target_seq_stop(struct seq_file *seq, void *v)
|
|
||||||
{
|
|
||||||
struct proc_dir_entry *pde = seq->private;
|
|
||||||
u_int16_t af = (unsigned long)pde->data;
|
|
||||||
|
|
||||||
mutex_unlock(&xt[af].mutex);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int xt_target_seq_show(struct seq_file *seq, void *v)
|
static int xt_target_seq_show(struct seq_file *seq, void *v)
|
||||||
{
|
{
|
||||||
struct xt_target *target = list_entry(v, struct xt_target, list);
|
const struct nf_mttg_trav *trav = seq->private;
|
||||||
|
const struct xt_target *target;
|
||||||
|
|
||||||
if (strlen(target->name))
|
switch (trav->class) {
|
||||||
return seq_printf(seq, "%s\n", target->name);
|
case MTTG_TRAV_NFP_UNSPEC:
|
||||||
else
|
case MTTG_TRAV_NFP_SPEC:
|
||||||
return 0;
|
if (trav->curr == trav->head)
|
||||||
|
return 0;
|
||||||
|
target = list_entry(trav->curr, struct xt_target, list);
|
||||||
|
return (*target->name == '\0') ? 0 :
|
||||||
|
seq_printf(seq, "%s\n", target->name);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct seq_operations xt_target_seq_ops = {
|
static const struct seq_operations xt_target_seq_ops = {
|
||||||
.start = xt_target_seq_start,
|
.start = xt_target_seq_start,
|
||||||
.next = xt_target_seq_next,
|
.next = xt_target_seq_next,
|
||||||
.stop = xt_target_seq_stop,
|
.stop = xt_mttg_seq_stop,
|
||||||
.show = xt_target_seq_show,
|
.show = xt_target_seq_show,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int xt_target_open(struct inode *inode, struct file *file)
|
static int xt_target_open(struct inode *inode, struct file *file)
|
||||||
{
|
{
|
||||||
|
struct seq_file *seq;
|
||||||
|
struct nf_mttg_trav *trav;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = seq_open(file, &xt_target_seq_ops);
|
trav = kmalloc(sizeof(*trav), GFP_KERNEL);
|
||||||
if (!ret) {
|
if (trav == NULL)
|
||||||
struct seq_file *seq = file->private_data;
|
return -ENOMEM;
|
||||||
|
|
||||||
seq->private = PDE(inode);
|
ret = seq_open(file, &xt_target_seq_ops);
|
||||||
|
if (ret < 0) {
|
||||||
|
kfree(trav);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
return ret;
|
|
||||||
|
seq = file->private_data;
|
||||||
|
seq->private = trav;
|
||||||
|
trav->nfproto = (unsigned long)PDE(inode)->data;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct file_operations xt_target_ops = {
|
static const struct file_operations xt_target_ops = {
|
||||||
@@ -950,7 +1035,7 @@ static const struct file_operations xt_target_ops = {
|
|||||||
.open = xt_target_open,
|
.open = xt_target_open,
|
||||||
.read = seq_read,
|
.read = seq_read,
|
||||||
.llseek = seq_lseek,
|
.llseek = seq_lseek,
|
||||||
.release = seq_release,
|
.release = seq_release_private,
|
||||||
};
|
};
|
||||||
|
|
||||||
#define FORMAT_TABLES "_tables_names"
|
#define FORMAT_TABLES "_tables_names"
|
||||||
|
@@ -542,7 +542,7 @@ recent_mt_proc_write(struct file *file, const char __user *input,
|
|||||||
struct recent_entry *e;
|
struct recent_entry *e;
|
||||||
char buf[sizeof("+b335:1d35:1e55:dead:c0de:1715:5afe:c0de")];
|
char buf[sizeof("+b335:1d35:1e55:dead:c0de:1715:5afe:c0de")];
|
||||||
const char *c = buf;
|
const char *c = buf;
|
||||||
union nf_inet_addr addr;
|
union nf_inet_addr addr = {};
|
||||||
u_int16_t family;
|
u_int16_t family;
|
||||||
bool add, succ;
|
bool add, succ;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user