All of lore.kernel.org
 help / color / mirror / Atom feed
From: kernel test robot <lkp@intel.com>
To: kbuild@lists.01.org
Subject: [android-goldfish:android-3.18 15022/17854] net/core/flow_dissector.c:303:12: warning: Variable 'key_basic' is reassigned a value before the old one has been used. 'break; '
Date: Sat, 20 Feb 2021 07:27:52 +0800	[thread overview]
Message-ID: <202102200737.72PYuHSA-lkp@intel.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 19058 bytes --]

CC: kbuild-all(a)lists.01.org
TO: "Greg Kroah-Hartman" <gregkh@linuxfoundation.org>

tree:   https://android.googlesource.com/kernel/goldfish android-3.18
head:   fa7316c94fad2b143fe78cb0af113aec5e8a2a8a
commit: bb484c80792f7b566184aab3c2d6ee528d950e94 [15022/17854] flow_dissect: use programable dissector in skb_flow_dissect and friends
:::::: branch date: 3 days ago
:::::: commit date: 9 months ago
compiler: arceb-elf-gcc (GCC) 9.3.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>


cppcheck possible warnings: (new ones prefixed by >>, may not real problems)

>> net/core/flow_dissector.c:303:12: warning: Variable 'key_basic' is reassigned a value before the old one has been used. 'break;' missing? [redundantAssignInSwitch]
    key_basic = skb_flow_dissector_target(flow_dissector,
              ^
   net/core/flow_dissector.c:137:12: note: Variable 'key_basic' is reassigned a value before the old one has been used. 'break;' missing?
    key_basic = skb_flow_dissector_target(flow_dissector,
              ^
   net/core/flow_dissector.c:303:12: note: Variable 'key_basic' is reassigned a value before the old one has been used. 'break;' missing?
    key_basic = skb_flow_dissector_target(flow_dissector,
              ^

vim +303 net/core/flow_dissector.c

357afe9c46c951 Nikolay Aleksandrov 2013-10-02  100  
453a940ea725d6 WANG Cong           2014-08-25  101  /**
453a940ea725d6 WANG Cong           2014-08-25  102   * __skb_flow_dissect - extract the flow_keys struct and return it
453a940ea725d6 WANG Cong           2014-08-25  103   * @skb: sk_buff to extract the flow from, can be NULL if the rest are specified
bb484c80792f7b Jiri Pirko          2015-05-12  104   * @flow_dissector: list of keys to dissect
bb484c80792f7b Jiri Pirko          2015-05-12  105   * @target_container: target structure to put dissected values into
453a940ea725d6 WANG Cong           2014-08-25  106   * @data: raw buffer pointer to the packet, if NULL use skb->data
453a940ea725d6 WANG Cong           2014-08-25  107   * @proto: protocol for which to get the flow, if @data is NULL use skb->protocol
453a940ea725d6 WANG Cong           2014-08-25  108   * @nhoff: network header offset, if @data is NULL use skb_network_offset(skb)
453a940ea725d6 WANG Cong           2014-08-25  109   * @hlen: packet header length, if @data is NULL use skb_headlen(skb)
453a940ea725d6 WANG Cong           2014-08-25  110   *
bb484c80792f7b Jiri Pirko          2015-05-12  111   * The function will try to retrieve individual keys into target specified
bb484c80792f7b Jiri Pirko          2015-05-12  112   * by flow_dissector from either the skbuff or a raw buffer specified by the
bb484c80792f7b Jiri Pirko          2015-05-12  113   * rest parameters.
bb484c80792f7b Jiri Pirko          2015-05-12  114   *
bb484c80792f7b Jiri Pirko          2015-05-12  115   * Caller must take care of zeroing target container memory.
453a940ea725d6 WANG Cong           2014-08-25  116   */
bb484c80792f7b Jiri Pirko          2015-05-12  117  bool __skb_flow_dissect(const struct sk_buff *skb,
bb484c80792f7b Jiri Pirko          2015-05-12  118  			struct flow_dissector *flow_dissector,
bb484c80792f7b Jiri Pirko          2015-05-12  119  			void *target_container,
453a940ea725d6 WANG Cong           2014-08-25  120  			void *data, __be16 proto, int nhoff, int hlen)
0744dd00c1b1be Eric Dumazet        2011-11-28  121  {
bb484c80792f7b Jiri Pirko          2015-05-12  122  	struct flow_dissector_key_basic *key_basic;
bb484c80792f7b Jiri Pirko          2015-05-12  123  	struct flow_dissector_key_addrs *key_addrs;
bb484c80792f7b Jiri Pirko          2015-05-12  124  	struct flow_dissector_key_ports *key_ports;
0744dd00c1b1be Eric Dumazet        2011-11-28  125  	u8 ip_proto;
0744dd00c1b1be Eric Dumazet        2011-11-28  126  
690e36e726d00d David S. Miller     2014-08-23  127  	if (!data) {
690e36e726d00d David S. Miller     2014-08-23  128  		data = skb->data;
453a940ea725d6 WANG Cong           2014-08-25  129  		proto = skb->protocol;
453a940ea725d6 WANG Cong           2014-08-25  130  		nhoff = skb_network_offset(skb);
690e36e726d00d David S. Miller     2014-08-23  131  		hlen = skb_headlen(skb);
690e36e726d00d David S. Miller     2014-08-23  132  	}
690e36e726d00d David S. Miller     2014-08-23  133  
bb484c80792f7b Jiri Pirko          2015-05-12  134  	/* It is ensured by skb_flow_dissector_init() that basic key will
bb484c80792f7b Jiri Pirko          2015-05-12  135  	 * be always present.
bb484c80792f7b Jiri Pirko          2015-05-12  136  	 */
bb484c80792f7b Jiri Pirko          2015-05-12  137  	key_basic = skb_flow_dissector_target(flow_dissector,
bb484c80792f7b Jiri Pirko          2015-05-12  138  					      FLOW_DISSECTOR_KEY_BASIC,
bb484c80792f7b Jiri Pirko          2015-05-12  139  					      target_container);
0744dd00c1b1be Eric Dumazet        2011-11-28  140  
0744dd00c1b1be Eric Dumazet        2011-11-28  141  again:
0744dd00c1b1be Eric Dumazet        2011-11-28  142  	switch (proto) {
2b8837aeaaa0bb Joe Perches         2014-03-12  143  	case htons(ETH_P_IP): {
0744dd00c1b1be Eric Dumazet        2011-11-28  144  		const struct iphdr *iph;
0744dd00c1b1be Eric Dumazet        2011-11-28  145  		struct iphdr _iph;
0744dd00c1b1be Eric Dumazet        2011-11-28  146  ip:
690e36e726d00d David S. Miller     2014-08-23  147  		iph = __skb_header_pointer(skb, nhoff, sizeof(_iph), data, hlen, &_iph);
6f092343855a71 Jason Wang          2013-11-01  148  		if (!iph || iph->ihl < 5)
0744dd00c1b1be Eric Dumazet        2011-11-28  149  			return false;
3797d3e8462efd Eric Dumazet        2013-11-07  150  		nhoff += iph->ihl * 4;
0744dd00c1b1be Eric Dumazet        2011-11-28  151  
3797d3e8462efd Eric Dumazet        2013-11-07  152  		ip_proto = iph->protocol;
0744dd00c1b1be Eric Dumazet        2011-11-28  153  		if (ip_is_fragment(iph))
0744dd00c1b1be Eric Dumazet        2011-11-28  154  			ip_proto = 0;
3797d3e8462efd Eric Dumazet        2013-11-07  155  
bb484c80792f7b Jiri Pirko          2015-05-12  156  		if (!skb_flow_dissector_uses_key(flow_dissector,
bb484c80792f7b Jiri Pirko          2015-05-12  157  						 FLOW_DISSECTOR_KEY_IPV4_ADDRS))
5af7fb6e3e92c2 Alexander Duyck     2014-10-10  158  			break;
bb484c80792f7b Jiri Pirko          2015-05-12  159  		key_addrs = skb_flow_dissector_target(flow_dissector,
bb484c80792f7b Jiri Pirko          2015-05-12  160  						      FLOW_DISSECTOR_KEY_IPV4_ADDRS,
bb484c80792f7b Jiri Pirko          2015-05-12  161  						      target_container);
bb484c80792f7b Jiri Pirko          2015-05-12  162  		memcpy(key_addrs, &iph->saddr, sizeof(*key_addrs));
0744dd00c1b1be Eric Dumazet        2011-11-28  163  		break;
0744dd00c1b1be Eric Dumazet        2011-11-28  164  	}
2b8837aeaaa0bb Joe Perches         2014-03-12  165  	case htons(ETH_P_IPV6): {
0744dd00c1b1be Eric Dumazet        2011-11-28  166  		const struct ipv6hdr *iph;
0744dd00c1b1be Eric Dumazet        2011-11-28  167  		struct ipv6hdr _iph;
19469a873bafd4 Tom Herbert         2014-07-01  168  		__be32 flow_label;
19469a873bafd4 Tom Herbert         2014-07-01  169  
0744dd00c1b1be Eric Dumazet        2011-11-28  170  ipv6:
690e36e726d00d David S. Miller     2014-08-23  171  		iph = __skb_header_pointer(skb, nhoff, sizeof(_iph), data, hlen, &_iph);
0744dd00c1b1be Eric Dumazet        2011-11-28  172  		if (!iph)
0744dd00c1b1be Eric Dumazet        2011-11-28  173  			return false;
0744dd00c1b1be Eric Dumazet        2011-11-28  174  
0744dd00c1b1be Eric Dumazet        2011-11-28  175  		ip_proto = iph->nexthdr;
0744dd00c1b1be Eric Dumazet        2011-11-28  176  		nhoff += sizeof(struct ipv6hdr);
19469a873bafd4 Tom Herbert         2014-07-01  177  
bb484c80792f7b Jiri Pirko          2015-05-12  178  		if (!skb_flow_dissector_uses_key(flow_dissector,
bb484c80792f7b Jiri Pirko          2015-05-12  179  						 FLOW_DISSECTOR_KEY_IPV6_HASH_ADDRS))
56193d1bce2b27 Alexander Duyck     2014-09-05  180  			break;
bb484c80792f7b Jiri Pirko          2015-05-12  181  		key_addrs = skb_flow_dissector_target(flow_dissector,
bb484c80792f7b Jiri Pirko          2015-05-12  182  						      FLOW_DISSECTOR_KEY_IPV6_HASH_ADDRS,
bb484c80792f7b Jiri Pirko          2015-05-12  183  						      target_container);
56193d1bce2b27 Alexander Duyck     2014-09-05  184  
bb484c80792f7b Jiri Pirko          2015-05-12  185  		key_addrs->src = (__force __be32)ipv6_addr_hash(&iph->saddr);
bb484c80792f7b Jiri Pirko          2015-05-12  186  		key_addrs->dst = (__force __be32)ipv6_addr_hash(&iph->daddr);
5af7fb6e3e92c2 Alexander Duyck     2014-10-10  187  
19469a873bafd4 Tom Herbert         2014-07-01  188  		flow_label = ip6_flowlabel(iph);
19469a873bafd4 Tom Herbert         2014-07-01  189  		if (flow_label) {
19469a873bafd4 Tom Herbert         2014-07-01  190  			/* Awesome, IPv6 packet has a flow label so we can
19469a873bafd4 Tom Herbert         2014-07-01  191  			 * use that to represent the ports without any
19469a873bafd4 Tom Herbert         2014-07-01  192  			 * further dissection.
19469a873bafd4 Tom Herbert         2014-07-01  193  			 */
bb484c80792f7b Jiri Pirko          2015-05-12  194  
bb484c80792f7b Jiri Pirko          2015-05-12  195  			key_basic->n_proto = proto;
bb484c80792f7b Jiri Pirko          2015-05-12  196  			key_basic->ip_proto = ip_proto;
bb484c80792f7b Jiri Pirko          2015-05-12  197  			key_basic->thoff = (u16)nhoff;
bb484c80792f7b Jiri Pirko          2015-05-12  198  
bb484c80792f7b Jiri Pirko          2015-05-12  199  			if (!skb_flow_dissector_uses_key(flow_dissector,
bb484c80792f7b Jiri Pirko          2015-05-12  200  							 FLOW_DISSECTOR_KEY_PORTS))
bb484c80792f7b Jiri Pirko          2015-05-12  201  				break;
bb484c80792f7b Jiri Pirko          2015-05-12  202  			key_ports = skb_flow_dissector_target(flow_dissector,
bb484c80792f7b Jiri Pirko          2015-05-12  203  							      FLOW_DISSECTOR_KEY_PORTS,
bb484c80792f7b Jiri Pirko          2015-05-12  204  							      target_container);
bb484c80792f7b Jiri Pirko          2015-05-12  205  			key_ports->ports = flow_label;
19469a873bafd4 Tom Herbert         2014-07-01  206  
19469a873bafd4 Tom Herbert         2014-07-01  207  			return true;
19469a873bafd4 Tom Herbert         2014-07-01  208  		}
19469a873bafd4 Tom Herbert         2014-07-01  209  
0744dd00c1b1be Eric Dumazet        2011-11-28  210  		break;
0744dd00c1b1be Eric Dumazet        2011-11-28  211  	}
2b8837aeaaa0bb Joe Perches         2014-03-12  212  	case htons(ETH_P_8021AD):
2b8837aeaaa0bb Joe Perches         2014-03-12  213  	case htons(ETH_P_8021Q): {
0744dd00c1b1be Eric Dumazet        2011-11-28  214  		const struct vlan_hdr *vlan;
0744dd00c1b1be Eric Dumazet        2011-11-28  215  		struct vlan_hdr _vlan;
0744dd00c1b1be Eric Dumazet        2011-11-28  216  
690e36e726d00d David S. Miller     2014-08-23  217  		vlan = __skb_header_pointer(skb, nhoff, sizeof(_vlan), data, hlen, &_vlan);
0744dd00c1b1be Eric Dumazet        2011-11-28  218  		if (!vlan)
0744dd00c1b1be Eric Dumazet        2011-11-28  219  			return false;
0744dd00c1b1be Eric Dumazet        2011-11-28  220  
0744dd00c1b1be Eric Dumazet        2011-11-28  221  		proto = vlan->h_vlan_encapsulated_proto;
0744dd00c1b1be Eric Dumazet        2011-11-28  222  		nhoff += sizeof(*vlan);
0744dd00c1b1be Eric Dumazet        2011-11-28  223  		goto again;
0744dd00c1b1be Eric Dumazet        2011-11-28  224  	}
2b8837aeaaa0bb Joe Perches         2014-03-12  225  	case htons(ETH_P_PPP_SES): {
0744dd00c1b1be Eric Dumazet        2011-11-28  226  		struct {
0744dd00c1b1be Eric Dumazet        2011-11-28  227  			struct pppoe_hdr hdr;
0744dd00c1b1be Eric Dumazet        2011-11-28  228  			__be16 proto;
0744dd00c1b1be Eric Dumazet        2011-11-28  229  		} *hdr, _hdr;
690e36e726d00d David S. Miller     2014-08-23  230  		hdr = __skb_header_pointer(skb, nhoff, sizeof(_hdr), data, hlen, &_hdr);
0744dd00c1b1be Eric Dumazet        2011-11-28  231  		if (!hdr)
0744dd00c1b1be Eric Dumazet        2011-11-28  232  			return false;
0744dd00c1b1be Eric Dumazet        2011-11-28  233  		proto = hdr->proto;
0744dd00c1b1be Eric Dumazet        2011-11-28  234  		nhoff += PPPOE_SES_HLEN;
0744dd00c1b1be Eric Dumazet        2011-11-28  235  		switch (proto) {
2b8837aeaaa0bb Joe Perches         2014-03-12  236  		case htons(PPP_IP):
0744dd00c1b1be Eric Dumazet        2011-11-28  237  			goto ip;
2b8837aeaaa0bb Joe Perches         2014-03-12  238  		case htons(PPP_IPV6):
0744dd00c1b1be Eric Dumazet        2011-11-28  239  			goto ipv6;
0744dd00c1b1be Eric Dumazet        2011-11-28  240  		default:
0744dd00c1b1be Eric Dumazet        2011-11-28  241  			return false;
0744dd00c1b1be Eric Dumazet        2011-11-28  242  		}
0744dd00c1b1be Eric Dumazet        2011-11-28  243  	}
56193d1bce2b27 Alexander Duyck     2014-09-05  244  	case htons(ETH_P_FCOE):
bb484c80792f7b Jiri Pirko          2015-05-12  245  		key_basic->thoff = (u16)(nhoff + FCOE_HEADER_LEN);
56193d1bce2b27 Alexander Duyck     2014-09-05  246  		/* fall through */
0744dd00c1b1be Eric Dumazet        2011-11-28  247  	default:
0744dd00c1b1be Eric Dumazet        2011-11-28  248  		return false;
0744dd00c1b1be Eric Dumazet        2011-11-28  249  	}
0744dd00c1b1be Eric Dumazet        2011-11-28  250  
0744dd00c1b1be Eric Dumazet        2011-11-28  251  	switch (ip_proto) {
0744dd00c1b1be Eric Dumazet        2011-11-28  252  	case IPPROTO_GRE: {
0744dd00c1b1be Eric Dumazet        2011-11-28  253  		struct gre_hdr {
0744dd00c1b1be Eric Dumazet        2011-11-28  254  			__be16 flags;
0744dd00c1b1be Eric Dumazet        2011-11-28  255  			__be16 proto;
0744dd00c1b1be Eric Dumazet        2011-11-28  256  		} *hdr, _hdr;
0744dd00c1b1be Eric Dumazet        2011-11-28  257  
690e36e726d00d David S. Miller     2014-08-23  258  		hdr = __skb_header_pointer(skb, nhoff, sizeof(_hdr), data, hlen, &_hdr);
0744dd00c1b1be Eric Dumazet        2011-11-28  259  		if (!hdr)
0744dd00c1b1be Eric Dumazet        2011-11-28  260  			return false;
0744dd00c1b1be Eric Dumazet        2011-11-28  261  		/*
0744dd00c1b1be Eric Dumazet        2011-11-28  262  		 * Only look inside GRE if version zero and no
0744dd00c1b1be Eric Dumazet        2011-11-28  263  		 * routing
0744dd00c1b1be Eric Dumazet        2011-11-28  264  		 */
0744dd00c1b1be Eric Dumazet        2011-11-28  265  		if (!(hdr->flags & (GRE_VERSION|GRE_ROUTING))) {
0744dd00c1b1be Eric Dumazet        2011-11-28  266  			proto = hdr->proto;
0744dd00c1b1be Eric Dumazet        2011-11-28  267  			nhoff += 4;
0744dd00c1b1be Eric Dumazet        2011-11-28  268  			if (hdr->flags & GRE_CSUM)
0744dd00c1b1be Eric Dumazet        2011-11-28  269  				nhoff += 4;
0744dd00c1b1be Eric Dumazet        2011-11-28  270  			if (hdr->flags & GRE_KEY)
0744dd00c1b1be Eric Dumazet        2011-11-28  271  				nhoff += 4;
0744dd00c1b1be Eric Dumazet        2011-11-28  272  			if (hdr->flags & GRE_SEQ)
0744dd00c1b1be Eric Dumazet        2011-11-28  273  				nhoff += 4;
e1733de2243609 Michael Dalton      2013-03-11  274  			if (proto == htons(ETH_P_TEB)) {
e1733de2243609 Michael Dalton      2013-03-11  275  				const struct ethhdr *eth;
e1733de2243609 Michael Dalton      2013-03-11  276  				struct ethhdr _eth;
e1733de2243609 Michael Dalton      2013-03-11  277  
690e36e726d00d David S. Miller     2014-08-23  278  				eth = __skb_header_pointer(skb, nhoff,
690e36e726d00d David S. Miller     2014-08-23  279  							   sizeof(_eth),
690e36e726d00d David S. Miller     2014-08-23  280  							   data, hlen, &_eth);
e1733de2243609 Michael Dalton      2013-03-11  281  				if (!eth)
e1733de2243609 Michael Dalton      2013-03-11  282  					return false;
e1733de2243609 Michael Dalton      2013-03-11  283  				proto = eth->h_proto;
e1733de2243609 Michael Dalton      2013-03-11  284  				nhoff += sizeof(*eth);
e1733de2243609 Michael Dalton      2013-03-11  285  			}
0744dd00c1b1be Eric Dumazet        2011-11-28  286  			goto again;
0744dd00c1b1be Eric Dumazet        2011-11-28  287  		}
0744dd00c1b1be Eric Dumazet        2011-11-28  288  		break;
0744dd00c1b1be Eric Dumazet        2011-11-28  289  	}
0744dd00c1b1be Eric Dumazet        2011-11-28  290  	case IPPROTO_IPIP:
fca418955148e4 Tom Herbert         2013-07-29  291  		proto = htons(ETH_P_IP);
fca418955148e4 Tom Herbert         2013-07-29  292  		goto ip;
b438f940d3541f Tom Herbert         2013-07-29  293  	case IPPROTO_IPV6:
b438f940d3541f Tom Herbert         2013-07-29  294  		proto = htons(ETH_P_IPV6);
b438f940d3541f Tom Herbert         2013-07-29  295  		goto ipv6;
0744dd00c1b1be Eric Dumazet        2011-11-28  296  	default:
0744dd00c1b1be Eric Dumazet        2011-11-28  297  		break;
0744dd00c1b1be Eric Dumazet        2011-11-28  298  	}
0744dd00c1b1be Eric Dumazet        2011-11-28  299  
bb484c80792f7b Jiri Pirko          2015-05-12  300  	/* It is ensured by skb_flow_dissector_init() that basic key will
bb484c80792f7b Jiri Pirko          2015-05-12  301  	 * be always present.
bb484c80792f7b Jiri Pirko          2015-05-12  302  	 */
bb484c80792f7b Jiri Pirko          2015-05-12 @303  	key_basic = skb_flow_dissector_target(flow_dissector,
bb484c80792f7b Jiri Pirko          2015-05-12  304  					      FLOW_DISSECTOR_KEY_BASIC,
bb484c80792f7b Jiri Pirko          2015-05-12  305  					      target_container);
bb484c80792f7b Jiri Pirko          2015-05-12  306  	key_basic->n_proto = proto;
bb484c80792f7b Jiri Pirko          2015-05-12  307  	key_basic->ip_proto = ip_proto;
bb484c80792f7b Jiri Pirko          2015-05-12  308  	key_basic->thoff = (u16) nhoff;
bb484c80792f7b Jiri Pirko          2015-05-12  309  
bb484c80792f7b Jiri Pirko          2015-05-12  310  	if (skb_flow_dissector_uses_key(flow_dissector,
bb484c80792f7b Jiri Pirko          2015-05-12  311  					FLOW_DISSECTOR_KEY_PORTS)) {
bb484c80792f7b Jiri Pirko          2015-05-12  312  		key_ports = skb_flow_dissector_target(flow_dissector,
bb484c80792f7b Jiri Pirko          2015-05-12  313  						      FLOW_DISSECTOR_KEY_PORTS,
bb484c80792f7b Jiri Pirko          2015-05-12  314  						      target_container);
bb484c80792f7b Jiri Pirko          2015-05-12  315  		key_ports->ports = __skb_flow_get_ports(skb, nhoff, ip_proto,
5af7fb6e3e92c2 Alexander Duyck     2014-10-10  316  							data, hlen);
bb484c80792f7b Jiri Pirko          2015-05-12  317  	}
5af7fb6e3e92c2 Alexander Duyck     2014-10-10  318  
0744dd00c1b1be Eric Dumazet        2011-11-28  319  	return true;
0744dd00c1b1be Eric Dumazet        2011-11-28  320  }
690e36e726d00d David S. Miller     2014-08-23  321  EXPORT_SYMBOL(__skb_flow_dissect);
441d9d327f1e77 Cong Wang           2013-01-21  322  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

                 reply	other threads:[~2021-02-19 23:27 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=202102200737.72PYuHSA-lkp@intel.com \
    --to=lkp@intel.com \
    --cc=kbuild@lists.01.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.