Commit 4e00f5d5 authored by David S. Miller's avatar David S. Miller

Merge tag 'batadv-net-for-davem-20180302' of git://git.open-mesh.org/linux-merge

Simon Wunderlich says:

====================
Here are some batman-adv bugfixes:

 - fix skb checksum issues, by Matthias Schiffer (2 patches)

 - fix exception handling when dumping data objects through netlink,
   by Sven Eckelmann (4 patches)

 - fix handling of interface indices, by Sven Eckelmann
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 4a0c7191 f22e0893
...@@ -157,7 +157,7 @@ static void batadv_iv_ogm_orig_free(struct batadv_orig_node *orig_node) ...@@ -157,7 +157,7 @@ static void batadv_iv_ogm_orig_free(struct batadv_orig_node *orig_node)
* Return: 0 on success, a negative error code otherwise. * Return: 0 on success, a negative error code otherwise.
*/ */
static int batadv_iv_ogm_orig_add_if(struct batadv_orig_node *orig_node, static int batadv_iv_ogm_orig_add_if(struct batadv_orig_node *orig_node,
int max_if_num) unsigned int max_if_num)
{ {
void *data_ptr; void *data_ptr;
size_t old_size; size_t old_size;
...@@ -201,7 +201,8 @@ static int batadv_iv_ogm_orig_add_if(struct batadv_orig_node *orig_node, ...@@ -201,7 +201,8 @@ static int batadv_iv_ogm_orig_add_if(struct batadv_orig_node *orig_node,
*/ */
static void static void
batadv_iv_ogm_drop_bcast_own_entry(struct batadv_orig_node *orig_node, batadv_iv_ogm_drop_bcast_own_entry(struct batadv_orig_node *orig_node,
int max_if_num, int del_if_num) unsigned int max_if_num,
unsigned int del_if_num)
{ {
size_t chunk_size; size_t chunk_size;
size_t if_offset; size_t if_offset;
...@@ -239,7 +240,8 @@ batadv_iv_ogm_drop_bcast_own_entry(struct batadv_orig_node *orig_node, ...@@ -239,7 +240,8 @@ batadv_iv_ogm_drop_bcast_own_entry(struct batadv_orig_node *orig_node,
*/ */
static void static void
batadv_iv_ogm_drop_bcast_own_sum_entry(struct batadv_orig_node *orig_node, batadv_iv_ogm_drop_bcast_own_sum_entry(struct batadv_orig_node *orig_node,
int max_if_num, int del_if_num) unsigned int max_if_num,
unsigned int del_if_num)
{ {
size_t if_offset; size_t if_offset;
void *data_ptr; void *data_ptr;
...@@ -276,7 +278,8 @@ batadv_iv_ogm_drop_bcast_own_sum_entry(struct batadv_orig_node *orig_node, ...@@ -276,7 +278,8 @@ batadv_iv_ogm_drop_bcast_own_sum_entry(struct batadv_orig_node *orig_node,
* Return: 0 on success, a negative error code otherwise. * Return: 0 on success, a negative error code otherwise.
*/ */
static int batadv_iv_ogm_orig_del_if(struct batadv_orig_node *orig_node, static int batadv_iv_ogm_orig_del_if(struct batadv_orig_node *orig_node,
int max_if_num, int del_if_num) unsigned int max_if_num,
unsigned int del_if_num)
{ {
spin_lock_bh(&orig_node->bat_iv.ogm_cnt_lock); spin_lock_bh(&orig_node->bat_iv.ogm_cnt_lock);
...@@ -311,7 +314,8 @@ static struct batadv_orig_node * ...@@ -311,7 +314,8 @@ static struct batadv_orig_node *
batadv_iv_ogm_orig_get(struct batadv_priv *bat_priv, const u8 *addr) batadv_iv_ogm_orig_get(struct batadv_priv *bat_priv, const u8 *addr)
{ {
struct batadv_orig_node *orig_node; struct batadv_orig_node *orig_node;
int size, hash_added; int hash_added;
size_t size;
orig_node = batadv_orig_hash_find(bat_priv, addr); orig_node = batadv_orig_hash_find(bat_priv, addr);
if (orig_node) if (orig_node)
...@@ -893,7 +897,7 @@ batadv_iv_ogm_slide_own_bcast_window(struct batadv_hard_iface *hard_iface) ...@@ -893,7 +897,7 @@ batadv_iv_ogm_slide_own_bcast_window(struct batadv_hard_iface *hard_iface)
u32 i; u32 i;
size_t word_index; size_t word_index;
u8 *w; u8 *w;
int if_num; unsigned int if_num;
for (i = 0; i < hash->size; i++) { for (i = 0; i < hash->size; i++) {
head = &hash->table[i]; head = &hash->table[i];
...@@ -1023,7 +1027,7 @@ batadv_iv_ogm_orig_update(struct batadv_priv *bat_priv, ...@@ -1023,7 +1027,7 @@ batadv_iv_ogm_orig_update(struct batadv_priv *bat_priv,
struct batadv_neigh_node *tmp_neigh_node = NULL; struct batadv_neigh_node *tmp_neigh_node = NULL;
struct batadv_neigh_node *router = NULL; struct batadv_neigh_node *router = NULL;
struct batadv_orig_node *orig_node_tmp; struct batadv_orig_node *orig_node_tmp;
int if_num; unsigned int if_num;
u8 sum_orig, sum_neigh; u8 sum_orig, sum_neigh;
u8 *neigh_addr; u8 *neigh_addr;
u8 tq_avg; u8 tq_avg;
...@@ -1182,7 +1186,7 @@ static bool batadv_iv_ogm_calc_tq(struct batadv_orig_node *orig_node, ...@@ -1182,7 +1186,7 @@ static bool batadv_iv_ogm_calc_tq(struct batadv_orig_node *orig_node,
u8 total_count; u8 total_count;
u8 orig_eq_count, neigh_rq_count, neigh_rq_inv, tq_own; u8 orig_eq_count, neigh_rq_count, neigh_rq_inv, tq_own;
unsigned int neigh_rq_inv_cube, neigh_rq_max_cube; unsigned int neigh_rq_inv_cube, neigh_rq_max_cube;
int if_num; unsigned int if_num;
unsigned int tq_asym_penalty, inv_asym_penalty; unsigned int tq_asym_penalty, inv_asym_penalty;
unsigned int combined_tq; unsigned int combined_tq;
unsigned int tq_iface_penalty; unsigned int tq_iface_penalty;
...@@ -1702,9 +1706,9 @@ static void batadv_iv_ogm_process(const struct sk_buff *skb, int ogm_offset, ...@@ -1702,9 +1706,9 @@ static void batadv_iv_ogm_process(const struct sk_buff *skb, int ogm_offset,
if (is_my_orig) { if (is_my_orig) {
unsigned long *word; unsigned long *word;
int offset; size_t offset;
s32 bit_pos; s32 bit_pos;
s16 if_num; unsigned int if_num;
u8 *weight; u8 *weight;
orig_neigh_node = batadv_iv_ogm_orig_get(bat_priv, orig_neigh_node = batadv_iv_ogm_orig_get(bat_priv,
...@@ -2729,7 +2733,7 @@ static int batadv_iv_gw_dump_entry(struct sk_buff *msg, u32 portid, u32 seq, ...@@ -2729,7 +2733,7 @@ static int batadv_iv_gw_dump_entry(struct sk_buff *msg, u32 portid, u32 seq,
struct batadv_neigh_ifinfo *router_ifinfo = NULL; struct batadv_neigh_ifinfo *router_ifinfo = NULL;
struct batadv_neigh_node *router; struct batadv_neigh_node *router;
struct batadv_gw_node *curr_gw; struct batadv_gw_node *curr_gw;
int ret = -EINVAL; int ret = 0;
void *hdr; void *hdr;
router = batadv_orig_router_get(gw_node->orig_node, BATADV_IF_DEFAULT); router = batadv_orig_router_get(gw_node->orig_node, BATADV_IF_DEFAULT);
......
...@@ -928,7 +928,7 @@ static int batadv_v_gw_dump_entry(struct sk_buff *msg, u32 portid, u32 seq, ...@@ -928,7 +928,7 @@ static int batadv_v_gw_dump_entry(struct sk_buff *msg, u32 portid, u32 seq,
struct batadv_neigh_ifinfo *router_ifinfo = NULL; struct batadv_neigh_ifinfo *router_ifinfo = NULL;
struct batadv_neigh_node *router; struct batadv_neigh_node *router;
struct batadv_gw_node *curr_gw; struct batadv_gw_node *curr_gw;
int ret = -EINVAL; int ret = 0;
void *hdr; void *hdr;
router = batadv_orig_router_get(gw_node->orig_node, BATADV_IF_DEFAULT); router = batadv_orig_router_get(gw_node->orig_node, BATADV_IF_DEFAULT);
......
...@@ -2161,22 +2161,25 @@ batadv_bla_claim_dump_bucket(struct sk_buff *msg, u32 portid, u32 seq, ...@@ -2161,22 +2161,25 @@ batadv_bla_claim_dump_bucket(struct sk_buff *msg, u32 portid, u32 seq,
{ {
struct batadv_bla_claim *claim; struct batadv_bla_claim *claim;
int idx = 0; int idx = 0;
int ret = 0;
rcu_read_lock(); rcu_read_lock();
hlist_for_each_entry_rcu(claim, head, hash_entry) { hlist_for_each_entry_rcu(claim, head, hash_entry) {
if (idx++ < *idx_skip) if (idx++ < *idx_skip)
continue; continue;
if (batadv_bla_claim_dump_entry(msg, portid, seq,
primary_if, claim)) { ret = batadv_bla_claim_dump_entry(msg, portid, seq,
primary_if, claim);
if (ret) {
*idx_skip = idx - 1; *idx_skip = idx - 1;
goto unlock; goto unlock;
} }
} }
*idx_skip = idx; *idx_skip = 0;
unlock: unlock:
rcu_read_unlock(); rcu_read_unlock();
return 0; return ret;
} }
/** /**
...@@ -2391,22 +2394,25 @@ batadv_bla_backbone_dump_bucket(struct sk_buff *msg, u32 portid, u32 seq, ...@@ -2391,22 +2394,25 @@ batadv_bla_backbone_dump_bucket(struct sk_buff *msg, u32 portid, u32 seq,
{ {
struct batadv_bla_backbone_gw *backbone_gw; struct batadv_bla_backbone_gw *backbone_gw;
int idx = 0; int idx = 0;
int ret = 0;
rcu_read_lock(); rcu_read_lock();
hlist_for_each_entry_rcu(backbone_gw, head, hash_entry) { hlist_for_each_entry_rcu(backbone_gw, head, hash_entry) {
if (idx++ < *idx_skip) if (idx++ < *idx_skip)
continue; continue;
if (batadv_bla_backbone_dump_entry(msg, portid, seq,
primary_if, backbone_gw)) { ret = batadv_bla_backbone_dump_entry(msg, portid, seq,
primary_if, backbone_gw);
if (ret) {
*idx_skip = idx - 1; *idx_skip = idx - 1;
goto unlock; goto unlock;
} }
} }
*idx_skip = idx; *idx_skip = 0;
unlock: unlock:
rcu_read_unlock(); rcu_read_unlock();
return 0; return ret;
} }
/** /**
......
...@@ -288,7 +288,8 @@ batadv_frag_merge_packets(struct hlist_head *chain) ...@@ -288,7 +288,8 @@ batadv_frag_merge_packets(struct hlist_head *chain)
/* Move the existing MAC header to just before the payload. (Override /* Move the existing MAC header to just before the payload. (Override
* the fragment header.) * the fragment header.)
*/ */
skb_pull_rcsum(skb_out, hdr_size); skb_pull(skb_out, hdr_size);
skb_out->ip_summed = CHECKSUM_NONE;
memmove(skb_out->data - ETH_HLEN, skb_mac_header(skb_out), ETH_HLEN); memmove(skb_out->data - ETH_HLEN, skb_mac_header(skb_out), ETH_HLEN);
skb_set_mac_header(skb_out, -ETH_HLEN); skb_set_mac_header(skb_out, -ETH_HLEN);
skb_reset_network_header(skb_out); skb_reset_network_header(skb_out);
......
...@@ -763,6 +763,11 @@ int batadv_hardif_enable_interface(struct batadv_hard_iface *hard_iface, ...@@ -763,6 +763,11 @@ int batadv_hardif_enable_interface(struct batadv_hard_iface *hard_iface,
hard_iface->soft_iface = soft_iface; hard_iface->soft_iface = soft_iface;
bat_priv = netdev_priv(hard_iface->soft_iface); bat_priv = netdev_priv(hard_iface->soft_iface);
if (bat_priv->num_ifaces >= UINT_MAX) {
ret = -ENOSPC;
goto err_dev;
}
ret = netdev_master_upper_dev_link(hard_iface->net_dev, ret = netdev_master_upper_dev_link(hard_iface->net_dev,
soft_iface, NULL, NULL, NULL); soft_iface, NULL, NULL, NULL);
if (ret) if (ret)
...@@ -876,7 +881,7 @@ void batadv_hardif_disable_interface(struct batadv_hard_iface *hard_iface, ...@@ -876,7 +881,7 @@ void batadv_hardif_disable_interface(struct batadv_hard_iface *hard_iface,
batadv_hardif_recalc_extra_skbroom(hard_iface->soft_iface); batadv_hardif_recalc_extra_skbroom(hard_iface->soft_iface);
/* nobody uses this interface anymore */ /* nobody uses this interface anymore */
if (!bat_priv->num_ifaces) { if (bat_priv->num_ifaces == 0) {
batadv_gw_check_client_stop(bat_priv); batadv_gw_check_client_stop(bat_priv);
if (autodel == BATADV_IF_CLEANUP_AUTO) if (autodel == BATADV_IF_CLEANUP_AUTO)
...@@ -912,7 +917,7 @@ batadv_hardif_add_interface(struct net_device *net_dev) ...@@ -912,7 +917,7 @@ batadv_hardif_add_interface(struct net_device *net_dev)
if (ret) if (ret)
goto free_if; goto free_if;
hard_iface->if_num = -1; hard_iface->if_num = 0;
hard_iface->net_dev = net_dev; hard_iface->net_dev = net_dev;
hard_iface->soft_iface = NULL; hard_iface->soft_iface = NULL;
hard_iface->if_status = BATADV_IF_NOT_IN_USE; hard_iface->if_status = BATADV_IF_NOT_IN_USE;
......
...@@ -1569,7 +1569,7 @@ int batadv_orig_dump(struct sk_buff *msg, struct netlink_callback *cb) ...@@ -1569,7 +1569,7 @@ int batadv_orig_dump(struct sk_buff *msg, struct netlink_callback *cb)
* Return: 0 on success or negative error number in case of failure * Return: 0 on success or negative error number in case of failure
*/ */
int batadv_orig_hash_add_if(struct batadv_hard_iface *hard_iface, int batadv_orig_hash_add_if(struct batadv_hard_iface *hard_iface,
int max_if_num) unsigned int max_if_num)
{ {
struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface); struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
struct batadv_algo_ops *bao = bat_priv->algo_ops; struct batadv_algo_ops *bao = bat_priv->algo_ops;
...@@ -1611,7 +1611,7 @@ int batadv_orig_hash_add_if(struct batadv_hard_iface *hard_iface, ...@@ -1611,7 +1611,7 @@ int batadv_orig_hash_add_if(struct batadv_hard_iface *hard_iface,
* Return: 0 on success or negative error number in case of failure * Return: 0 on success or negative error number in case of failure
*/ */
int batadv_orig_hash_del_if(struct batadv_hard_iface *hard_iface, int batadv_orig_hash_del_if(struct batadv_hard_iface *hard_iface,
int max_if_num) unsigned int max_if_num)
{ {
struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface); struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
struct batadv_hashtable *hash = bat_priv->orig_hash; struct batadv_hashtable *hash = bat_priv->orig_hash;
......
...@@ -73,9 +73,9 @@ int batadv_orig_seq_print_text(struct seq_file *seq, void *offset); ...@@ -73,9 +73,9 @@ int batadv_orig_seq_print_text(struct seq_file *seq, void *offset);
int batadv_orig_dump(struct sk_buff *msg, struct netlink_callback *cb); int batadv_orig_dump(struct sk_buff *msg, struct netlink_callback *cb);
int batadv_orig_hardif_seq_print_text(struct seq_file *seq, void *offset); int batadv_orig_hardif_seq_print_text(struct seq_file *seq, void *offset);
int batadv_orig_hash_add_if(struct batadv_hard_iface *hard_iface, int batadv_orig_hash_add_if(struct batadv_hard_iface *hard_iface,
int max_if_num); unsigned int max_if_num);
int batadv_orig_hash_del_if(struct batadv_hard_iface *hard_iface, int batadv_orig_hash_del_if(struct batadv_hard_iface *hard_iface,
int max_if_num); unsigned int max_if_num);
struct batadv_orig_node_vlan * struct batadv_orig_node_vlan *
batadv_orig_node_vlan_new(struct batadv_orig_node *orig_node, batadv_orig_node_vlan_new(struct batadv_orig_node *orig_node,
unsigned short vid); unsigned short vid);
......
...@@ -459,13 +459,7 @@ void batadv_interface_rx(struct net_device *soft_iface, ...@@ -459,13 +459,7 @@ void batadv_interface_rx(struct net_device *soft_iface,
/* skb->dev & skb->pkt_type are set here */ /* skb->dev & skb->pkt_type are set here */
skb->protocol = eth_type_trans(skb, soft_iface); skb->protocol = eth_type_trans(skb, soft_iface);
skb_postpull_rcsum(skb, eth_hdr(skb), ETH_HLEN);
/* should not be necessary anymore as we use skb_pull_rcsum()
* TODO: please verify this and remove this TODO
* -- Dec 21st 2009, Simon Wunderlich
*/
/* skb->ip_summed = CHECKSUM_UNNECESSARY; */
batadv_inc_counter(bat_priv, BATADV_CNT_RX); batadv_inc_counter(bat_priv, BATADV_CNT_RX);
batadv_add_counter(bat_priv, BATADV_CNT_RX_BYTES, batadv_add_counter(bat_priv, BATADV_CNT_RX_BYTES,
......
...@@ -167,7 +167,7 @@ struct batadv_hard_iface { ...@@ -167,7 +167,7 @@ struct batadv_hard_iface {
struct list_head list; struct list_head list;
/** @if_num: identificator of the interface */ /** @if_num: identificator of the interface */
s16 if_num; unsigned int if_num;
/** @if_status: status of the interface for batman-adv */ /** @if_status: status of the interface for batman-adv */
char if_status; char if_status;
...@@ -1596,7 +1596,7 @@ struct batadv_priv { ...@@ -1596,7 +1596,7 @@ struct batadv_priv {
atomic_t batman_queue_left; atomic_t batman_queue_left;
/** @num_ifaces: number of interfaces assigned to this mesh interface */ /** @num_ifaces: number of interfaces assigned to this mesh interface */
char num_ifaces; unsigned int num_ifaces;
/** @mesh_obj: kobject for sysfs mesh subdirectory */ /** @mesh_obj: kobject for sysfs mesh subdirectory */
struct kobject *mesh_obj; struct kobject *mesh_obj;
...@@ -2186,15 +2186,16 @@ struct batadv_algo_orig_ops { ...@@ -2186,15 +2186,16 @@ struct batadv_algo_orig_ops {
* orig_node due to a new hard-interface being added into the mesh * orig_node due to a new hard-interface being added into the mesh
* (optional) * (optional)
*/ */
int (*add_if)(struct batadv_orig_node *orig_node, int max_if_num); int (*add_if)(struct batadv_orig_node *orig_node,
unsigned int max_if_num);
/** /**
* @del_if: ask the routing algorithm to apply the needed changes to the * @del_if: ask the routing algorithm to apply the needed changes to the
* orig_node due to an hard-interface being removed from the mesh * orig_node due to an hard-interface being removed from the mesh
* (optional) * (optional)
*/ */
int (*del_if)(struct batadv_orig_node *orig_node, int max_if_num, int (*del_if)(struct batadv_orig_node *orig_node,
int del_if_num); unsigned int max_if_num, unsigned int del_if_num);
#ifdef CONFIG_BATMAN_ADV_DEBUGFS #ifdef CONFIG_BATMAN_ADV_DEBUGFS
/** @print: print the originator table (optional) */ /** @print: print the originator table (optional) */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment