forked from mirrors/linux
		
	neighbor: Add protocol attribute
Similar to routes and rules, add protocol attribute to neighbor entries for easier tracking of how each was created. Signed-off-by: David Ahern <dsahern@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									11fb60d108
								
							
						
					
					
						commit
						df9b0e30d4
					
				
					 3 changed files with 26 additions and 1 deletions
				
			
		| 
						 | 
					@ -149,6 +149,7 @@ struct neighbour {
 | 
				
			||||||
	__u8			nud_state;
 | 
						__u8			nud_state;
 | 
				
			||||||
	__u8			type;
 | 
						__u8			type;
 | 
				
			||||||
	__u8			dead;
 | 
						__u8			dead;
 | 
				
			||||||
 | 
						u8			protocol;
 | 
				
			||||||
	seqlock_t		ha_lock;
 | 
						seqlock_t		ha_lock;
 | 
				
			||||||
	unsigned char		ha[ALIGN(MAX_ADDR_LEN, sizeof(unsigned long))] __aligned(8);
 | 
						unsigned char		ha[ALIGN(MAX_ADDR_LEN, sizeof(unsigned long))] __aligned(8);
 | 
				
			||||||
	struct hh_cache		hh;
 | 
						struct hh_cache		hh;
 | 
				
			||||||
| 
						 | 
					@ -173,6 +174,7 @@ struct pneigh_entry {
 | 
				
			||||||
	possible_net_t		net;
 | 
						possible_net_t		net;
 | 
				
			||||||
	struct net_device	*dev;
 | 
						struct net_device	*dev;
 | 
				
			||||||
	u8			flags;
 | 
						u8			flags;
 | 
				
			||||||
 | 
						u8			protocol;
 | 
				
			||||||
	u8			key[0];
 | 
						u8			key[0];
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -28,6 +28,7 @@ enum {
 | 
				
			||||||
	NDA_MASTER,
 | 
						NDA_MASTER,
 | 
				
			||||||
	NDA_LINK_NETNSID,
 | 
						NDA_LINK_NETNSID,
 | 
				
			||||||
	NDA_SRC_VNI,
 | 
						NDA_SRC_VNI,
 | 
				
			||||||
 | 
						NDA_PROTOCOL,  /* Originator of entry */
 | 
				
			||||||
	__NDA_MAX
 | 
						__NDA_MAX
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1828,6 +1828,7 @@ static int neigh_add(struct sk_buff *skb, struct nlmsghdr *nlh,
 | 
				
			||||||
	struct net_device *dev = NULL;
 | 
						struct net_device *dev = NULL;
 | 
				
			||||||
	struct neighbour *neigh;
 | 
						struct neighbour *neigh;
 | 
				
			||||||
	void *dst, *lladdr;
 | 
						void *dst, *lladdr;
 | 
				
			||||||
 | 
						u8 protocol = 0;
 | 
				
			||||||
	int err;
 | 
						int err;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ASSERT_RTNL();
 | 
						ASSERT_RTNL();
 | 
				
			||||||
| 
						 | 
					@ -1867,6 +1868,14 @@ static int neigh_add(struct sk_buff *skb, struct nlmsghdr *nlh,
 | 
				
			||||||
	dst = nla_data(tb[NDA_DST]);
 | 
						dst = nla_data(tb[NDA_DST]);
 | 
				
			||||||
	lladdr = tb[NDA_LLADDR] ? nla_data(tb[NDA_LLADDR]) : NULL;
 | 
						lladdr = tb[NDA_LLADDR] ? nla_data(tb[NDA_LLADDR]) : NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (tb[NDA_PROTOCOL]) {
 | 
				
			||||||
 | 
							if (nla_len(tb[NDA_PROTOCOL]) != sizeof(u8)) {
 | 
				
			||||||
 | 
								NL_SET_ERR_MSG(extack, "Invalid protocol attribute");
 | 
				
			||||||
 | 
								goto out;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							protocol = nla_get_u8(tb[NDA_PROTOCOL]);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (ndm->ndm_flags & NTF_PROXY) {
 | 
						if (ndm->ndm_flags & NTF_PROXY) {
 | 
				
			||||||
		struct pneigh_entry *pn;
 | 
							struct pneigh_entry *pn;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1874,6 +1883,8 @@ static int neigh_add(struct sk_buff *skb, struct nlmsghdr *nlh,
 | 
				
			||||||
		pn = pneigh_lookup(tbl, net, dst, dev, 1);
 | 
							pn = pneigh_lookup(tbl, net, dst, dev, 1);
 | 
				
			||||||
		if (pn) {
 | 
							if (pn) {
 | 
				
			||||||
			pn->flags = ndm->ndm_flags;
 | 
								pn->flags = ndm->ndm_flags;
 | 
				
			||||||
 | 
								if (protocol)
 | 
				
			||||||
 | 
									pn->protocol = protocol;
 | 
				
			||||||
			err = 0;
 | 
								err = 0;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		goto out;
 | 
							goto out;
 | 
				
			||||||
| 
						 | 
					@ -1924,6 +1935,10 @@ static int neigh_add(struct sk_buff *skb, struct nlmsghdr *nlh,
 | 
				
			||||||
	} else
 | 
						} else
 | 
				
			||||||
		err = __neigh_update(neigh, lladdr, ndm->ndm_state, flags,
 | 
							err = __neigh_update(neigh, lladdr, ndm->ndm_state, flags,
 | 
				
			||||||
				     NETLINK_CB(skb).portid, extack);
 | 
									     NETLINK_CB(skb).portid, extack);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (protocol)
 | 
				
			||||||
 | 
							neigh->protocol = protocol;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	neigh_release(neigh);
 | 
						neigh_release(neigh);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
out:
 | 
					out:
 | 
				
			||||||
| 
						 | 
					@ -2417,6 +2432,9 @@ static int neigh_fill_info(struct sk_buff *skb, struct neighbour *neigh,
 | 
				
			||||||
	    nla_put(skb, NDA_CACHEINFO, sizeof(ci), &ci))
 | 
						    nla_put(skb, NDA_CACHEINFO, sizeof(ci), &ci))
 | 
				
			||||||
		goto nla_put_failure;
 | 
							goto nla_put_failure;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (neigh->protocol && nla_put_u8(skb, NDA_PROTOCOL, neigh->protocol))
 | 
				
			||||||
 | 
							goto nla_put_failure;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	nlmsg_end(skb, nlh);
 | 
						nlmsg_end(skb, nlh);
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2448,6 +2466,9 @@ static int pneigh_fill_info(struct sk_buff *skb, struct pneigh_entry *pn,
 | 
				
			||||||
	if (nla_put(skb, NDA_DST, tbl->key_len, pn->key))
 | 
						if (nla_put(skb, NDA_DST, tbl->key_len, pn->key))
 | 
				
			||||||
		goto nla_put_failure;
 | 
							goto nla_put_failure;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (pn->protocol && nla_put_u8(skb, NDA_PROTOCOL, pn->protocol))
 | 
				
			||||||
 | 
							goto nla_put_failure;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	nlmsg_end(skb, nlh);
 | 
						nlmsg_end(skb, nlh);
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3103,7 +3124,8 @@ static inline size_t neigh_nlmsg_size(void)
 | 
				
			||||||
	       + nla_total_size(MAX_ADDR_LEN) /* NDA_DST */
 | 
						       + nla_total_size(MAX_ADDR_LEN) /* NDA_DST */
 | 
				
			||||||
	       + nla_total_size(MAX_ADDR_LEN) /* NDA_LLADDR */
 | 
						       + nla_total_size(MAX_ADDR_LEN) /* NDA_LLADDR */
 | 
				
			||||||
	       + nla_total_size(sizeof(struct nda_cacheinfo))
 | 
						       + nla_total_size(sizeof(struct nda_cacheinfo))
 | 
				
			||||||
	       + nla_total_size(4); /* NDA_PROBES */
 | 
						       + nla_total_size(4)  /* NDA_PROBES */
 | 
				
			||||||
 | 
						       + nla_total_size(1); /* NDA_PROTOCOL */
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void __neigh_notify(struct neighbour *n, int type, int flags,
 | 
					static void __neigh_notify(struct neighbour *n, int type, int flags,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue