Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Minor conflict in net/core/rtnetlink.c, David Ahern's bug fix in 'net' overlapped the renaming of a netlink attribute in net-next. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -609,16 +609,18 @@ static int tipc_l2_device_event(struct notifier_block *nb, unsigned long evt,
|
||||
|
||||
switch (evt) {
|
||||
case NETDEV_CHANGE:
|
||||
if (netif_carrier_ok(dev))
|
||||
if (netif_carrier_ok(dev) && netif_oper_up(dev)) {
|
||||
test_and_set_bit_lock(0, &b->up);
|
||||
break;
|
||||
/* else: fall through */
|
||||
case NETDEV_UP:
|
||||
test_and_set_bit_lock(0, &b->up);
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
case NETDEV_GOING_DOWN:
|
||||
clear_bit_unlock(0, &b->up);
|
||||
tipc_reset_bearer(net, b);
|
||||
break;
|
||||
case NETDEV_UP:
|
||||
test_and_set_bit_lock(0, &b->up);
|
||||
break;
|
||||
case NETDEV_CHANGEMTU:
|
||||
if (tipc_mtu_bad(dev, 0)) {
|
||||
bearer_disable(net, b);
|
||||
|
@@ -410,6 +410,11 @@ char *tipc_link_name(struct tipc_link *l)
|
||||
return l->name;
|
||||
}
|
||||
|
||||
u32 tipc_link_state(struct tipc_link *l)
|
||||
{
|
||||
return l->state;
|
||||
}
|
||||
|
||||
/**
|
||||
* tipc_link_create - create a new link
|
||||
* @n: pointer to associated node
|
||||
@@ -841,9 +846,14 @@ void tipc_link_reset(struct tipc_link *l)
|
||||
l->in_session = false;
|
||||
l->session++;
|
||||
l->mtu = l->advertised_mtu;
|
||||
spin_lock_bh(&l->wakeupq.lock);
|
||||
spin_lock_bh(&l->inputq->lock);
|
||||
skb_queue_splice_init(&l->wakeupq, l->inputq);
|
||||
spin_unlock_bh(&l->inputq->lock);
|
||||
spin_unlock_bh(&l->wakeupq.lock);
|
||||
|
||||
__skb_queue_purge(&l->transmq);
|
||||
__skb_queue_purge(&l->deferdq);
|
||||
skb_queue_splice_init(&l->wakeupq, l->inputq);
|
||||
__skb_queue_purge(&l->backlogq);
|
||||
l->backlog[TIPC_LOW_IMPORTANCE].len = 0;
|
||||
l->backlog[TIPC_MEDIUM_IMPORTANCE].len = 0;
|
||||
@@ -1380,6 +1390,36 @@ static void tipc_link_build_proto_msg(struct tipc_link *l, int mtyp, bool probe,
|
||||
__skb_queue_tail(xmitq, skb);
|
||||
}
|
||||
|
||||
void tipc_link_create_dummy_tnl_msg(struct tipc_link *l,
|
||||
struct sk_buff_head *xmitq)
|
||||
{
|
||||
u32 onode = tipc_own_addr(l->net);
|
||||
struct tipc_msg *hdr, *ihdr;
|
||||
struct sk_buff_head tnlq;
|
||||
struct sk_buff *skb;
|
||||
u32 dnode = l->addr;
|
||||
|
||||
skb_queue_head_init(&tnlq);
|
||||
skb = tipc_msg_create(TUNNEL_PROTOCOL, FAILOVER_MSG,
|
||||
INT_H_SIZE, BASIC_H_SIZE,
|
||||
dnode, onode, 0, 0, 0);
|
||||
if (!skb) {
|
||||
pr_warn("%sunable to create tunnel packet\n", link_co_err);
|
||||
return;
|
||||
}
|
||||
|
||||
hdr = buf_msg(skb);
|
||||
msg_set_msgcnt(hdr, 1);
|
||||
msg_set_bearer_id(hdr, l->peer_bearer_id);
|
||||
|
||||
ihdr = (struct tipc_msg *)msg_data(hdr);
|
||||
tipc_msg_init(onode, ihdr, TIPC_LOW_IMPORTANCE, TIPC_DIRECT_MSG,
|
||||
BASIC_H_SIZE, dnode);
|
||||
msg_set_errcode(ihdr, TIPC_ERR_NO_PORT);
|
||||
__skb_queue_tail(&tnlq, skb);
|
||||
tipc_link_xmit(l, &tnlq, xmitq);
|
||||
}
|
||||
|
||||
/* tipc_link_tnl_prepare(): prepare and return a list of tunnel packets
|
||||
* with contents of the link's transmit and backlog queues.
|
||||
*/
|
||||
@@ -1476,6 +1516,9 @@ bool tipc_link_validate_msg(struct tipc_link *l, struct tipc_msg *hdr)
|
||||
return false;
|
||||
if (session != curr_session)
|
||||
return false;
|
||||
/* Extra sanity check */
|
||||
if (!link_is_up(l) && msg_ack(hdr))
|
||||
return false;
|
||||
if (!(l->peer_caps & TIPC_LINK_PROTO_SEQNO))
|
||||
return true;
|
||||
/* Accept only STATE with new sequence number */
|
||||
|
@@ -88,6 +88,8 @@ bool tipc_link_bc_create(struct net *net, u32 ownnode, u32 peer,
|
||||
struct tipc_link **link);
|
||||
void tipc_link_tnl_prepare(struct tipc_link *l, struct tipc_link *tnl,
|
||||
int mtyp, struct sk_buff_head *xmitq);
|
||||
void tipc_link_create_dummy_tnl_msg(struct tipc_link *tnl,
|
||||
struct sk_buff_head *xmitq);
|
||||
void tipc_link_build_reset_msg(struct tipc_link *l, struct sk_buff_head *xmitq);
|
||||
int tipc_link_fsm_evt(struct tipc_link *l, int evt);
|
||||
bool tipc_link_is_up(struct tipc_link *l);
|
||||
@@ -107,6 +109,7 @@ u16 tipc_link_rcv_nxt(struct tipc_link *l);
|
||||
u16 tipc_link_acked(struct tipc_link *l);
|
||||
u32 tipc_link_id(struct tipc_link *l);
|
||||
char *tipc_link_name(struct tipc_link *l);
|
||||
u32 tipc_link_state(struct tipc_link *l);
|
||||
char tipc_link_plane(struct tipc_link *l);
|
||||
int tipc_link_prio(struct tipc_link *l);
|
||||
int tipc_link_window(struct tipc_link *l);
|
||||
|
@@ -111,6 +111,7 @@ struct tipc_node {
|
||||
int action_flags;
|
||||
struct list_head list;
|
||||
int state;
|
||||
bool failover_sent;
|
||||
u16 sync_point;
|
||||
int link_cnt;
|
||||
u16 working_links;
|
||||
@@ -680,6 +681,7 @@ static void __tipc_node_link_up(struct tipc_node *n, int bearer_id,
|
||||
*slot0 = bearer_id;
|
||||
*slot1 = bearer_id;
|
||||
tipc_node_fsm_evt(n, SELF_ESTABL_CONTACT_EVT);
|
||||
n->failover_sent = false;
|
||||
n->action_flags |= TIPC_NOTIFY_NODE_UP;
|
||||
tipc_link_set_active(nl, true);
|
||||
tipc_bcast_add_peer(n->net, nl, xmitq);
|
||||
@@ -911,6 +913,7 @@ void tipc_node_check_dest(struct net *net, u32 addr,
|
||||
bool reset = true;
|
||||
char *if_name;
|
||||
unsigned long intv;
|
||||
u16 session;
|
||||
|
||||
*dupl_addr = false;
|
||||
*respond = false;
|
||||
@@ -997,9 +1000,10 @@ void tipc_node_check_dest(struct net *net, u32 addr,
|
||||
goto exit;
|
||||
|
||||
if_name = strchr(b->name, ':') + 1;
|
||||
get_random_bytes(&session, sizeof(u16));
|
||||
if (!tipc_link_create(net, if_name, b->identity, b->tolerance,
|
||||
b->net_plane, b->mtu, b->priority,
|
||||
b->window, mod(tipc_net(net)->random),
|
||||
b->window, session,
|
||||
tipc_own_addr(net), addr, peer_id,
|
||||
n->capabilities,
|
||||
tipc_bc_sndlink(n->net), n->bc_entry.link,
|
||||
@@ -1615,6 +1619,14 @@ static bool tipc_node_check_state(struct tipc_node *n, struct sk_buff *skb,
|
||||
tipc_skb_queue_splice_tail_init(tipc_link_inputq(pl),
|
||||
tipc_link_inputq(l));
|
||||
}
|
||||
/* If parallel link was already down, and this happened before
|
||||
* the tunnel link came up, FAILOVER was never sent. Ensure that
|
||||
* FAILOVER is sent to get peer out of NODE_FAILINGOVER state.
|
||||
*/
|
||||
if (n->state != NODE_FAILINGOVER && !n->failover_sent) {
|
||||
tipc_link_create_dummy_tnl_msg(l, xmitq);
|
||||
n->failover_sent = true;
|
||||
}
|
||||
/* If pkts arrive out of order, use lowest calculated syncpt */
|
||||
if (less(syncpt, n->sync_point))
|
||||
n->sync_point = syncpt;
|
||||
|
@@ -1424,8 +1424,10 @@ static int __tipc_sendstream(struct socket *sock, struct msghdr *m, size_t dlen)
|
||||
/* Handle implicit connection setup */
|
||||
if (unlikely(dest)) {
|
||||
rc = __tipc_sendmsg(sock, m, dlen);
|
||||
if (dlen && (dlen == rc))
|
||||
if (dlen && dlen == rc) {
|
||||
tsk->peer_caps = tipc_node_get_capabilities(net, dnode);
|
||||
tsk->snt_unacked = tsk_inc(tsk, dlen + msg_hdr_sz(hdr));
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user