Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block into for-3.18
This is to receive 0a30288da1 ("blk-mq, percpu_ref: implement a
kludge for SCSI blk-mq stall during probe") which implements
__percpu_ref_kill_expedited() to work around SCSI blk-mq stall. The
commit reverted and patches to implement proper fix will be added.
Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Kent Overstreet <kmo@daterainc.com>
Cc: Jens Axboe <axboe@kernel.dk>
Cc: Christoph Hellwig <hch@lst.de>
This commit is contained in:
@@ -410,9 +410,11 @@ static int lec_atm_send(struct atm_vcc *vcc, struct sk_buff *skb)
|
||||
priv->lane2_ops = NULL;
|
||||
if (priv->lane_version > 1)
|
||||
priv->lane2_ops = &lane2_ops;
|
||||
rtnl_lock();
|
||||
if (dev_set_mtu(dev, mesg->content.config.mtu))
|
||||
pr_info("%s: change_mtu to %d failed\n",
|
||||
dev->name, mesg->content.config.mtu);
|
||||
rtnl_unlock();
|
||||
priv->is_proxy = mesg->content.config.is_proxy;
|
||||
break;
|
||||
case l_flush_tran_id:
|
||||
|
||||
@@ -188,7 +188,7 @@ static bool batadv_frag_insert_packet(struct batadv_orig_node *orig_node,
|
||||
|
||||
/* Reached the end of the list, so insert after 'frag_entry_last'. */
|
||||
if (likely(frag_entry_last)) {
|
||||
hlist_add_behind(&frag_entry_last->list, &frag_entry_new->list);
|
||||
hlist_add_behind(&frag_entry_new->list, &frag_entry_last->list);
|
||||
chain->size += skb->len - hdr_size;
|
||||
chain->timestamp = jiffies;
|
||||
ret = true;
|
||||
|
||||
@@ -589,6 +589,14 @@ EXPORT_SYMBOL(hci_get_route);
|
||||
void hci_le_conn_failed(struct hci_conn *conn, u8 status)
|
||||
{
|
||||
struct hci_dev *hdev = conn->hdev;
|
||||
struct hci_conn_params *params;
|
||||
|
||||
params = hci_pend_le_action_lookup(&hdev->pend_le_conns, &conn->dst,
|
||||
conn->dst_type);
|
||||
if (params && params->conn) {
|
||||
hci_conn_drop(params->conn);
|
||||
params->conn = NULL;
|
||||
}
|
||||
|
||||
conn->state = BT_CLOSED;
|
||||
|
||||
|
||||
@@ -2536,8 +2536,13 @@ static void hci_pend_le_actions_clear(struct hci_dev *hdev)
|
||||
{
|
||||
struct hci_conn_params *p;
|
||||
|
||||
list_for_each_entry(p, &hdev->le_conn_params, list)
|
||||
list_for_each_entry(p, &hdev->le_conn_params, list) {
|
||||
if (p->conn) {
|
||||
hci_conn_drop(p->conn);
|
||||
p->conn = NULL;
|
||||
}
|
||||
list_del_init(&p->action);
|
||||
}
|
||||
|
||||
BT_DBG("All LE pending actions cleared");
|
||||
}
|
||||
@@ -2578,8 +2583,8 @@ static int hci_dev_do_close(struct hci_dev *hdev)
|
||||
|
||||
hci_dev_lock(hdev);
|
||||
hci_inquiry_cache_flush(hdev);
|
||||
hci_conn_hash_flush(hdev);
|
||||
hci_pend_le_actions_clear(hdev);
|
||||
hci_conn_hash_flush(hdev);
|
||||
hci_dev_unlock(hdev);
|
||||
|
||||
hci_notify(hdev, HCI_DEV_DOWN);
|
||||
@@ -3727,6 +3732,9 @@ void hci_conn_params_del(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type)
|
||||
if (!params)
|
||||
return;
|
||||
|
||||
if (params->conn)
|
||||
hci_conn_drop(params->conn);
|
||||
|
||||
list_del(¶ms->action);
|
||||
list_del(¶ms->list);
|
||||
kfree(params);
|
||||
@@ -3757,6 +3765,8 @@ void hci_conn_params_clear_all(struct hci_dev *hdev)
|
||||
struct hci_conn_params *params, *tmp;
|
||||
|
||||
list_for_each_entry_safe(params, tmp, &hdev->le_conn_params, list) {
|
||||
if (params->conn)
|
||||
hci_conn_drop(params->conn);
|
||||
list_del(¶ms->action);
|
||||
list_del(¶ms->list);
|
||||
kfree(params);
|
||||
|
||||
@@ -4221,8 +4221,13 @@ static void hci_le_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
|
||||
hci_proto_connect_cfm(conn, ev->status);
|
||||
|
||||
params = hci_conn_params_lookup(hdev, &conn->dst, conn->dst_type);
|
||||
if (params)
|
||||
if (params) {
|
||||
list_del_init(¶ms->action);
|
||||
if (params->conn) {
|
||||
hci_conn_drop(params->conn);
|
||||
params->conn = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
unlock:
|
||||
hci_update_background_scan(hdev);
|
||||
@@ -4304,8 +4309,16 @@ static void check_pending_le_conn(struct hci_dev *hdev, bdaddr_t *addr,
|
||||
|
||||
conn = hci_connect_le(hdev, addr, addr_type, BT_SECURITY_LOW,
|
||||
HCI_LE_AUTOCONN_TIMEOUT, HCI_ROLE_MASTER);
|
||||
if (!IS_ERR(conn))
|
||||
if (!IS_ERR(conn)) {
|
||||
/* Store the pointer since we don't really have any
|
||||
* other owner of the object besides the params that
|
||||
* triggered it. This way we can abort the connection if
|
||||
* the parameters get removed and keep the reference
|
||||
* count consistent once the connection is established.
|
||||
*/
|
||||
params->conn = conn;
|
||||
return;
|
||||
}
|
||||
|
||||
switch (PTR_ERR(conn)) {
|
||||
case -EBUSY:
|
||||
|
||||
@@ -309,6 +309,9 @@ struct br_input_skb_cb {
|
||||
int igmp;
|
||||
int mrouters_only;
|
||||
#endif
|
||||
#ifdef CONFIG_BRIDGE_VLAN_FILTERING
|
||||
bool vlan_filtered;
|
||||
#endif
|
||||
};
|
||||
|
||||
#define BR_INPUT_SKB_CB(__skb) ((struct br_input_skb_cb *)(__skb)->cb)
|
||||
|
||||
+13
-3
@@ -27,9 +27,13 @@ static void __vlan_add_flags(struct net_port_vlans *v, u16 vid, u16 flags)
|
||||
{
|
||||
if (flags & BRIDGE_VLAN_INFO_PVID)
|
||||
__vlan_add_pvid(v, vid);
|
||||
else
|
||||
__vlan_delete_pvid(v, vid);
|
||||
|
||||
if (flags & BRIDGE_VLAN_INFO_UNTAGGED)
|
||||
set_bit(vid, v->untagged_bitmap);
|
||||
else
|
||||
clear_bit(vid, v->untagged_bitmap);
|
||||
}
|
||||
|
||||
static int __vlan_add(struct net_port_vlans *v, u16 vid, u16 flags)
|
||||
@@ -125,7 +129,8 @@ struct sk_buff *br_handle_vlan(struct net_bridge *br,
|
||||
{
|
||||
u16 vid;
|
||||
|
||||
if (!br->vlan_enabled)
|
||||
/* If this packet was not filtered at input, let it pass */
|
||||
if (!BR_INPUT_SKB_CB(skb)->vlan_filtered)
|
||||
goto out;
|
||||
|
||||
/* Vlan filter table must be configured at this point. The
|
||||
@@ -164,8 +169,10 @@ bool br_allowed_ingress(struct net_bridge *br, struct net_port_vlans *v,
|
||||
/* If VLAN filtering is disabled on the bridge, all packets are
|
||||
* permitted.
|
||||
*/
|
||||
if (!br->vlan_enabled)
|
||||
if (!br->vlan_enabled) {
|
||||
BR_INPUT_SKB_CB(skb)->vlan_filtered = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
/* If there are no vlan in the permitted list, all packets are
|
||||
* rejected.
|
||||
@@ -173,6 +180,7 @@ bool br_allowed_ingress(struct net_bridge *br, struct net_port_vlans *v,
|
||||
if (!v)
|
||||
goto drop;
|
||||
|
||||
BR_INPUT_SKB_CB(skb)->vlan_filtered = true;
|
||||
proto = br->vlan_proto;
|
||||
|
||||
/* If vlan tx offload is disabled on bridge device and frame was
|
||||
@@ -251,7 +259,8 @@ bool br_allowed_egress(struct net_bridge *br,
|
||||
{
|
||||
u16 vid;
|
||||
|
||||
if (!br->vlan_enabled)
|
||||
/* If this packet was not filtered at input, let it pass */
|
||||
if (!BR_INPUT_SKB_CB(skb)->vlan_filtered)
|
||||
return true;
|
||||
|
||||
if (!v)
|
||||
@@ -270,6 +279,7 @@ bool br_should_learn(struct net_bridge_port *p, struct sk_buff *skb, u16 *vid)
|
||||
struct net_bridge *br = p->br;
|
||||
struct net_port_vlans *v;
|
||||
|
||||
/* If filtering was disabled at input, let it pass. */
|
||||
if (!br->vlan_enabled)
|
||||
return true;
|
||||
|
||||
|
||||
+132
-118
@@ -13,8 +13,6 @@
|
||||
#include "auth_x.h"
|
||||
#include "auth_x_protocol.h"
|
||||
|
||||
#define TEMP_TICKET_BUF_LEN 256
|
||||
|
||||
static void ceph_x_validate_tickets(struct ceph_auth_client *ac, int *pneed);
|
||||
|
||||
static int ceph_x_is_authenticated(struct ceph_auth_client *ac)
|
||||
@@ -64,7 +62,7 @@ static int ceph_x_encrypt(struct ceph_crypto_key *secret,
|
||||
}
|
||||
|
||||
static int ceph_x_decrypt(struct ceph_crypto_key *secret,
|
||||
void **p, void *end, void *obuf, size_t olen)
|
||||
void **p, void *end, void **obuf, size_t olen)
|
||||
{
|
||||
struct ceph_x_encrypt_header head;
|
||||
size_t head_len = sizeof(head);
|
||||
@@ -75,8 +73,14 @@ static int ceph_x_decrypt(struct ceph_crypto_key *secret,
|
||||
return -EINVAL;
|
||||
|
||||
dout("ceph_x_decrypt len %d\n", len);
|
||||
ret = ceph_decrypt2(secret, &head, &head_len, obuf, &olen,
|
||||
*p, len);
|
||||
if (*obuf == NULL) {
|
||||
*obuf = kmalloc(len, GFP_NOFS);
|
||||
if (!*obuf)
|
||||
return -ENOMEM;
|
||||
olen = len;
|
||||
}
|
||||
|
||||
ret = ceph_decrypt2(secret, &head, &head_len, *obuf, &olen, *p, len);
|
||||
if (ret)
|
||||
return ret;
|
||||
if (head.struct_v != 1 || le64_to_cpu(head.magic) != CEPHX_ENC_MAGIC)
|
||||
@@ -129,139 +133,120 @@ static void remove_ticket_handler(struct ceph_auth_client *ac,
|
||||
kfree(th);
|
||||
}
|
||||
|
||||
static int ceph_x_proc_ticket_reply(struct ceph_auth_client *ac,
|
||||
struct ceph_crypto_key *secret,
|
||||
void *buf, void *end)
|
||||
static int process_one_ticket(struct ceph_auth_client *ac,
|
||||
struct ceph_crypto_key *secret,
|
||||
void **p, void *end)
|
||||
{
|
||||
struct ceph_x_info *xi = ac->private;
|
||||
int num;
|
||||
void *p = buf;
|
||||
int type;
|
||||
u8 tkt_struct_v, blob_struct_v;
|
||||
struct ceph_x_ticket_handler *th;
|
||||
void *dbuf = NULL;
|
||||
void *dp, *dend;
|
||||
int dlen;
|
||||
char is_enc;
|
||||
struct timespec validity;
|
||||
struct ceph_crypto_key old_key;
|
||||
void *ticket_buf = NULL;
|
||||
void *tp, *tpend;
|
||||
struct ceph_timespec new_validity;
|
||||
struct ceph_crypto_key new_session_key;
|
||||
struct ceph_buffer *new_ticket_blob;
|
||||
unsigned long new_expires, new_renew_after;
|
||||
u64 new_secret_id;
|
||||
int ret;
|
||||
char *dbuf;
|
||||
char *ticket_buf;
|
||||
u8 reply_struct_v;
|
||||
|
||||
dbuf = kmalloc(TEMP_TICKET_BUF_LEN, GFP_NOFS);
|
||||
if (!dbuf)
|
||||
return -ENOMEM;
|
||||
ceph_decode_need(p, end, sizeof(u32) + 1, bad);
|
||||
|
||||
ret = -ENOMEM;
|
||||
ticket_buf = kmalloc(TEMP_TICKET_BUF_LEN, GFP_NOFS);
|
||||
if (!ticket_buf)
|
||||
goto out_dbuf;
|
||||
type = ceph_decode_32(p);
|
||||
dout(" ticket type %d %s\n", type, ceph_entity_type_name(type));
|
||||
|
||||
ceph_decode_need(&p, end, 1 + sizeof(u32), bad);
|
||||
reply_struct_v = ceph_decode_8(&p);
|
||||
if (reply_struct_v != 1)
|
||||
tkt_struct_v = ceph_decode_8(p);
|
||||
if (tkt_struct_v != 1)
|
||||
goto bad;
|
||||
num = ceph_decode_32(&p);
|
||||
dout("%d tickets\n", num);
|
||||
while (num--) {
|
||||
int type;
|
||||
u8 tkt_struct_v, blob_struct_v;
|
||||
struct ceph_x_ticket_handler *th;
|
||||
void *dp, *dend;
|
||||
int dlen;
|
||||
char is_enc;
|
||||
struct timespec validity;
|
||||
struct ceph_crypto_key old_key;
|
||||
void *tp, *tpend;
|
||||
struct ceph_timespec new_validity;
|
||||
struct ceph_crypto_key new_session_key;
|
||||
struct ceph_buffer *new_ticket_blob;
|
||||
unsigned long new_expires, new_renew_after;
|
||||
u64 new_secret_id;
|
||||
|
||||
ceph_decode_need(&p, end, sizeof(u32) + 1, bad);
|
||||
th = get_ticket_handler(ac, type);
|
||||
if (IS_ERR(th)) {
|
||||
ret = PTR_ERR(th);
|
||||
goto out;
|
||||
}
|
||||
|
||||
type = ceph_decode_32(&p);
|
||||
dout(" ticket type %d %s\n", type, ceph_entity_type_name(type));
|
||||
/* blob for me */
|
||||
dlen = ceph_x_decrypt(secret, p, end, &dbuf, 0);
|
||||
if (dlen <= 0) {
|
||||
ret = dlen;
|
||||
goto out;
|
||||
}
|
||||
dout(" decrypted %d bytes\n", dlen);
|
||||
dp = dbuf;
|
||||
dend = dp + dlen;
|
||||
|
||||
tkt_struct_v = ceph_decode_8(&p);
|
||||
if (tkt_struct_v != 1)
|
||||
goto bad;
|
||||
tkt_struct_v = ceph_decode_8(&dp);
|
||||
if (tkt_struct_v != 1)
|
||||
goto bad;
|
||||
|
||||
th = get_ticket_handler(ac, type);
|
||||
if (IS_ERR(th)) {
|
||||
ret = PTR_ERR(th);
|
||||
goto out;
|
||||
}
|
||||
memcpy(&old_key, &th->session_key, sizeof(old_key));
|
||||
ret = ceph_crypto_key_decode(&new_session_key, &dp, dend);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
/* blob for me */
|
||||
dlen = ceph_x_decrypt(secret, &p, end, dbuf,
|
||||
TEMP_TICKET_BUF_LEN);
|
||||
if (dlen <= 0) {
|
||||
ceph_decode_copy(&dp, &new_validity, sizeof(new_validity));
|
||||
ceph_decode_timespec(&validity, &new_validity);
|
||||
new_expires = get_seconds() + validity.tv_sec;
|
||||
new_renew_after = new_expires - (validity.tv_sec / 4);
|
||||
dout(" expires=%lu renew_after=%lu\n", new_expires,
|
||||
new_renew_after);
|
||||
|
||||
/* ticket blob for service */
|
||||
ceph_decode_8_safe(p, end, is_enc, bad);
|
||||
if (is_enc) {
|
||||
/* encrypted */
|
||||
dout(" encrypted ticket\n");
|
||||
dlen = ceph_x_decrypt(&old_key, p, end, &ticket_buf, 0);
|
||||
if (dlen < 0) {
|
||||
ret = dlen;
|
||||
goto out;
|
||||
}
|
||||
dout(" decrypted %d bytes\n", dlen);
|
||||
dend = dbuf + dlen;
|
||||
dp = dbuf;
|
||||
|
||||
tkt_struct_v = ceph_decode_8(&dp);
|
||||
if (tkt_struct_v != 1)
|
||||
goto bad;
|
||||
|
||||
memcpy(&old_key, &th->session_key, sizeof(old_key));
|
||||
ret = ceph_crypto_key_decode(&new_session_key, &dp, dend);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
ceph_decode_copy(&dp, &new_validity, sizeof(new_validity));
|
||||
ceph_decode_timespec(&validity, &new_validity);
|
||||
new_expires = get_seconds() + validity.tv_sec;
|
||||
new_renew_after = new_expires - (validity.tv_sec / 4);
|
||||
dout(" expires=%lu renew_after=%lu\n", new_expires,
|
||||
new_renew_after);
|
||||
|
||||
/* ticket blob for service */
|
||||
ceph_decode_8_safe(&p, end, is_enc, bad);
|
||||
tp = ticket_buf;
|
||||
if (is_enc) {
|
||||
/* encrypted */
|
||||
dout(" encrypted ticket\n");
|
||||
dlen = ceph_x_decrypt(&old_key, &p, end, ticket_buf,
|
||||
TEMP_TICKET_BUF_LEN);
|
||||
if (dlen < 0) {
|
||||
ret = dlen;
|
||||
goto out;
|
||||
}
|
||||
dlen = ceph_decode_32(&tp);
|
||||
} else {
|
||||
/* unencrypted */
|
||||
ceph_decode_32_safe(&p, end, dlen, bad);
|
||||
ceph_decode_need(&p, end, dlen, bad);
|
||||
ceph_decode_copy(&p, ticket_buf, dlen);
|
||||
}
|
||||
tpend = tp + dlen;
|
||||
dout(" ticket blob is %d bytes\n", dlen);
|
||||
ceph_decode_need(&tp, tpend, 1 + sizeof(u64), bad);
|
||||
blob_struct_v = ceph_decode_8(&tp);
|
||||
new_secret_id = ceph_decode_64(&tp);
|
||||
ret = ceph_decode_buffer(&new_ticket_blob, &tp, tpend);
|
||||
if (ret)
|
||||
dlen = ceph_decode_32(&tp);
|
||||
} else {
|
||||
/* unencrypted */
|
||||
ceph_decode_32_safe(p, end, dlen, bad);
|
||||
ticket_buf = kmalloc(dlen, GFP_NOFS);
|
||||
if (!ticket_buf) {
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
|
||||
/* all is well, update our ticket */
|
||||
ceph_crypto_key_destroy(&th->session_key);
|
||||
if (th->ticket_blob)
|
||||
ceph_buffer_put(th->ticket_blob);
|
||||
th->session_key = new_session_key;
|
||||
th->ticket_blob = new_ticket_blob;
|
||||
th->validity = new_validity;
|
||||
th->secret_id = new_secret_id;
|
||||
th->expires = new_expires;
|
||||
th->renew_after = new_renew_after;
|
||||
dout(" got ticket service %d (%s) secret_id %lld len %d\n",
|
||||
type, ceph_entity_type_name(type), th->secret_id,
|
||||
(int)th->ticket_blob->vec.iov_len);
|
||||
xi->have_keys |= th->service;
|
||||
}
|
||||
tp = ticket_buf;
|
||||
ceph_decode_need(p, end, dlen, bad);
|
||||
ceph_decode_copy(p, ticket_buf, dlen);
|
||||
}
|
||||
tpend = tp + dlen;
|
||||
dout(" ticket blob is %d bytes\n", dlen);
|
||||
ceph_decode_need(&tp, tpend, 1 + sizeof(u64), bad);
|
||||
blob_struct_v = ceph_decode_8(&tp);
|
||||
new_secret_id = ceph_decode_64(&tp);
|
||||
ret = ceph_decode_buffer(&new_ticket_blob, &tp, tpend);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
/* all is well, update our ticket */
|
||||
ceph_crypto_key_destroy(&th->session_key);
|
||||
if (th->ticket_blob)
|
||||
ceph_buffer_put(th->ticket_blob);
|
||||
th->session_key = new_session_key;
|
||||
th->ticket_blob = new_ticket_blob;
|
||||
th->validity = new_validity;
|
||||
th->secret_id = new_secret_id;
|
||||
th->expires = new_expires;
|
||||
th->renew_after = new_renew_after;
|
||||
dout(" got ticket service %d (%s) secret_id %lld len %d\n",
|
||||
type, ceph_entity_type_name(type), th->secret_id,
|
||||
(int)th->ticket_blob->vec.iov_len);
|
||||
xi->have_keys |= th->service;
|
||||
|
||||
ret = 0;
|
||||
out:
|
||||
kfree(ticket_buf);
|
||||
out_dbuf:
|
||||
kfree(dbuf);
|
||||
return ret;
|
||||
|
||||
@@ -270,6 +255,34 @@ bad:
|
||||
goto out;
|
||||
}
|
||||
|
||||
static int ceph_x_proc_ticket_reply(struct ceph_auth_client *ac,
|
||||
struct ceph_crypto_key *secret,
|
||||
void *buf, void *end)
|
||||
{
|
||||
void *p = buf;
|
||||
u8 reply_struct_v;
|
||||
u32 num;
|
||||
int ret;
|
||||
|
||||
ceph_decode_8_safe(&p, end, reply_struct_v, bad);
|
||||
if (reply_struct_v != 1)
|
||||
return -EINVAL;
|
||||
|
||||
ceph_decode_32_safe(&p, end, num, bad);
|
||||
dout("%d tickets\n", num);
|
||||
|
||||
while (num--) {
|
||||
ret = process_one_ticket(ac, secret, &p, end);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
bad:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static int ceph_x_build_authorizer(struct ceph_auth_client *ac,
|
||||
struct ceph_x_ticket_handler *th,
|
||||
struct ceph_x_authorizer *au)
|
||||
@@ -583,13 +596,14 @@ static int ceph_x_verify_authorizer_reply(struct ceph_auth_client *ac,
|
||||
struct ceph_x_ticket_handler *th;
|
||||
int ret = 0;
|
||||
struct ceph_x_authorize_reply reply;
|
||||
void *preply = &reply;
|
||||
void *p = au->reply_buf;
|
||||
void *end = p + sizeof(au->reply_buf);
|
||||
|
||||
th = get_ticket_handler(ac, au->service);
|
||||
if (IS_ERR(th))
|
||||
return PTR_ERR(th);
|
||||
ret = ceph_x_decrypt(&th->session_key, &p, end, &reply, sizeof(reply));
|
||||
ret = ceph_x_decrypt(&th->session_key, &p, end, &preply, sizeof(reply));
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
if (ret != sizeof(reply))
|
||||
|
||||
@@ -1181,7 +1181,15 @@ static struct ceph_msg *mon_alloc_msg(struct ceph_connection *con,
|
||||
if (!m) {
|
||||
pr_info("alloc_msg unknown type %d\n", type);
|
||||
*skip = 1;
|
||||
} else if (front_len > m->front_alloc_len) {
|
||||
pr_warning("mon_alloc_msg front %d > prealloc %d (%u#%llu)\n",
|
||||
front_len, m->front_alloc_len,
|
||||
(unsigned int)con->peer_name.type,
|
||||
le64_to_cpu(con->peer_name.num));
|
||||
ceph_msg_put(m);
|
||||
m = ceph_msg_new(type, front_len, GFP_NOFS, false);
|
||||
}
|
||||
|
||||
return m;
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -775,7 +775,7 @@ __sum16 __skb_checksum_complete(struct sk_buff *skb)
|
||||
EXPORT_SYMBOL(__skb_checksum_complete);
|
||||
|
||||
/**
|
||||
* skb_copy_and_csum_datagram_iovec - Copy and checkum skb to user iovec.
|
||||
* skb_copy_and_csum_datagram_iovec - Copy and checksum skb to user iovec.
|
||||
* @skb: skbuff
|
||||
* @hlen: hardware length
|
||||
* @iov: io vector
|
||||
|
||||
+80
-11
@@ -2587,13 +2587,19 @@ netdev_features_t netif_skb_features(struct sk_buff *skb)
|
||||
return harmonize_features(skb, features);
|
||||
}
|
||||
|
||||
features &= (skb->dev->vlan_features | NETIF_F_HW_VLAN_CTAG_TX |
|
||||
NETIF_F_HW_VLAN_STAG_TX);
|
||||
features = netdev_intersect_features(features,
|
||||
skb->dev->vlan_features |
|
||||
NETIF_F_HW_VLAN_CTAG_TX |
|
||||
NETIF_F_HW_VLAN_STAG_TX);
|
||||
|
||||
if (protocol == htons(ETH_P_8021Q) || protocol == htons(ETH_P_8021AD))
|
||||
features &= NETIF_F_SG | NETIF_F_HIGHDMA | NETIF_F_FRAGLIST |
|
||||
NETIF_F_GEN_CSUM | NETIF_F_HW_VLAN_CTAG_TX |
|
||||
NETIF_F_HW_VLAN_STAG_TX;
|
||||
features = netdev_intersect_features(features,
|
||||
NETIF_F_SG |
|
||||
NETIF_F_HIGHDMA |
|
||||
NETIF_F_FRAGLIST |
|
||||
NETIF_F_GEN_CSUM |
|
||||
NETIF_F_HW_VLAN_CTAG_TX |
|
||||
NETIF_F_HW_VLAN_STAG_TX);
|
||||
|
||||
return harmonize_features(skb, features);
|
||||
}
|
||||
@@ -4803,9 +4809,14 @@ static void netdev_adjacent_sysfs_del(struct net_device *dev,
|
||||
sysfs_remove_link(&(dev->dev.kobj), linkname);
|
||||
}
|
||||
|
||||
#define netdev_adjacent_is_neigh_list(dev, dev_list) \
|
||||
(dev_list == &dev->adj_list.upper || \
|
||||
dev_list == &dev->adj_list.lower)
|
||||
static inline bool netdev_adjacent_is_neigh_list(struct net_device *dev,
|
||||
struct net_device *adj_dev,
|
||||
struct list_head *dev_list)
|
||||
{
|
||||
return (dev_list == &dev->adj_list.upper ||
|
||||
dev_list == &dev->adj_list.lower) &&
|
||||
net_eq(dev_net(dev), dev_net(adj_dev));
|
||||
}
|
||||
|
||||
static int __netdev_adjacent_dev_insert(struct net_device *dev,
|
||||
struct net_device *adj_dev,
|
||||
@@ -4835,7 +4846,7 @@ static int __netdev_adjacent_dev_insert(struct net_device *dev,
|
||||
pr_debug("dev_hold for %s, because of link added from %s to %s\n",
|
||||
adj_dev->name, dev->name, adj_dev->name);
|
||||
|
||||
if (netdev_adjacent_is_neigh_list(dev, dev_list)) {
|
||||
if (netdev_adjacent_is_neigh_list(dev, adj_dev, dev_list)) {
|
||||
ret = netdev_adjacent_sysfs_add(dev, adj_dev, dev_list);
|
||||
if (ret)
|
||||
goto free_adj;
|
||||
@@ -4856,7 +4867,7 @@ static int __netdev_adjacent_dev_insert(struct net_device *dev,
|
||||
return 0;
|
||||
|
||||
remove_symlinks:
|
||||
if (netdev_adjacent_is_neigh_list(dev, dev_list))
|
||||
if (netdev_adjacent_is_neigh_list(dev, adj_dev, dev_list))
|
||||
netdev_adjacent_sysfs_del(dev, adj_dev->name, dev_list);
|
||||
free_adj:
|
||||
kfree(adj);
|
||||
@@ -4889,7 +4900,7 @@ static void __netdev_adjacent_dev_remove(struct net_device *dev,
|
||||
if (adj->master)
|
||||
sysfs_remove_link(&(dev->dev.kobj), "master");
|
||||
|
||||
if (netdev_adjacent_is_neigh_list(dev, dev_list))
|
||||
if (netdev_adjacent_is_neigh_list(dev, adj_dev, dev_list))
|
||||
netdev_adjacent_sysfs_del(dev, adj_dev->name, dev_list);
|
||||
|
||||
list_del_rcu(&adj->list);
|
||||
@@ -5159,11 +5170,65 @@ void netdev_upper_dev_unlink(struct net_device *dev,
|
||||
}
|
||||
EXPORT_SYMBOL(netdev_upper_dev_unlink);
|
||||
|
||||
void netdev_adjacent_add_links(struct net_device *dev)
|
||||
{
|
||||
struct netdev_adjacent *iter;
|
||||
|
||||
struct net *net = dev_net(dev);
|
||||
|
||||
list_for_each_entry(iter, &dev->adj_list.upper, list) {
|
||||
if (!net_eq(net,dev_net(iter->dev)))
|
||||
continue;
|
||||
netdev_adjacent_sysfs_add(iter->dev, dev,
|
||||
&iter->dev->adj_list.lower);
|
||||
netdev_adjacent_sysfs_add(dev, iter->dev,
|
||||
&dev->adj_list.upper);
|
||||
}
|
||||
|
||||
list_for_each_entry(iter, &dev->adj_list.lower, list) {
|
||||
if (!net_eq(net,dev_net(iter->dev)))
|
||||
continue;
|
||||
netdev_adjacent_sysfs_add(iter->dev, dev,
|
||||
&iter->dev->adj_list.upper);
|
||||
netdev_adjacent_sysfs_add(dev, iter->dev,
|
||||
&dev->adj_list.lower);
|
||||
}
|
||||
}
|
||||
|
||||
void netdev_adjacent_del_links(struct net_device *dev)
|
||||
{
|
||||
struct netdev_adjacent *iter;
|
||||
|
||||
struct net *net = dev_net(dev);
|
||||
|
||||
list_for_each_entry(iter, &dev->adj_list.upper, list) {
|
||||
if (!net_eq(net,dev_net(iter->dev)))
|
||||
continue;
|
||||
netdev_adjacent_sysfs_del(iter->dev, dev->name,
|
||||
&iter->dev->adj_list.lower);
|
||||
netdev_adjacent_sysfs_del(dev, iter->dev->name,
|
||||
&dev->adj_list.upper);
|
||||
}
|
||||
|
||||
list_for_each_entry(iter, &dev->adj_list.lower, list) {
|
||||
if (!net_eq(net,dev_net(iter->dev)))
|
||||
continue;
|
||||
netdev_adjacent_sysfs_del(iter->dev, dev->name,
|
||||
&iter->dev->adj_list.upper);
|
||||
netdev_adjacent_sysfs_del(dev, iter->dev->name,
|
||||
&dev->adj_list.lower);
|
||||
}
|
||||
}
|
||||
|
||||
void netdev_adjacent_rename_links(struct net_device *dev, char *oldname)
|
||||
{
|
||||
struct netdev_adjacent *iter;
|
||||
|
||||
struct net *net = dev_net(dev);
|
||||
|
||||
list_for_each_entry(iter, &dev->adj_list.upper, list) {
|
||||
if (!net_eq(net,dev_net(iter->dev)))
|
||||
continue;
|
||||
netdev_adjacent_sysfs_del(iter->dev, oldname,
|
||||
&iter->dev->adj_list.lower);
|
||||
netdev_adjacent_sysfs_add(iter->dev, dev,
|
||||
@@ -5171,6 +5236,8 @@ void netdev_adjacent_rename_links(struct net_device *dev, char *oldname)
|
||||
}
|
||||
|
||||
list_for_each_entry(iter, &dev->adj_list.lower, list) {
|
||||
if (!net_eq(net,dev_net(iter->dev)))
|
||||
continue;
|
||||
netdev_adjacent_sysfs_del(iter->dev, oldname,
|
||||
&iter->dev->adj_list.upper);
|
||||
netdev_adjacent_sysfs_add(iter->dev, dev,
|
||||
@@ -6773,6 +6840,7 @@ int dev_change_net_namespace(struct net_device *dev, struct net *net, const char
|
||||
|
||||
/* Send a netdev-removed uevent to the old namespace */
|
||||
kobject_uevent(&dev->dev.kobj, KOBJ_REMOVE);
|
||||
netdev_adjacent_del_links(dev);
|
||||
|
||||
/* Actually switch the network namespace */
|
||||
dev_net_set(dev, net);
|
||||
@@ -6787,6 +6855,7 @@ int dev_change_net_namespace(struct net_device *dev, struct net *net, const char
|
||||
|
||||
/* Send a netdev-add uevent to the new namespace */
|
||||
kobject_uevent(&dev->dev.kobj, KOBJ_ADD);
|
||||
netdev_adjacent_add_links(dev);
|
||||
|
||||
/* Fixup kobjects */
|
||||
err = device_rename(&dev->dev, dev->name);
|
||||
|
||||
@@ -197,7 +197,7 @@ struct gen_estimator *gen_find_node(const struct gnet_stats_basic_packed *bstats
|
||||
* as destination. A new timer with the interval specified in the
|
||||
* configuration TLV is created. Upon each interval, the latest statistics
|
||||
* will be read from &bstats and the estimated rate will be stored in
|
||||
* &rate_est with the statistics lock grabed during this period.
|
||||
* &rate_est with the statistics lock grabbed during this period.
|
||||
*
|
||||
* Returns 0 on success or a negative error code.
|
||||
*
|
||||
|
||||
@@ -206,7 +206,7 @@ EXPORT_SYMBOL(gnet_stats_copy_queue);
|
||||
* @st: application specific statistics data
|
||||
* @len: length of data
|
||||
*
|
||||
* Appends the application sepecific statistics to the top level TLV created by
|
||||
* Appends the application specific statistics to the top level TLV created by
|
||||
* gnet_stats_start_copy() and remembers the data for XSTATS if the dumping
|
||||
* handle is in backward compatibility mode.
|
||||
*
|
||||
|
||||
+2
-2
@@ -2647,7 +2647,7 @@ EXPORT_SYMBOL(skb_prepare_seq_read);
|
||||
* skb_seq_read() will return the remaining part of the block.
|
||||
*
|
||||
* Note 1: The size of each block of data returned can be arbitrary,
|
||||
* this limitation is the cost for zerocopy seqeuental
|
||||
* this limitation is the cost for zerocopy sequential
|
||||
* reads of potentially non linear data.
|
||||
*
|
||||
* Note 2: Fragment lists within fragments are not implemented
|
||||
@@ -2781,7 +2781,7 @@ EXPORT_SYMBOL(skb_find_text);
|
||||
/**
|
||||
* skb_append_datato_frags - append the user data to a skb
|
||||
* @sk: sock structure
|
||||
* @skb: skb structure to be appened with user data.
|
||||
* @skb: skb structure to be appended with user data.
|
||||
* @getfrag: call back function to be used for getting the user data
|
||||
* @from: pointer to user message iov
|
||||
* @length: length of the iov message
|
||||
|
||||
+19
-17
@@ -166,7 +166,7 @@ EXPORT_SYMBOL(sk_ns_capable);
|
||||
/**
|
||||
* sk_capable - Socket global capability test
|
||||
* @sk: Socket to use a capability on or through
|
||||
* @cap: The global capbility to use
|
||||
* @cap: The global capability to use
|
||||
*
|
||||
* Test to see if the opener of the socket had when the socket was
|
||||
* created and the current process has the capability @cap in all user
|
||||
@@ -183,7 +183,7 @@ EXPORT_SYMBOL(sk_capable);
|
||||
* @sk: Socket to use a capability on or through
|
||||
* @cap: The capability to use
|
||||
*
|
||||
* Test to see if the opener of the socket had when the socke was created
|
||||
* Test to see if the opener of the socket had when the socket was created
|
||||
* and the current process has the capability @cap over the network namespace
|
||||
* the socket is a member of.
|
||||
*/
|
||||
@@ -1822,6 +1822,9 @@ struct sk_buff *sock_alloc_send_pskb(struct sock *sk, unsigned long header_len,
|
||||
order);
|
||||
if (page)
|
||||
goto fill_page;
|
||||
/* Do not retry other high order allocations */
|
||||
order = 1;
|
||||
max_page_order = 0;
|
||||
}
|
||||
order--;
|
||||
}
|
||||
@@ -1863,16 +1866,14 @@ EXPORT_SYMBOL(sock_alloc_send_skb);
|
||||
* skb_page_frag_refill - check that a page_frag contains enough room
|
||||
* @sz: minimum size of the fragment we want to get
|
||||
* @pfrag: pointer to page_frag
|
||||
* @prio: priority for memory allocation
|
||||
* @gfp: priority for memory allocation
|
||||
*
|
||||
* Note: While this allocator tries to use high order pages, there is
|
||||
* no guarantee that allocations succeed. Therefore, @sz MUST be
|
||||
* less or equal than PAGE_SIZE.
|
||||
*/
|
||||
bool skb_page_frag_refill(unsigned int sz, struct page_frag *pfrag, gfp_t prio)
|
||||
bool skb_page_frag_refill(unsigned int sz, struct page_frag *pfrag, gfp_t gfp)
|
||||
{
|
||||
int order;
|
||||
|
||||
if (pfrag->page) {
|
||||
if (atomic_read(&pfrag->page->_count) == 1) {
|
||||
pfrag->offset = 0;
|
||||
@@ -1883,20 +1884,21 @@ bool skb_page_frag_refill(unsigned int sz, struct page_frag *pfrag, gfp_t prio)
|
||||
put_page(pfrag->page);
|
||||
}
|
||||
|
||||
order = SKB_FRAG_PAGE_ORDER;
|
||||
do {
|
||||
gfp_t gfp = prio;
|
||||
|
||||
if (order)
|
||||
gfp |= __GFP_COMP | __GFP_NOWARN | __GFP_NORETRY;
|
||||
pfrag->page = alloc_pages(gfp, order);
|
||||
pfrag->offset = 0;
|
||||
if (SKB_FRAG_PAGE_ORDER) {
|
||||
pfrag->page = alloc_pages(gfp | __GFP_COMP |
|
||||
__GFP_NOWARN | __GFP_NORETRY,
|
||||
SKB_FRAG_PAGE_ORDER);
|
||||
if (likely(pfrag->page)) {
|
||||
pfrag->offset = 0;
|
||||
pfrag->size = PAGE_SIZE << order;
|
||||
pfrag->size = PAGE_SIZE << SKB_FRAG_PAGE_ORDER;
|
||||
return true;
|
||||
}
|
||||
} while (--order >= 0);
|
||||
|
||||
}
|
||||
pfrag->page = alloc_page(gfp);
|
||||
if (likely(pfrag->page)) {
|
||||
pfrag->size = PAGE_SIZE;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
EXPORT_SYMBOL(skb_page_frag_refill);
|
||||
|
||||
@@ -246,7 +246,7 @@ lowpan_alloc_frag(struct sk_buff *skb, int size,
|
||||
return ERR_PTR(-rc);
|
||||
}
|
||||
} else {
|
||||
frag = ERR_PTR(ENOMEM);
|
||||
frag = ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
return frag;
|
||||
@@ -437,7 +437,7 @@ static void lowpan_setup(struct net_device *dev)
|
||||
/* Frame Control + Sequence Number + Address fields + Security Header */
|
||||
dev->hard_header_len = 2 + 1 + 20 + 14;
|
||||
dev->needed_tailroom = 2; /* FCS */
|
||||
dev->mtu = 1281;
|
||||
dev->mtu = IPV6_MIN_MTU;
|
||||
dev->tx_queue_len = 0;
|
||||
dev->flags = IFF_BROADCAST | IFF_MULTICAST;
|
||||
dev->watchdog_timeo = 0;
|
||||
|
||||
@@ -355,8 +355,6 @@ int lowpan_frag_rcv(struct sk_buff *skb, const u8 frag_type)
|
||||
struct net *net = dev_net(skb->dev);
|
||||
struct lowpan_frag_info *frag_info = lowpan_cb(skb);
|
||||
struct ieee802154_addr source, dest;
|
||||
struct netns_ieee802154_lowpan *ieee802154_lowpan =
|
||||
net_ieee802154_lowpan(net);
|
||||
int err;
|
||||
|
||||
source = mac_cb(skb)->source;
|
||||
@@ -366,8 +364,10 @@ int lowpan_frag_rcv(struct sk_buff *skb, const u8 frag_type)
|
||||
if (err < 0)
|
||||
goto err;
|
||||
|
||||
if (frag_info->d_size > ieee802154_lowpan->max_dsize)
|
||||
if (frag_info->d_size > IPV6_MIN_MTU) {
|
||||
net_warn_ratelimited("lowpan_frag_rcv: datagram size exceeds MTU\n");
|
||||
goto err;
|
||||
}
|
||||
|
||||
fq = fq_find(net, frag_info, &source, &dest);
|
||||
if (fq != NULL) {
|
||||
@@ -415,13 +415,6 @@ static struct ctl_table lowpan_frags_ns_ctl_table[] = {
|
||||
.mode = 0644,
|
||||
.proc_handler = proc_dointvec_jiffies,
|
||||
},
|
||||
{
|
||||
.procname = "6lowpanfrag_max_datagram_size",
|
||||
.data = &init_net.ieee802154_lowpan.max_dsize,
|
||||
.maxlen = sizeof(int),
|
||||
.mode = 0644,
|
||||
.proc_handler = proc_dointvec
|
||||
},
|
||||
{ }
|
||||
};
|
||||
|
||||
@@ -458,7 +451,6 @@ static int __net_init lowpan_frags_ns_sysctl_register(struct net *net)
|
||||
table[1].data = &ieee802154_lowpan->frags.low_thresh;
|
||||
table[1].extra2 = &ieee802154_lowpan->frags.high_thresh;
|
||||
table[2].data = &ieee802154_lowpan->frags.timeout;
|
||||
table[3].data = &ieee802154_lowpan->max_dsize;
|
||||
|
||||
/* Don't export sysctls to unprivileged users */
|
||||
if (net->user_ns != &init_user_ns)
|
||||
@@ -533,7 +525,6 @@ static int __net_init lowpan_frags_init_net(struct net *net)
|
||||
ieee802154_lowpan->frags.high_thresh = IPV6_FRAG_HIGH_THRESH;
|
||||
ieee802154_lowpan->frags.low_thresh = IPV6_FRAG_LOW_THRESH;
|
||||
ieee802154_lowpan->frags.timeout = IPV6_FRAG_TIMEOUT;
|
||||
ieee802154_lowpan->max_dsize = 0xFFFF;
|
||||
|
||||
inet_frags_init_net(&ieee802154_lowpan->frags);
|
||||
|
||||
|
||||
@@ -79,10 +79,10 @@ static void __tunnel_dst_set(struct ip_tunnel_dst *idst,
|
||||
idst->saddr = saddr;
|
||||
}
|
||||
|
||||
static void tunnel_dst_set(struct ip_tunnel *t,
|
||||
static noinline void tunnel_dst_set(struct ip_tunnel *t,
|
||||
struct dst_entry *dst, __be32 saddr)
|
||||
{
|
||||
__tunnel_dst_set(this_cpu_ptr(t->dst_cache), dst, saddr);
|
||||
__tunnel_dst_set(raw_cpu_ptr(t->dst_cache), dst, saddr);
|
||||
}
|
||||
|
||||
static void tunnel_dst_reset(struct ip_tunnel *t)
|
||||
@@ -106,7 +106,7 @@ static struct rtable *tunnel_rtable_get(struct ip_tunnel *t,
|
||||
struct dst_entry *dst;
|
||||
|
||||
rcu_read_lock();
|
||||
idst = this_cpu_ptr(t->dst_cache);
|
||||
idst = raw_cpu_ptr(t->dst_cache);
|
||||
dst = rcu_dereference(idst->dst);
|
||||
if (dst && !atomic_inc_not_zero(&dst->__refcnt))
|
||||
dst = NULL;
|
||||
|
||||
+55
-47
@@ -82,6 +82,52 @@ config NF_TABLES_ARP
|
||||
help
|
||||
This option enables the ARP support for nf_tables.
|
||||
|
||||
config NF_NAT_IPV4
|
||||
tristate "IPv4 NAT"
|
||||
depends on NF_CONNTRACK_IPV4
|
||||
default m if NETFILTER_ADVANCED=n
|
||||
select NF_NAT
|
||||
help
|
||||
The IPv4 NAT option allows masquerading, port forwarding and other
|
||||
forms of full Network Address Port Translation. This can be
|
||||
controlled by iptables or nft.
|
||||
|
||||
if NF_NAT_IPV4
|
||||
|
||||
config NF_NAT_SNMP_BASIC
|
||||
tristate "Basic SNMP-ALG support"
|
||||
depends on NF_CONNTRACK_SNMP
|
||||
depends on NETFILTER_ADVANCED
|
||||
default NF_NAT && NF_CONNTRACK_SNMP
|
||||
---help---
|
||||
|
||||
This module implements an Application Layer Gateway (ALG) for
|
||||
SNMP payloads. In conjunction with NAT, it allows a network
|
||||
management system to access multiple private networks with
|
||||
conflicting addresses. It works by modifying IP addresses
|
||||
inside SNMP payloads to match IP-layer NAT mapping.
|
||||
|
||||
This is the "basic" form of SNMP-ALG, as described in RFC 2962
|
||||
|
||||
To compile it as a module, choose M here. If unsure, say N.
|
||||
|
||||
config NF_NAT_PROTO_GRE
|
||||
tristate
|
||||
depends on NF_CT_PROTO_GRE
|
||||
|
||||
config NF_NAT_PPTP
|
||||
tristate
|
||||
depends on NF_CONNTRACK
|
||||
default NF_CONNTRACK_PPTP
|
||||
select NF_NAT_PROTO_GRE
|
||||
|
||||
config NF_NAT_H323
|
||||
tristate
|
||||
depends on NF_CONNTRACK
|
||||
default NF_CONNTRACK_H323
|
||||
|
||||
endif # NF_NAT_IPV4
|
||||
|
||||
config IP_NF_IPTABLES
|
||||
tristate "IP tables support (required for filtering/masq/NAT)"
|
||||
default m if NETFILTER_ADVANCED=n
|
||||
@@ -170,19 +216,21 @@ config IP_NF_TARGET_SYNPROXY
|
||||
To compile it as a module, choose M here. If unsure, say N.
|
||||
|
||||
# NAT + specific targets: nf_conntrack
|
||||
config NF_NAT_IPV4
|
||||
tristate "IPv4 NAT"
|
||||
config IP_NF_NAT
|
||||
tristate "iptables NAT support"
|
||||
depends on NF_CONNTRACK_IPV4
|
||||
default m if NETFILTER_ADVANCED=n
|
||||
select NF_NAT
|
||||
select NF_NAT_IPV4
|
||||
select NETFILTER_XT_NAT
|
||||
help
|
||||
The IPv4 NAT option allows masquerading, port forwarding and other
|
||||
forms of full Network Address Port Translation. It is controlled by
|
||||
the `nat' table in iptables: see the man page for iptables(8).
|
||||
This enables the `nat' table in iptables. This allows masquerading,
|
||||
port forwarding and other forms of full Network Address Port
|
||||
Translation.
|
||||
|
||||
To compile it as a module, choose M here. If unsure, say N.
|
||||
|
||||
if NF_NAT_IPV4
|
||||
if IP_NF_NAT
|
||||
|
||||
config IP_NF_TARGET_MASQUERADE
|
||||
tristate "MASQUERADE target support"
|
||||
@@ -214,47 +262,7 @@ config IP_NF_TARGET_REDIRECT
|
||||
(e.g. when running oldconfig). It selects
|
||||
CONFIG_NETFILTER_XT_TARGET_REDIRECT.
|
||||
|
||||
endif
|
||||
|
||||
config NF_NAT_SNMP_BASIC
|
||||
tristate "Basic SNMP-ALG support"
|
||||
depends on NF_CONNTRACK_SNMP && NF_NAT_IPV4
|
||||
depends on NETFILTER_ADVANCED
|
||||
default NF_NAT && NF_CONNTRACK_SNMP
|
||||
---help---
|
||||
|
||||
This module implements an Application Layer Gateway (ALG) for
|
||||
SNMP payloads. In conjunction with NAT, it allows a network
|
||||
management system to access multiple private networks with
|
||||
conflicting addresses. It works by modifying IP addresses
|
||||
inside SNMP payloads to match IP-layer NAT mapping.
|
||||
|
||||
This is the "basic" form of SNMP-ALG, as described in RFC 2962
|
||||
|
||||
To compile it as a module, choose M here. If unsure, say N.
|
||||
|
||||
# If they want FTP, set to $CONFIG_IP_NF_NAT (m or y),
|
||||
# or $CONFIG_IP_NF_FTP (m or y), whichever is weaker.
|
||||
# From kconfig-language.txt:
|
||||
#
|
||||
# <expr> '&&' <expr> (6)
|
||||
#
|
||||
# (6) Returns the result of min(/expr/, /expr/).
|
||||
|
||||
config NF_NAT_PROTO_GRE
|
||||
tristate
|
||||
depends on NF_NAT_IPV4 && NF_CT_PROTO_GRE
|
||||
|
||||
config NF_NAT_PPTP
|
||||
tristate
|
||||
depends on NF_CONNTRACK && NF_NAT_IPV4
|
||||
default NF_NAT_IPV4 && NF_CONNTRACK_PPTP
|
||||
select NF_NAT_PROTO_GRE
|
||||
|
||||
config NF_NAT_H323
|
||||
tristate
|
||||
depends on NF_CONNTRACK && NF_NAT_IPV4
|
||||
default NF_NAT_IPV4 && NF_CONNTRACK_H323
|
||||
endif # IP_NF_NAT
|
||||
|
||||
# mangle + specific targets
|
||||
config IP_NF_MANGLE
|
||||
|
||||
@@ -43,7 +43,7 @@ obj-$(CONFIG_IP_NF_IPTABLES) += ip_tables.o
|
||||
# the three instances of ip_tables
|
||||
obj-$(CONFIG_IP_NF_FILTER) += iptable_filter.o
|
||||
obj-$(CONFIG_IP_NF_MANGLE) += iptable_mangle.o
|
||||
obj-$(CONFIG_NF_NAT_IPV4) += iptable_nat.o
|
||||
obj-$(CONFIG_IP_NF_NAT) += iptable_nat.o
|
||||
obj-$(CONFIG_IP_NF_RAW) += iptable_raw.o
|
||||
obj-$(CONFIG_IP_NF_SECURITY) += iptable_security.o
|
||||
|
||||
|
||||
+3
-3
@@ -2265,9 +2265,9 @@ struct rtable *ip_route_output_flow(struct net *net, struct flowi4 *flp4,
|
||||
return rt;
|
||||
|
||||
if (flp4->flowi4_proto)
|
||||
rt = (struct rtable *) xfrm_lookup(net, &rt->dst,
|
||||
flowi4_to_flowi(flp4),
|
||||
sk, 0);
|
||||
rt = (struct rtable *)xfrm_lookup_route(net, &rt->dst,
|
||||
flowi4_to_flowi(flp4),
|
||||
sk, 0);
|
||||
|
||||
return rt;
|
||||
}
|
||||
|
||||
+14
-21
@@ -1690,14 +1690,12 @@ void addrconf_dad_failure(struct inet6_ifaddr *ifp)
|
||||
addrconf_mod_dad_work(ifp, 0);
|
||||
}
|
||||
|
||||
/* Join to solicited addr multicast group. */
|
||||
|
||||
/* Join to solicited addr multicast group.
|
||||
* caller must hold RTNL */
|
||||
void addrconf_join_solict(struct net_device *dev, const struct in6_addr *addr)
|
||||
{
|
||||
struct in6_addr maddr;
|
||||
|
||||
ASSERT_RTNL();
|
||||
|
||||
if (dev->flags&(IFF_LOOPBACK|IFF_NOARP))
|
||||
return;
|
||||
|
||||
@@ -1705,12 +1703,11 @@ void addrconf_join_solict(struct net_device *dev, const struct in6_addr *addr)
|
||||
ipv6_dev_mc_inc(dev, &maddr);
|
||||
}
|
||||
|
||||
/* caller must hold RTNL */
|
||||
void addrconf_leave_solict(struct inet6_dev *idev, const struct in6_addr *addr)
|
||||
{
|
||||
struct in6_addr maddr;
|
||||
|
||||
ASSERT_RTNL();
|
||||
|
||||
if (idev->dev->flags&(IFF_LOOPBACK|IFF_NOARP))
|
||||
return;
|
||||
|
||||
@@ -1718,12 +1715,11 @@ void addrconf_leave_solict(struct inet6_dev *idev, const struct in6_addr *addr)
|
||||
__ipv6_dev_mc_dec(idev, &maddr);
|
||||
}
|
||||
|
||||
/* caller must hold RTNL */
|
||||
static void addrconf_join_anycast(struct inet6_ifaddr *ifp)
|
||||
{
|
||||
struct in6_addr addr;
|
||||
|
||||
ASSERT_RTNL();
|
||||
|
||||
if (ifp->prefix_len >= 127) /* RFC 6164 */
|
||||
return;
|
||||
ipv6_addr_prefix(&addr, &ifp->addr, ifp->prefix_len);
|
||||
@@ -1732,12 +1728,11 @@ static void addrconf_join_anycast(struct inet6_ifaddr *ifp)
|
||||
ipv6_dev_ac_inc(ifp->idev->dev, &addr);
|
||||
}
|
||||
|
||||
/* caller must hold RTNL */
|
||||
static void addrconf_leave_anycast(struct inet6_ifaddr *ifp)
|
||||
{
|
||||
struct in6_addr addr;
|
||||
|
||||
ASSERT_RTNL();
|
||||
|
||||
if (ifp->prefix_len >= 127) /* RFC 6164 */
|
||||
return;
|
||||
ipv6_addr_prefix(&addr, &ifp->addr, ifp->prefix_len);
|
||||
@@ -3099,11 +3094,13 @@ static int addrconf_ifdown(struct net_device *dev, int how)
|
||||
|
||||
write_unlock_bh(&idev->lock);
|
||||
|
||||
/* Step 5: Discard multicast list */
|
||||
if (how)
|
||||
/* Step 5: Discard anycast and multicast list */
|
||||
if (how) {
|
||||
ipv6_ac_destroy_dev(idev);
|
||||
ipv6_mc_destroy_dev(idev);
|
||||
else
|
||||
} else {
|
||||
ipv6_mc_down(idev);
|
||||
}
|
||||
|
||||
idev->tstamp = jiffies;
|
||||
|
||||
@@ -4773,15 +4770,11 @@ static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp)
|
||||
addrconf_leave_solict(ifp->idev, &ifp->addr);
|
||||
if (!ipv6_addr_any(&ifp->peer_addr)) {
|
||||
struct rt6_info *rt;
|
||||
struct net_device *dev = ifp->idev->dev;
|
||||
|
||||
rt = rt6_lookup(dev_net(dev), &ifp->peer_addr, NULL,
|
||||
dev->ifindex, 1);
|
||||
if (rt) {
|
||||
dst_hold(&rt->dst);
|
||||
if (ip6_del_rt(rt))
|
||||
dst_free(&rt->dst);
|
||||
}
|
||||
rt = addrconf_get_prefix_route(&ifp->peer_addr, 128,
|
||||
ifp->idev->dev, 0, 0);
|
||||
if (rt && ip6_del_rt(rt))
|
||||
dst_free(&rt->dst);
|
||||
}
|
||||
dst_hold(&ifp->rt->dst);
|
||||
|
||||
|
||||
@@ -77,6 +77,7 @@ int ipv6_sock_ac_join(struct sock *sk, int ifindex, const struct in6_addr *addr)
|
||||
pac->acl_next = NULL;
|
||||
pac->acl_addr = *addr;
|
||||
|
||||
rtnl_lock();
|
||||
rcu_read_lock();
|
||||
if (ifindex == 0) {
|
||||
struct rt6_info *rt;
|
||||
@@ -137,6 +138,7 @@ int ipv6_sock_ac_join(struct sock *sk, int ifindex, const struct in6_addr *addr)
|
||||
|
||||
error:
|
||||
rcu_read_unlock();
|
||||
rtnl_unlock();
|
||||
if (pac)
|
||||
sock_kfree_s(sk, pac, sizeof(*pac));
|
||||
return err;
|
||||
@@ -171,11 +173,13 @@ int ipv6_sock_ac_drop(struct sock *sk, int ifindex, const struct in6_addr *addr)
|
||||
|
||||
spin_unlock_bh(&ipv6_sk_ac_lock);
|
||||
|
||||
rtnl_lock();
|
||||
rcu_read_lock();
|
||||
dev = dev_get_by_index_rcu(net, pac->acl_ifindex);
|
||||
if (dev)
|
||||
ipv6_dev_ac_dec(dev, &pac->acl_addr);
|
||||
rcu_read_unlock();
|
||||
rtnl_unlock();
|
||||
|
||||
sock_kfree_s(sk, pac, sizeof(*pac));
|
||||
return 0;
|
||||
@@ -198,6 +202,7 @@ void ipv6_sock_ac_close(struct sock *sk)
|
||||
spin_unlock_bh(&ipv6_sk_ac_lock);
|
||||
|
||||
prev_index = 0;
|
||||
rtnl_lock();
|
||||
rcu_read_lock();
|
||||
while (pac) {
|
||||
struct ipv6_ac_socklist *next = pac->acl_next;
|
||||
@@ -212,6 +217,7 @@ void ipv6_sock_ac_close(struct sock *sk)
|
||||
pac = next;
|
||||
}
|
||||
rcu_read_unlock();
|
||||
rtnl_unlock();
|
||||
}
|
||||
|
||||
static void aca_put(struct ifacaddr6 *ac)
|
||||
@@ -233,6 +239,8 @@ int ipv6_dev_ac_inc(struct net_device *dev, const struct in6_addr *addr)
|
||||
struct rt6_info *rt;
|
||||
int err;
|
||||
|
||||
ASSERT_RTNL();
|
||||
|
||||
idev = in6_dev_get(dev);
|
||||
|
||||
if (idev == NULL)
|
||||
@@ -302,6 +310,8 @@ int __ipv6_dev_ac_dec(struct inet6_dev *idev, const struct in6_addr *addr)
|
||||
{
|
||||
struct ifacaddr6 *aca, *prev_aca;
|
||||
|
||||
ASSERT_RTNL();
|
||||
|
||||
write_lock_bh(&idev->lock);
|
||||
prev_aca = NULL;
|
||||
for (aca = idev->ac_list; aca; aca = aca->aca_next) {
|
||||
@@ -341,6 +351,27 @@ static int ipv6_dev_ac_dec(struct net_device *dev, const struct in6_addr *addr)
|
||||
return __ipv6_dev_ac_dec(idev, addr);
|
||||
}
|
||||
|
||||
void ipv6_ac_destroy_dev(struct inet6_dev *idev)
|
||||
{
|
||||
struct ifacaddr6 *aca;
|
||||
|
||||
write_lock_bh(&idev->lock);
|
||||
while ((aca = idev->ac_list) != NULL) {
|
||||
idev->ac_list = aca->aca_next;
|
||||
write_unlock_bh(&idev->lock);
|
||||
|
||||
addrconf_leave_solict(idev, &aca->aca_addr);
|
||||
|
||||
dst_hold(&aca->aca_rt->dst);
|
||||
ip6_del_rt(aca->aca_rt);
|
||||
|
||||
aca_put(aca);
|
||||
|
||||
write_lock_bh(&idev->lock);
|
||||
}
|
||||
write_unlock_bh(&idev->lock);
|
||||
}
|
||||
|
||||
/*
|
||||
* check if the interface has this anycast address
|
||||
* called with rcu_read_lock()
|
||||
|
||||
+1
-1
@@ -643,7 +643,7 @@ static int fib6_commit_metrics(struct dst_entry *dst,
|
||||
if (dst->flags & DST_HOST) {
|
||||
mp = dst_metrics_write_ptr(dst);
|
||||
} else {
|
||||
mp = kzalloc(sizeof(u32) * RTAX_MAX, GFP_KERNEL);
|
||||
mp = kzalloc(sizeof(u32) * RTAX_MAX, GFP_ATOMIC);
|
||||
if (!mp)
|
||||
return -ENOMEM;
|
||||
dst_init_metrics(dst, mp, 0);
|
||||
|
||||
@@ -1009,7 +1009,7 @@ struct dst_entry *ip6_dst_lookup_flow(struct sock *sk, struct flowi6 *fl6,
|
||||
if (final_dst)
|
||||
fl6->daddr = *final_dst;
|
||||
|
||||
return xfrm_lookup(sock_net(sk), dst, flowi6_to_flowi(fl6), sk, 0);
|
||||
return xfrm_lookup_route(sock_net(sk), dst, flowi6_to_flowi(fl6), sk, 0);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ip6_dst_lookup_flow);
|
||||
|
||||
@@ -1041,7 +1041,7 @@ struct dst_entry *ip6_sk_dst_lookup_flow(struct sock *sk, struct flowi6 *fl6,
|
||||
if (final_dst)
|
||||
fl6->daddr = *final_dst;
|
||||
|
||||
return xfrm_lookup(sock_net(sk), dst, flowi6_to_flowi(fl6), sk, 0);
|
||||
return xfrm_lookup_route(sock_net(sk), dst, flowi6_to_flowi(fl6), sk, 0);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ip6_sk_dst_lookup_flow);
|
||||
|
||||
|
||||
@@ -172,6 +172,7 @@ int ipv6_sock_mc_join(struct sock *sk, int ifindex, const struct in6_addr *addr)
|
||||
mc_lst->next = NULL;
|
||||
mc_lst->addr = *addr;
|
||||
|
||||
rtnl_lock();
|
||||
rcu_read_lock();
|
||||
if (ifindex == 0) {
|
||||
struct rt6_info *rt;
|
||||
@@ -185,6 +186,7 @@ int ipv6_sock_mc_join(struct sock *sk, int ifindex, const struct in6_addr *addr)
|
||||
|
||||
if (dev == NULL) {
|
||||
rcu_read_unlock();
|
||||
rtnl_unlock();
|
||||
sock_kfree_s(sk, mc_lst, sizeof(*mc_lst));
|
||||
return -ENODEV;
|
||||
}
|
||||
@@ -202,6 +204,7 @@ int ipv6_sock_mc_join(struct sock *sk, int ifindex, const struct in6_addr *addr)
|
||||
|
||||
if (err) {
|
||||
rcu_read_unlock();
|
||||
rtnl_unlock();
|
||||
sock_kfree_s(sk, mc_lst, sizeof(*mc_lst));
|
||||
return err;
|
||||
}
|
||||
@@ -212,6 +215,7 @@ int ipv6_sock_mc_join(struct sock *sk, int ifindex, const struct in6_addr *addr)
|
||||
spin_unlock(&ipv6_sk_mc_lock);
|
||||
|
||||
rcu_read_unlock();
|
||||
rtnl_unlock();
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -229,6 +233,7 @@ int ipv6_sock_mc_drop(struct sock *sk, int ifindex, const struct in6_addr *addr)
|
||||
if (!ipv6_addr_is_multicast(addr))
|
||||
return -EINVAL;
|
||||
|
||||
rtnl_lock();
|
||||
spin_lock(&ipv6_sk_mc_lock);
|
||||
for (lnk = &np->ipv6_mc_list;
|
||||
(mc_lst = rcu_dereference_protected(*lnk,
|
||||
@@ -252,12 +257,15 @@ int ipv6_sock_mc_drop(struct sock *sk, int ifindex, const struct in6_addr *addr)
|
||||
} else
|
||||
(void) ip6_mc_leave_src(sk, mc_lst, NULL);
|
||||
rcu_read_unlock();
|
||||
rtnl_unlock();
|
||||
|
||||
atomic_sub(sizeof(*mc_lst), &sk->sk_omem_alloc);
|
||||
kfree_rcu(mc_lst, rcu);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
spin_unlock(&ipv6_sk_mc_lock);
|
||||
rtnl_unlock();
|
||||
|
||||
return -EADDRNOTAVAIL;
|
||||
}
|
||||
@@ -302,6 +310,7 @@ void ipv6_sock_mc_close(struct sock *sk)
|
||||
if (!rcu_access_pointer(np->ipv6_mc_list))
|
||||
return;
|
||||
|
||||
rtnl_lock();
|
||||
spin_lock(&ipv6_sk_mc_lock);
|
||||
while ((mc_lst = rcu_dereference_protected(np->ipv6_mc_list,
|
||||
lockdep_is_held(&ipv6_sk_mc_lock))) != NULL) {
|
||||
@@ -328,6 +337,7 @@ void ipv6_sock_mc_close(struct sock *sk)
|
||||
spin_lock(&ipv6_sk_mc_lock);
|
||||
}
|
||||
spin_unlock(&ipv6_sk_mc_lock);
|
||||
rtnl_unlock();
|
||||
}
|
||||
|
||||
int ip6_mc_source(int add, int omode, struct sock *sk,
|
||||
@@ -845,6 +855,8 @@ int ipv6_dev_mc_inc(struct net_device *dev, const struct in6_addr *addr)
|
||||
struct ifmcaddr6 *mc;
|
||||
struct inet6_dev *idev;
|
||||
|
||||
ASSERT_RTNL();
|
||||
|
||||
/* we need to take a reference on idev */
|
||||
idev = in6_dev_get(dev);
|
||||
|
||||
@@ -916,6 +928,8 @@ int __ipv6_dev_mc_dec(struct inet6_dev *idev, const struct in6_addr *addr)
|
||||
{
|
||||
struct ifmcaddr6 *ma, **map;
|
||||
|
||||
ASSERT_RTNL();
|
||||
|
||||
write_lock_bh(&idev->lock);
|
||||
for (map = &idev->mc_list; (ma=*map) != NULL; map = &ma->next) {
|
||||
if (ipv6_addr_equal(&ma->mca_addr, addr)) {
|
||||
|
||||
@@ -57,9 +57,19 @@ config NFT_REJECT_IPV6
|
||||
|
||||
config NF_LOG_IPV6
|
||||
tristate "IPv6 packet logging"
|
||||
depends on NETFILTER_ADVANCED
|
||||
default m if NETFILTER_ADVANCED=n
|
||||
select NF_LOG_COMMON
|
||||
|
||||
config NF_NAT_IPV6
|
||||
tristate "IPv6 NAT"
|
||||
depends on NF_CONNTRACK_IPV6
|
||||
depends on NETFILTER_ADVANCED
|
||||
select NF_NAT
|
||||
help
|
||||
The IPv6 NAT option allows masquerading, port forwarding and other
|
||||
forms of full Network Address Port Translation. This can be
|
||||
controlled by iptables or nft.
|
||||
|
||||
config IP6_NF_IPTABLES
|
||||
tristate "IP6 tables support (required for filtering)"
|
||||
depends on INET && IPV6
|
||||
@@ -232,19 +242,21 @@ config IP6_NF_SECURITY
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
config NF_NAT_IPV6
|
||||
tristate "IPv6 NAT"
|
||||
config IP6_NF_NAT
|
||||
tristate "ip6tables NAT support"
|
||||
depends on NF_CONNTRACK_IPV6
|
||||
depends on NETFILTER_ADVANCED
|
||||
select NF_NAT
|
||||
select NF_NAT_IPV6
|
||||
select NETFILTER_XT_NAT
|
||||
help
|
||||
The IPv6 NAT option allows masquerading, port forwarding and other
|
||||
forms of full Network Address Port Translation. It is controlled by
|
||||
the `nat' table in ip6tables, see the man page for ip6tables(8).
|
||||
This enables the `nat' table in ip6tables. This allows masquerading,
|
||||
port forwarding and other forms of full Network Address Port
|
||||
Translation.
|
||||
|
||||
To compile it as a module, choose M here. If unsure, say N.
|
||||
|
||||
if NF_NAT_IPV6
|
||||
if IP6_NF_NAT
|
||||
|
||||
config IP6_NF_TARGET_MASQUERADE
|
||||
tristate "MASQUERADE target support"
|
||||
@@ -265,7 +277,7 @@ config IP6_NF_TARGET_NPT
|
||||
|
||||
To compile it as a module, choose M here. If unsure, say N.
|
||||
|
||||
endif # NF_NAT_IPV6
|
||||
endif # IP6_NF_NAT
|
||||
|
||||
endif # IP6_NF_IPTABLES
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ obj-$(CONFIG_IP6_NF_FILTER) += ip6table_filter.o
|
||||
obj-$(CONFIG_IP6_NF_MANGLE) += ip6table_mangle.o
|
||||
obj-$(CONFIG_IP6_NF_RAW) += ip6table_raw.o
|
||||
obj-$(CONFIG_IP6_NF_SECURITY) += ip6table_security.o
|
||||
obj-$(CONFIG_NF_NAT_IPV6) += ip6table_nat.o
|
||||
obj-$(CONFIG_IP6_NF_NAT) += ip6table_nat.o
|
||||
|
||||
# objects for l3 independent conntrack
|
||||
nf_conntrack_ipv6-y := nf_conntrack_l3proto_ipv6.o nf_conntrack_proto_icmpv6.o
|
||||
|
||||
+2
-1
@@ -755,7 +755,8 @@ static int pppol2tp_connect(struct socket *sock, struct sockaddr *uservaddr,
|
||||
/* If PMTU discovery was enabled, use the MTU that was discovered */
|
||||
dst = sk_dst_get(tunnel->sock);
|
||||
if (dst != NULL) {
|
||||
u32 pmtu = dst_mtu(__sk_dst_get(tunnel->sock));
|
||||
u32 pmtu = dst_mtu(dst);
|
||||
|
||||
if (pmtu != 0)
|
||||
session->mtu = session->mru = pmtu -
|
||||
PPPOL2TP_HEADER_OVERHEAD;
|
||||
|
||||
+3
-1
@@ -541,6 +541,8 @@ static void ieee80211_recalc_chanctx_chantype(struct ieee80211_local *local,
|
||||
continue;
|
||||
if (rcu_access_pointer(sdata->vif.chanctx_conf) != conf)
|
||||
continue;
|
||||
if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
|
||||
continue;
|
||||
|
||||
if (!compat)
|
||||
compat = &sdata->vif.bss_conf.chandef;
|
||||
@@ -1444,7 +1446,7 @@ ieee80211_vif_use_reserved_switch(struct ieee80211_local *local)
|
||||
|
||||
list_del(&sdata->reserved_chanctx_list);
|
||||
list_move(&sdata->assigned_chanctx_list,
|
||||
&new_ctx->assigned_vifs);
|
||||
&ctx->assigned_vifs);
|
||||
sdata->reserved_chanctx = NULL;
|
||||
|
||||
ieee80211_vif_chanctx_reservation_complete(sdata);
|
||||
|
||||
@@ -167,7 +167,7 @@ static ssize_t sta_agg_status_read(struct file *file, char __user *userbuf,
|
||||
p += scnprintf(p, sizeof(buf) + buf - p, "next dialog_token: %#02x\n",
|
||||
sta->ampdu_mlme.dialog_token_allocator + 1);
|
||||
p += scnprintf(p, sizeof(buf) + buf - p,
|
||||
"TID\t\tRX active\tDTKN\tSSN\t\tTX\tDTKN\tpending\n");
|
||||
"TID\t\tRX\tDTKN\tSSN\t\tTX\tDTKN\tpending\n");
|
||||
|
||||
for (i = 0; i < IEEE80211_NUM_TIDS; i++) {
|
||||
tid_rx = rcu_dereference(sta->ampdu_mlme.tid_rx[i]);
|
||||
|
||||
@@ -1175,8 +1175,8 @@ static void ieee80211_iface_work(struct work_struct *work)
|
||||
if (sta) {
|
||||
u16 last_seq;
|
||||
|
||||
last_seq = le16_to_cpu(
|
||||
sta->last_seq_ctrl[rx_agg->tid]);
|
||||
last_seq = IEEE80211_SEQ_TO_SN(le16_to_cpu(
|
||||
sta->last_seq_ctrl[rx_agg->tid]));
|
||||
|
||||
__ieee80211_start_rx_ba_session(sta,
|
||||
0, 0,
|
||||
|
||||
@@ -959,7 +959,8 @@ mesh_plink_get_event(struct ieee80211_sub_if_data *sdata,
|
||||
if (!matches_local)
|
||||
event = CNF_RJCT;
|
||||
if (!mesh_plink_free_count(sdata) ||
|
||||
(sta->llid != llid || sta->plid != plid))
|
||||
sta->llid != llid ||
|
||||
(sta->plid && sta->plid != plid))
|
||||
event = CNF_IGNR;
|
||||
else
|
||||
event = CNF_ACPT;
|
||||
@@ -1080,6 +1081,10 @@ mesh_process_plink_frame(struct ieee80211_sub_if_data *sdata,
|
||||
goto unlock_rcu;
|
||||
}
|
||||
|
||||
/* 802.11-2012 13.3.7.2 - update plid on CNF if not set */
|
||||
if (!sta->plid && event == CNF_ACPT)
|
||||
sta->plid = plid;
|
||||
|
||||
changed |= mesh_plink_fsm(sdata, sta, event);
|
||||
|
||||
unlock_rcu:
|
||||
|
||||
+1
-2
@@ -4376,8 +4376,7 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,
|
||||
rcu_read_unlock();
|
||||
|
||||
if (bss->wmm_used && bss->uapsd_supported &&
|
||||
(sdata->local->hw.flags & IEEE80211_HW_SUPPORTS_UAPSD) &&
|
||||
sdata->wmm_acm != 0xff) {
|
||||
(sdata->local->hw.flags & IEEE80211_HW_SUPPORTS_UAPSD)) {
|
||||
assoc_data->uapsd = true;
|
||||
ifmgd->flags |= IEEE80211_STA_UAPSD_ENABLED;
|
||||
} else {
|
||||
|
||||
@@ -1094,8 +1094,11 @@ void ieee80211_sta_ps_deliver_wakeup(struct sta_info *sta)
|
||||
unsigned long flags;
|
||||
struct ps_data *ps;
|
||||
|
||||
if (sdata->vif.type == NL80211_IFTYPE_AP ||
|
||||
sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
|
||||
if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
|
||||
sdata = container_of(sdata->bss, struct ieee80211_sub_if_data,
|
||||
u.ap);
|
||||
|
||||
if (sdata->vif.type == NL80211_IFTYPE_AP)
|
||||
ps = &sdata->bss->ps;
|
||||
else if (ieee80211_vif_is_mesh(&sdata->vif))
|
||||
ps = &sdata->u.mesh.ps;
|
||||
@@ -1819,7 +1822,7 @@ void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo)
|
||||
sinfo->bss_param.flags |= BSS_PARAM_FLAGS_SHORT_PREAMBLE;
|
||||
if (sdata->vif.bss_conf.use_short_slot)
|
||||
sinfo->bss_param.flags |= BSS_PARAM_FLAGS_SHORT_SLOT_TIME;
|
||||
sinfo->bss_param.dtim_period = sdata->local->hw.conf.ps_dtim_period;
|
||||
sinfo->bss_param.dtim_period = sdata->vif.bss_conf.dtim_period;
|
||||
sinfo->bss_param.beacon_interval = sdata->vif.bss_conf.beacon_int;
|
||||
|
||||
sinfo->sta_flags.set = 0;
|
||||
|
||||
@@ -462,7 +462,10 @@ mac802154_subif_frame(struct mac802154_sub_if_data *sdata, struct sk_buff *skb,
|
||||
skb->pkt_type = PACKET_OTHERHOST;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
spin_unlock_bh(&sdata->mib_lock);
|
||||
pr_debug("invalid dest mode\n");
|
||||
kfree_skb(skb);
|
||||
return NET_RX_DROP;
|
||||
}
|
||||
|
||||
spin_unlock_bh(&sdata->mib_lock);
|
||||
@@ -573,6 +576,7 @@ void mac802154_wpans_rx(struct mac802154_priv *priv, struct sk_buff *skb)
|
||||
ret = mac802154_parse_frame_start(skb, &hdr);
|
||||
if (ret) {
|
||||
pr_debug("got invalid frame\n");
|
||||
kfree_skb(skb);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
+12
-2
@@ -499,7 +499,7 @@ config NFT_LIMIT
|
||||
config NFT_NAT
|
||||
depends on NF_TABLES
|
||||
depends on NF_CONNTRACK
|
||||
depends on NF_NAT
|
||||
select NF_NAT
|
||||
tristate "Netfilter nf_tables nat module"
|
||||
help
|
||||
This option adds the "nat" expression that you can use to perform
|
||||
@@ -747,7 +747,9 @@ config NETFILTER_XT_TARGET_LED
|
||||
|
||||
config NETFILTER_XT_TARGET_LOG
|
||||
tristate "LOG target support"
|
||||
depends on NF_LOG_IPV4 && NF_LOG_IPV6
|
||||
select NF_LOG_COMMON
|
||||
select NF_LOG_IPV4
|
||||
select NF_LOG_IPV6 if IPV6
|
||||
default m if NETFILTER_ADVANCED=n
|
||||
help
|
||||
This option adds a `LOG' target, which allows you to create rules in
|
||||
@@ -764,6 +766,14 @@ config NETFILTER_XT_TARGET_MARK
|
||||
(e.g. when running oldconfig). It selects
|
||||
CONFIG_NETFILTER_XT_MARK (combined mark/MARK module).
|
||||
|
||||
config NETFILTER_XT_NAT
|
||||
tristate '"SNAT and DNAT" targets support'
|
||||
depends on NF_NAT
|
||||
---help---
|
||||
This option enables the SNAT and DNAT targets.
|
||||
|
||||
To compile it as a module, choose M here. If unsure, say N.
|
||||
|
||||
config NETFILTER_XT_TARGET_NETMAP
|
||||
tristate '"NETMAP" target support'
|
||||
depends on NF_NAT
|
||||
|
||||
@@ -95,7 +95,7 @@ obj-$(CONFIG_NETFILTER_XTABLES) += x_tables.o xt_tcpudp.o
|
||||
obj-$(CONFIG_NETFILTER_XT_MARK) += xt_mark.o
|
||||
obj-$(CONFIG_NETFILTER_XT_CONNMARK) += xt_connmark.o
|
||||
obj-$(CONFIG_NETFILTER_XT_SET) += xt_set.o
|
||||
obj-$(CONFIG_NF_NAT) += xt_nat.o
|
||||
obj-$(CONFIG_NETFILTER_XT_NAT) += xt_nat.o
|
||||
|
||||
# targets
|
||||
obj-$(CONFIG_NETFILTER_XT_TARGET_AUDIT) += xt_AUDIT.o
|
||||
|
||||
@@ -54,7 +54,7 @@ EXPORT_SYMBOL_GPL(nf_unregister_afinfo);
|
||||
struct list_head nf_hooks[NFPROTO_NUMPROTO][NF_MAX_HOOKS] __read_mostly;
|
||||
EXPORT_SYMBOL(nf_hooks);
|
||||
|
||||
#if defined(CONFIG_JUMP_LABEL)
|
||||
#ifdef HAVE_JUMP_LABEL
|
||||
struct static_key nf_hooks_needed[NFPROTO_NUMPROTO][NF_MAX_HOOKS];
|
||||
EXPORT_SYMBOL(nf_hooks_needed);
|
||||
#endif
|
||||
@@ -72,7 +72,7 @@ int nf_register_hook(struct nf_hook_ops *reg)
|
||||
}
|
||||
list_add_rcu(®->list, elem->list.prev);
|
||||
mutex_unlock(&nf_hook_mutex);
|
||||
#if defined(CONFIG_JUMP_LABEL)
|
||||
#ifdef HAVE_JUMP_LABEL
|
||||
static_key_slow_inc(&nf_hooks_needed[reg->pf][reg->hooknum]);
|
||||
#endif
|
||||
return 0;
|
||||
@@ -84,7 +84,7 @@ void nf_unregister_hook(struct nf_hook_ops *reg)
|
||||
mutex_lock(&nf_hook_mutex);
|
||||
list_del_rcu(®->list);
|
||||
mutex_unlock(&nf_hook_mutex);
|
||||
#if defined(CONFIG_JUMP_LABEL)
|
||||
#ifdef HAVE_JUMP_LABEL
|
||||
static_key_slow_dec(&nf_hooks_needed[reg->pf][reg->hooknum]);
|
||||
#endif
|
||||
synchronize_net();
|
||||
|
||||
@@ -1906,7 +1906,7 @@ static struct nf_hook_ops ip_vs_ops[] __read_mostly = {
|
||||
{
|
||||
.hook = ip_vs_local_reply6,
|
||||
.owner = THIS_MODULE,
|
||||
.pf = NFPROTO_IPV4,
|
||||
.pf = NFPROTO_IPV6,
|
||||
.hooknum = NF_INET_LOCAL_OUT,
|
||||
.priority = NF_IP6_PRI_NAT_DST + 1,
|
||||
},
|
||||
|
||||
@@ -38,6 +38,7 @@
|
||||
#include <net/route.h> /* for ip_route_output */
|
||||
#include <net/ipv6.h>
|
||||
#include <net/ip6_route.h>
|
||||
#include <net/ip_tunnels.h>
|
||||
#include <net/addrconf.h>
|
||||
#include <linux/icmpv6.h>
|
||||
#include <linux/netfilter.h>
|
||||
@@ -862,11 +863,15 @@ ip_vs_tunnel_xmit(struct sk_buff *skb, struct ip_vs_conn *cp,
|
||||
old_iph = ip_hdr(skb);
|
||||
}
|
||||
|
||||
skb->transport_header = skb->network_header;
|
||||
|
||||
/* fix old IP header checksum */
|
||||
ip_send_check(old_iph);
|
||||
|
||||
skb = iptunnel_handle_offloads(skb, false, SKB_GSO_IPIP);
|
||||
if (IS_ERR(skb))
|
||||
goto tx_error;
|
||||
|
||||
skb->transport_header = skb->network_header;
|
||||
|
||||
skb_push(skb, sizeof(struct iphdr));
|
||||
skb_reset_network_header(skb);
|
||||
memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt));
|
||||
@@ -900,7 +905,8 @@ ip_vs_tunnel_xmit(struct sk_buff *skb, struct ip_vs_conn *cp,
|
||||
return NF_STOLEN;
|
||||
|
||||
tx_error:
|
||||
kfree_skb(skb);
|
||||
if (!IS_ERR(skb))
|
||||
kfree_skb(skb);
|
||||
rcu_read_unlock();
|
||||
LeaveFunction(10);
|
||||
return NF_STOLEN;
|
||||
@@ -953,6 +959,11 @@ ip_vs_tunnel_xmit_v6(struct sk_buff *skb, struct ip_vs_conn *cp,
|
||||
old_iph = ipv6_hdr(skb);
|
||||
}
|
||||
|
||||
/* GSO: we need to provide proper SKB_GSO_ value for IPv6 */
|
||||
skb = iptunnel_handle_offloads(skb, false, 0); /* SKB_GSO_SIT/IPV6 */
|
||||
if (IS_ERR(skb))
|
||||
goto tx_error;
|
||||
|
||||
skb->transport_header = skb->network_header;
|
||||
|
||||
skb_push(skb, sizeof(struct ipv6hdr));
|
||||
@@ -988,7 +999,8 @@ ip_vs_tunnel_xmit_v6(struct sk_buff *skb, struct ip_vs_conn *cp,
|
||||
return NF_STOLEN;
|
||||
|
||||
tx_error:
|
||||
kfree_skb(skb);
|
||||
if (!IS_ERR(skb))
|
||||
kfree_skb(skb);
|
||||
rcu_read_unlock();
|
||||
LeaveFunction(10);
|
||||
return NF_STOLEN;
|
||||
|
||||
@@ -31,7 +31,7 @@ static int cgroup_mt_check(const struct xt_mtchk_param *par)
|
||||
if (info->invert & ~1)
|
||||
return -EINVAL;
|
||||
|
||||
return info->id ? 0 : -EINVAL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool
|
||||
|
||||
@@ -42,6 +42,9 @@ static int do_execute_actions(struct datapath *dp, struct sk_buff *skb,
|
||||
|
||||
static int make_writable(struct sk_buff *skb, int write_len)
|
||||
{
|
||||
if (!pskb_may_pull(skb, write_len))
|
||||
return -ENOMEM;
|
||||
|
||||
if (!skb_cloned(skb) || skb_clone_writable(skb, write_len))
|
||||
return 0;
|
||||
|
||||
@@ -70,6 +73,8 @@ static int __pop_vlan_tci(struct sk_buff *skb, __be16 *current_tci)
|
||||
|
||||
vlan_set_encap_proto(skb, vhdr);
|
||||
skb->mac_header += VLAN_HLEN;
|
||||
if (skb_network_offset(skb) < ETH_HLEN)
|
||||
skb_set_network_header(skb, ETH_HLEN);
|
||||
skb_reset_mac_len(skb);
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -78,11 +78,12 @@ static const struct genl_multicast_group ovs_dp_vport_multicast_group = {
|
||||
|
||||
/* Check if need to build a reply message.
|
||||
* OVS userspace sets the NLM_F_ECHO flag if it needs the reply. */
|
||||
static bool ovs_must_notify(struct genl_info *info,
|
||||
const struct genl_multicast_group *grp)
|
||||
static bool ovs_must_notify(struct genl_family *family, struct genl_info *info,
|
||||
unsigned int group)
|
||||
{
|
||||
return info->nlhdr->nlmsg_flags & NLM_F_ECHO ||
|
||||
netlink_has_listeners(genl_info_net(info)->genl_sock, 0);
|
||||
genl_has_listeners(family, genl_info_net(info)->genl_sock,
|
||||
group);
|
||||
}
|
||||
|
||||
static void ovs_notify(struct genl_family *family,
|
||||
@@ -265,8 +266,11 @@ void ovs_dp_process_received_packet(struct vport *p, struct sk_buff *skb)
|
||||
upcall.key = &key;
|
||||
upcall.userdata = NULL;
|
||||
upcall.portid = ovs_vport_find_upcall_portid(p, skb);
|
||||
ovs_dp_upcall(dp, skb, &upcall);
|
||||
consume_skb(skb);
|
||||
error = ovs_dp_upcall(dp, skb, &upcall);
|
||||
if (unlikely(error))
|
||||
kfree_skb(skb);
|
||||
else
|
||||
consume_skb(skb);
|
||||
stats_counter = &stats->n_missed;
|
||||
goto out;
|
||||
}
|
||||
@@ -404,7 +408,7 @@ static int queue_userspace_packet(struct datapath *dp, struct sk_buff *skb,
|
||||
{
|
||||
struct ovs_header *upcall;
|
||||
struct sk_buff *nskb = NULL;
|
||||
struct sk_buff *user_skb; /* to be queued to userspace */
|
||||
struct sk_buff *user_skb = NULL; /* to be queued to userspace */
|
||||
struct nlattr *nla;
|
||||
struct genl_info info = {
|
||||
.dst_sk = ovs_dp_get_net(dp)->genl_sock,
|
||||
@@ -494,9 +498,11 @@ static int queue_userspace_packet(struct datapath *dp, struct sk_buff *skb,
|
||||
((struct nlmsghdr *) user_skb->data)->nlmsg_len = user_skb->len;
|
||||
|
||||
err = genlmsg_unicast(ovs_dp_get_net(dp), user_skb, upcall_info->portid);
|
||||
user_skb = NULL;
|
||||
out:
|
||||
if (err)
|
||||
skb_tx_error(skb);
|
||||
kfree_skb(user_skb);
|
||||
kfree_skb(nskb);
|
||||
return err;
|
||||
}
|
||||
@@ -758,7 +764,7 @@ static struct sk_buff *ovs_flow_cmd_alloc_info(const struct sw_flow_actions *act
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
|
||||
if (!always && !ovs_must_notify(info, &ovs_dp_flow_multicast_group))
|
||||
if (!always && !ovs_must_notify(&dp_flow_genl_family, info, 0))
|
||||
return NULL;
|
||||
|
||||
skb = genlmsg_new_unicast(ovs_flow_cmd_msg_size(acts), info, GFP_KERNEL);
|
||||
|
||||
@@ -632,6 +632,7 @@ static void init_prb_bdqc(struct packet_sock *po,
|
||||
p1->tov_in_jiffies = msecs_to_jiffies(p1->retire_blk_tov);
|
||||
p1->blk_sizeof_priv = req_u->req3.tp_sizeof_priv;
|
||||
|
||||
p1->max_frame_len = p1->kblk_size - BLK_PLUS_PRIV(p1->blk_sizeof_priv);
|
||||
prb_init_ft_ops(p1, req_u);
|
||||
prb_setup_retire_blk_timer(po, tx_ring);
|
||||
prb_open_block(p1, pbd);
|
||||
@@ -1942,6 +1943,18 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev,
|
||||
if ((int)snaplen < 0)
|
||||
snaplen = 0;
|
||||
}
|
||||
} else if (unlikely(macoff + snaplen >
|
||||
GET_PBDQC_FROM_RB(&po->rx_ring)->max_frame_len)) {
|
||||
u32 nval;
|
||||
|
||||
nval = GET_PBDQC_FROM_RB(&po->rx_ring)->max_frame_len - macoff;
|
||||
pr_err_once("tpacket_rcv: packet too big, clamped from %u to %u. macoff=%u\n",
|
||||
snaplen, nval, macoff);
|
||||
snaplen = nval;
|
||||
if (unlikely((int)snaplen < 0)) {
|
||||
snaplen = 0;
|
||||
macoff = GET_PBDQC_FROM_RB(&po->rx_ring)->max_frame_len;
|
||||
}
|
||||
}
|
||||
spin_lock(&sk->sk_receive_queue.lock);
|
||||
h.raw = packet_current_rx_frame(po, skb,
|
||||
@@ -3783,6 +3796,10 @@ static int packet_set_ring(struct sock *sk, union tpacket_req_u *req_u,
|
||||
goto out;
|
||||
if (unlikely(req->tp_block_size & (PAGE_SIZE - 1)))
|
||||
goto out;
|
||||
if (po->tp_version >= TPACKET_V3 &&
|
||||
(int)(req->tp_block_size -
|
||||
BLK_PLUS_PRIV(req_u->req3.tp_sizeof_priv)) <= 0)
|
||||
goto out;
|
||||
if (unlikely(req->tp_frame_size < po->tp_hdrlen +
|
||||
po->tp_reserve))
|
||||
goto out;
|
||||
|
||||
@@ -29,6 +29,7 @@ struct tpacket_kbdq_core {
|
||||
char *pkblk_start;
|
||||
char *pkblk_end;
|
||||
int kblk_size;
|
||||
unsigned int max_frame_len;
|
||||
unsigned int knum_blocks;
|
||||
uint64_t knxt_seq_num;
|
||||
char *prev;
|
||||
|
||||
@@ -158,10 +158,12 @@ static const struct acpi_device_id rfkill_acpi_match[] = {
|
||||
{ "BCM2E1A", RFKILL_TYPE_BLUETOOTH },
|
||||
{ "BCM2E39", RFKILL_TYPE_BLUETOOTH },
|
||||
{ "BCM2E3D", RFKILL_TYPE_BLUETOOTH },
|
||||
{ "BCM2E64", RFKILL_TYPE_BLUETOOTH },
|
||||
{ "BCM4752", RFKILL_TYPE_GPS },
|
||||
{ "LNV4752", RFKILL_TYPE_GPS },
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(acpi, rfkill_acpi_match);
|
||||
#endif
|
||||
|
||||
static struct platform_driver rfkill_gpio_driver = {
|
||||
|
||||
+1
-1
@@ -1143,7 +1143,7 @@ static long rxrpc_read(const struct key *key,
|
||||
if (copy_to_user(xdr, (s), _l) != 0) \
|
||||
goto fault; \
|
||||
if (_l & 3 && \
|
||||
copy_to_user((u8 *)xdr + _l, &zero, 4 - (_l & 3)) != 0) \
|
||||
copy_to_user((u8 __user *)xdr + _l, &zero, 4 - (_l & 3)) != 0) \
|
||||
goto fault; \
|
||||
xdr += (_l + 3) >> 2; \
|
||||
} while(0)
|
||||
|
||||
+13
-33
@@ -159,7 +159,6 @@ struct cbq_sched_data {
|
||||
struct cbq_class *tx_borrowed;
|
||||
int tx_len;
|
||||
psched_time_t now; /* Cached timestamp */
|
||||
psched_time_t now_rt; /* Cached real time */
|
||||
unsigned int pmask;
|
||||
|
||||
struct hrtimer delay_timer;
|
||||
@@ -353,12 +352,7 @@ cbq_mark_toplevel(struct cbq_sched_data *q, struct cbq_class *cl)
|
||||
int toplevel = q->toplevel;
|
||||
|
||||
if (toplevel > cl->level && !(qdisc_is_throttled(cl->q))) {
|
||||
psched_time_t now;
|
||||
psched_tdiff_t incr;
|
||||
|
||||
now = psched_get_time();
|
||||
incr = now - q->now_rt;
|
||||
now = q->now + incr;
|
||||
psched_time_t now = psched_get_time();
|
||||
|
||||
do {
|
||||
if (cl->undertime < now) {
|
||||
@@ -700,8 +694,13 @@ cbq_update(struct cbq_sched_data *q)
|
||||
struct cbq_class *this = q->tx_class;
|
||||
struct cbq_class *cl = this;
|
||||
int len = q->tx_len;
|
||||
psched_time_t now;
|
||||
|
||||
q->tx_class = NULL;
|
||||
/* Time integrator. We calculate EOS time
|
||||
* by adding expected packet transmission time.
|
||||
*/
|
||||
now = q->now + L2T(&q->link, len);
|
||||
|
||||
for ( ; cl; cl = cl->share) {
|
||||
long avgidle = cl->avgidle;
|
||||
@@ -717,7 +716,7 @@ cbq_update(struct cbq_sched_data *q)
|
||||
* idle = (now - last) - last_pktlen/rate
|
||||
*/
|
||||
|
||||
idle = q->now - cl->last;
|
||||
idle = now - cl->last;
|
||||
if ((unsigned long)idle > 128*1024*1024) {
|
||||
avgidle = cl->maxidle;
|
||||
} else {
|
||||
@@ -761,7 +760,7 @@ cbq_update(struct cbq_sched_data *q)
|
||||
idle -= L2T(&q->link, len);
|
||||
idle += L2T(cl, len);
|
||||
|
||||
cl->undertime = q->now + idle;
|
||||
cl->undertime = now + idle;
|
||||
} else {
|
||||
/* Underlimit */
|
||||
|
||||
@@ -771,7 +770,8 @@ cbq_update(struct cbq_sched_data *q)
|
||||
else
|
||||
cl->avgidle = avgidle;
|
||||
}
|
||||
cl->last = q->now;
|
||||
if ((s64)(now - cl->last) > 0)
|
||||
cl->last = now;
|
||||
}
|
||||
|
||||
cbq_update_toplevel(q, this, q->tx_borrowed);
|
||||
@@ -943,31 +943,13 @@ cbq_dequeue(struct Qdisc *sch)
|
||||
struct sk_buff *skb;
|
||||
struct cbq_sched_data *q = qdisc_priv(sch);
|
||||
psched_time_t now;
|
||||
psched_tdiff_t incr;
|
||||
|
||||
now = psched_get_time();
|
||||
incr = now - q->now_rt;
|
||||
|
||||
if (q->tx_class) {
|
||||
psched_tdiff_t incr2;
|
||||
/* Time integrator. We calculate EOS time
|
||||
* by adding expected packet transmission time.
|
||||
* If real time is greater, we warp artificial clock,
|
||||
* so that:
|
||||
*
|
||||
* cbq_time = max(real_time, work);
|
||||
*/
|
||||
incr2 = L2T(&q->link, q->tx_len);
|
||||
q->now += incr2;
|
||||
if (q->tx_class)
|
||||
cbq_update(q);
|
||||
if ((incr -= incr2) < 0)
|
||||
incr = 0;
|
||||
q->now += incr;
|
||||
} else {
|
||||
if (now > q->now)
|
||||
q->now = now;
|
||||
}
|
||||
q->now_rt = now;
|
||||
|
||||
q->now = now;
|
||||
|
||||
for (;;) {
|
||||
q->wd_expires = 0;
|
||||
@@ -1223,7 +1205,6 @@ cbq_reset(struct Qdisc *sch)
|
||||
hrtimer_cancel(&q->delay_timer);
|
||||
q->toplevel = TC_CBQ_MAXLEVEL;
|
||||
q->now = psched_get_time();
|
||||
q->now_rt = q->now;
|
||||
|
||||
for (prio = 0; prio <= TC_CBQ_MAXPRIO; prio++)
|
||||
q->active[prio] = NULL;
|
||||
@@ -1407,7 +1388,6 @@ static int cbq_init(struct Qdisc *sch, struct nlattr *opt)
|
||||
q->delay_timer.function = cbq_undelay;
|
||||
q->toplevel = TC_CBQ_MAXLEVEL;
|
||||
q->now = psched_get_time();
|
||||
q->now_rt = q->now;
|
||||
|
||||
cbq_link_class(&q->link);
|
||||
|
||||
|
||||
+14
-4
@@ -133,10 +133,16 @@ static void choke_drop_by_idx(struct Qdisc *sch, unsigned int idx)
|
||||
--sch->q.qlen;
|
||||
}
|
||||
|
||||
/* private part of skb->cb[] that a qdisc is allowed to use
|
||||
* is limited to QDISC_CB_PRIV_LEN bytes.
|
||||
* As a flow key might be too large, we store a part of it only.
|
||||
*/
|
||||
#define CHOKE_K_LEN min_t(u32, sizeof(struct flow_keys), QDISC_CB_PRIV_LEN - 3)
|
||||
|
||||
struct choke_skb_cb {
|
||||
u16 classid;
|
||||
u8 keys_valid;
|
||||
struct flow_keys keys;
|
||||
u8 keys[QDISC_CB_PRIV_LEN - 3];
|
||||
};
|
||||
|
||||
static inline struct choke_skb_cb *choke_skb_cb(const struct sk_buff *skb)
|
||||
@@ -163,22 +169,26 @@ static u16 choke_get_classid(const struct sk_buff *skb)
|
||||
static bool choke_match_flow(struct sk_buff *skb1,
|
||||
struct sk_buff *skb2)
|
||||
{
|
||||
struct flow_keys temp;
|
||||
|
||||
if (skb1->protocol != skb2->protocol)
|
||||
return false;
|
||||
|
||||
if (!choke_skb_cb(skb1)->keys_valid) {
|
||||
choke_skb_cb(skb1)->keys_valid = 1;
|
||||
skb_flow_dissect(skb1, &choke_skb_cb(skb1)->keys);
|
||||
skb_flow_dissect(skb1, &temp);
|
||||
memcpy(&choke_skb_cb(skb1)->keys, &temp, CHOKE_K_LEN);
|
||||
}
|
||||
|
||||
if (!choke_skb_cb(skb2)->keys_valid) {
|
||||
choke_skb_cb(skb2)->keys_valid = 1;
|
||||
skb_flow_dissect(skb2, &choke_skb_cb(skb2)->keys);
|
||||
skb_flow_dissect(skb2, &temp);
|
||||
memcpy(&choke_skb_cb(skb2)->keys, &temp, CHOKE_K_LEN);
|
||||
}
|
||||
|
||||
return !memcmp(&choke_skb_cb(skb1)->keys,
|
||||
&choke_skb_cb(skb2)->keys,
|
||||
sizeof(struct flow_keys));
|
||||
CHOKE_K_LEN);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -813,6 +813,7 @@ void sctp_assoc_control_transport(struct sctp_association *asoc,
|
||||
else {
|
||||
dst_release(transport->dst);
|
||||
transport->dst = NULL;
|
||||
ulp_notify = false;
|
||||
}
|
||||
|
||||
spc_state = SCTP_ADDR_UNREACHABLE;
|
||||
@@ -1244,7 +1245,7 @@ static struct sctp_transport *sctp_trans_elect_best(struct sctp_transport *curr,
|
||||
{
|
||||
u8 score_curr, score_best;
|
||||
|
||||
if (best == NULL)
|
||||
if (best == NULL || curr == best)
|
||||
return curr;
|
||||
|
||||
score_curr = sctp_trans_score(curr);
|
||||
@@ -1355,14 +1356,11 @@ static void sctp_select_active_and_retran_path(struct sctp_association *asoc)
|
||||
trans_sec = trans_pri;
|
||||
|
||||
/* If we failed to find a usable transport, just camp on the
|
||||
* primary or retran, even if they are inactive, if possible
|
||||
* pick a PF iff it's the better choice.
|
||||
* active or pick a PF iff it's the better choice.
|
||||
*/
|
||||
if (trans_pri == NULL) {
|
||||
trans_pri = sctp_trans_elect_best(asoc->peer.primary_path,
|
||||
asoc->peer.retran_path);
|
||||
trans_pri = sctp_trans_elect_best(trans_pri, trans_pf);
|
||||
trans_sec = asoc->peer.primary_path;
|
||||
trans_pri = sctp_trans_elect_best(asoc->peer.active_path, trans_pf);
|
||||
trans_sec = trans_pri;
|
||||
}
|
||||
|
||||
/* Set the active and retran transports. */
|
||||
|
||||
+1
-1
@@ -4243,7 +4243,7 @@ static int sctp_getsockopt_sctp_status(struct sock *sk, int len,
|
||||
transport = asoc->peer.primary_path;
|
||||
|
||||
status.sstat_assoc_id = sctp_assoc2id(asoc);
|
||||
status.sstat_state = asoc->state;
|
||||
status.sstat_state = sctp_assoc_to_state(asoc);
|
||||
status.sstat_rwnd = asoc->peer.rwnd;
|
||||
status.sstat_unackdata = asoc->unack_data;
|
||||
|
||||
|
||||
+5
-3
@@ -734,8 +734,7 @@ void __sock_recv_timestamp(struct msghdr *msg, struct sock *sk,
|
||||
}
|
||||
|
||||
memset(&tss, 0, sizeof(tss));
|
||||
if ((sk->sk_tsflags & SOF_TIMESTAMPING_SOFTWARE ||
|
||||
skb_shinfo(skb)->tx_flags & SKBTX_ANY_SW_TSTAMP) &&
|
||||
if ((sk->sk_tsflags & SOF_TIMESTAMPING_SOFTWARE) &&
|
||||
ktime_to_timespec_cond(skb->tstamp, tss.ts + 0))
|
||||
empty = 0;
|
||||
if (shhwtstamps &&
|
||||
@@ -1997,6 +1996,9 @@ static int copy_msghdr_from_user(struct msghdr *kmsg,
|
||||
if (copy_from_user(kmsg, umsg, sizeof(struct msghdr)))
|
||||
return -EFAULT;
|
||||
|
||||
if (kmsg->msg_name == NULL)
|
||||
kmsg->msg_namelen = 0;
|
||||
|
||||
if (kmsg->msg_namelen < 0)
|
||||
return -EINVAL;
|
||||
|
||||
@@ -2602,7 +2604,7 @@ SYSCALL_DEFINE2(socketcall, int, call, unsigned long __user *, args)
|
||||
*
|
||||
* This function is called by a protocol handler that wants to
|
||||
* advertise its address family, and have it linked into the
|
||||
* socket interface. The value ops->family coresponds to the
|
||||
* socket interface. The value ops->family corresponds to the
|
||||
* socket system call protocol family.
|
||||
*/
|
||||
int sock_register(const struct net_proto_family *ops)
|
||||
|
||||
+4
-1
@@ -179,9 +179,12 @@ static inline int tipc_port_importance(struct tipc_port *port)
|
||||
return msg_importance(&port->phdr);
|
||||
}
|
||||
|
||||
static inline void tipc_port_set_importance(struct tipc_port *port, int imp)
|
||||
static inline int tipc_port_set_importance(struct tipc_port *port, int imp)
|
||||
{
|
||||
if (imp > TIPC_CRITICAL_IMPORTANCE)
|
||||
return -EINVAL;
|
||||
msg_set_importance(&port->phdr, (u32)imp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
+1
-1
@@ -1973,7 +1973,7 @@ static int tipc_setsockopt(struct socket *sock, int lvl, int opt,
|
||||
|
||||
switch (opt) {
|
||||
case TIPC_IMPORTANCE:
|
||||
tipc_port_set_importance(port, value);
|
||||
res = tipc_port_set_importance(port, value);
|
||||
break;
|
||||
case TIPC_SRC_DROPPABLE:
|
||||
if (sock->type != SOCK_STREAM)
|
||||
|
||||
@@ -6969,6 +6969,9 @@ void __cfg80211_send_event_skb(struct sk_buff *skb, gfp_t gfp)
|
||||
struct nlattr *data = ((void **)skb->cb)[2];
|
||||
enum nl80211_multicast_groups mcgrp = NL80211_MCGRP_TESTMODE;
|
||||
|
||||
/* clear CB data for netlink core to own from now on */
|
||||
memset(skb->cb, 0, sizeof(skb->cb));
|
||||
|
||||
nla_nest_end(skb, data);
|
||||
genlmsg_end(skb, hdr);
|
||||
|
||||
@@ -9294,6 +9297,9 @@ int cfg80211_vendor_cmd_reply(struct sk_buff *skb)
|
||||
void *hdr = ((void **)skb->cb)[1];
|
||||
struct nlattr *data = ((void **)skb->cb)[2];
|
||||
|
||||
/* clear CB data for netlink core to own from now on */
|
||||
memset(skb->cb, 0, sizeof(skb->cb));
|
||||
|
||||
if (WARN_ON(!rdev->cur_cmd_info)) {
|
||||
kfree_skb(skb);
|
||||
return -EINVAL;
|
||||
|
||||
+40
-8
@@ -39,6 +39,11 @@
|
||||
#define XFRM_QUEUE_TMO_MAX ((unsigned)(60*HZ))
|
||||
#define XFRM_MAX_QUEUE_LEN 100
|
||||
|
||||
struct xfrm_flo {
|
||||
struct dst_entry *dst_orig;
|
||||
u8 flags;
|
||||
};
|
||||
|
||||
static DEFINE_SPINLOCK(xfrm_policy_afinfo_lock);
|
||||
static struct xfrm_policy_afinfo __rcu *xfrm_policy_afinfo[NPROTO]
|
||||
__read_mostly;
|
||||
@@ -1877,13 +1882,14 @@ static int xdst_queue_output(struct sock *sk, struct sk_buff *skb)
|
||||
}
|
||||
|
||||
static struct xfrm_dst *xfrm_create_dummy_bundle(struct net *net,
|
||||
struct dst_entry *dst,
|
||||
struct xfrm_flo *xflo,
|
||||
const struct flowi *fl,
|
||||
int num_xfrms,
|
||||
u16 family)
|
||||
{
|
||||
int err;
|
||||
struct net_device *dev;
|
||||
struct dst_entry *dst;
|
||||
struct dst_entry *dst1;
|
||||
struct xfrm_dst *xdst;
|
||||
|
||||
@@ -1891,9 +1897,12 @@ static struct xfrm_dst *xfrm_create_dummy_bundle(struct net *net,
|
||||
if (IS_ERR(xdst))
|
||||
return xdst;
|
||||
|
||||
if (net->xfrm.sysctl_larval_drop || num_xfrms <= 0)
|
||||
if (!(xflo->flags & XFRM_LOOKUP_QUEUE) ||
|
||||
net->xfrm.sysctl_larval_drop ||
|
||||
num_xfrms <= 0)
|
||||
return xdst;
|
||||
|
||||
dst = xflo->dst_orig;
|
||||
dst1 = &xdst->u.dst;
|
||||
dst_hold(dst);
|
||||
xdst->route = dst;
|
||||
@@ -1935,7 +1944,7 @@ static struct flow_cache_object *
|
||||
xfrm_bundle_lookup(struct net *net, const struct flowi *fl, u16 family, u8 dir,
|
||||
struct flow_cache_object *oldflo, void *ctx)
|
||||
{
|
||||
struct dst_entry *dst_orig = (struct dst_entry *)ctx;
|
||||
struct xfrm_flo *xflo = (struct xfrm_flo *)ctx;
|
||||
struct xfrm_policy *pols[XFRM_POLICY_TYPE_MAX];
|
||||
struct xfrm_dst *xdst, *new_xdst;
|
||||
int num_pols = 0, num_xfrms = 0, i, err, pol_dead;
|
||||
@@ -1976,7 +1985,8 @@ xfrm_bundle_lookup(struct net *net, const struct flowi *fl, u16 family, u8 dir,
|
||||
goto make_dummy_bundle;
|
||||
}
|
||||
|
||||
new_xdst = xfrm_resolve_and_create_bundle(pols, num_pols, fl, family, dst_orig);
|
||||
new_xdst = xfrm_resolve_and_create_bundle(pols, num_pols, fl, family,
|
||||
xflo->dst_orig);
|
||||
if (IS_ERR(new_xdst)) {
|
||||
err = PTR_ERR(new_xdst);
|
||||
if (err != -EAGAIN)
|
||||
@@ -2010,7 +2020,7 @@ make_dummy_bundle:
|
||||
/* We found policies, but there's no bundles to instantiate:
|
||||
* either because the policy blocks, has no transformations or
|
||||
* we could not build template (no xfrm_states).*/
|
||||
xdst = xfrm_create_dummy_bundle(net, dst_orig, fl, num_xfrms, family);
|
||||
xdst = xfrm_create_dummy_bundle(net, xflo, fl, num_xfrms, family);
|
||||
if (IS_ERR(xdst)) {
|
||||
xfrm_pols_put(pols, num_pols);
|
||||
return ERR_CAST(xdst);
|
||||
@@ -2104,13 +2114,18 @@ struct dst_entry *xfrm_lookup(struct net *net, struct dst_entry *dst_orig,
|
||||
}
|
||||
|
||||
if (xdst == NULL) {
|
||||
struct xfrm_flo xflo;
|
||||
|
||||
xflo.dst_orig = dst_orig;
|
||||
xflo.flags = flags;
|
||||
|
||||
/* To accelerate a bit... */
|
||||
if ((dst_orig->flags & DST_NOXFRM) ||
|
||||
!net->xfrm.policy_count[XFRM_POLICY_OUT])
|
||||
goto nopol;
|
||||
|
||||
flo = flow_cache_lookup(net, fl, family, dir,
|
||||
xfrm_bundle_lookup, dst_orig);
|
||||
xfrm_bundle_lookup, &xflo);
|
||||
if (flo == NULL)
|
||||
goto nopol;
|
||||
if (IS_ERR(flo)) {
|
||||
@@ -2138,7 +2153,7 @@ struct dst_entry *xfrm_lookup(struct net *net, struct dst_entry *dst_orig,
|
||||
xfrm_pols_put(pols, drop_pols);
|
||||
XFRM_INC_STATS(net, LINUX_MIB_XFRMOUTNOSTATES);
|
||||
|
||||
return make_blackhole(net, family, dst_orig);
|
||||
return ERR_PTR(-EREMOTE);
|
||||
}
|
||||
|
||||
err = -EAGAIN;
|
||||
@@ -2195,6 +2210,23 @@ dropdst:
|
||||
}
|
||||
EXPORT_SYMBOL(xfrm_lookup);
|
||||
|
||||
/* Callers of xfrm_lookup_route() must ensure a call to dst_output().
|
||||
* Otherwise we may send out blackholed packets.
|
||||
*/
|
||||
struct dst_entry *xfrm_lookup_route(struct net *net, struct dst_entry *dst_orig,
|
||||
const struct flowi *fl,
|
||||
struct sock *sk, int flags)
|
||||
{
|
||||
struct dst_entry *dst = xfrm_lookup(net, dst_orig, fl, sk,
|
||||
flags | XFRM_LOOKUP_QUEUE);
|
||||
|
||||
if (IS_ERR(dst) && PTR_ERR(dst) == -EREMOTE)
|
||||
return make_blackhole(net, dst_orig->ops->family, dst_orig);
|
||||
|
||||
return dst;
|
||||
}
|
||||
EXPORT_SYMBOL(xfrm_lookup_route);
|
||||
|
||||
static inline int
|
||||
xfrm_secpath_reject(int idx, struct sk_buff *skb, const struct flowi *fl)
|
||||
{
|
||||
@@ -2460,7 +2492,7 @@ int __xfrm_route_forward(struct sk_buff *skb, unsigned short family)
|
||||
|
||||
skb_dst_force(skb);
|
||||
|
||||
dst = xfrm_lookup(net, skb_dst(skb), &fl, NULL, 0);
|
||||
dst = xfrm_lookup(net, skb_dst(skb), &fl, NULL, XFRM_LOOKUP_QUEUE);
|
||||
if (IS_ERR(dst)) {
|
||||
res = 0;
|
||||
dst = NULL;
|
||||
|
||||
Reference in New Issue
Block a user