From: Wenbo Cao <caowenbo@mucse.com>
To: thomas@monjalon.net, Wenbo Cao <caowenbo@mucse.com>
Cc: stephen@networkplumber.org, dev@dpdk.org, yaojun@mucse.com
Subject: [PATCH v15 29/29] net/rnp: add multicast MAC filter operation
Date: Tue, 25 Feb 2025 16:41:26 +0800 [thread overview]
Message-ID: <1740472886-30411-30-git-send-email-caowenbo@mucse.com> (raw)
In-Reply-To: <1740472886-30411-1-git-send-email-caowenbo@mucse.com>
add mac filter for single/multiple port.
Signed-off-by: Wenbo Cao <caowenbo@mucse.com>
---
doc/guides/nics/features/rnp.ini | 1 +
doc/guides/nics/rnp.rst | 1 +
drivers/net/rnp/base/rnp_crc32.c | 18 ++++-
drivers/net/rnp/base/rnp_crc32.h | 1 +
drivers/net/rnp/base/rnp_eth_regs.h | 3 +
drivers/net/rnp/base/rnp_hw.h | 4 +
drivers/net/rnp/base/rnp_mac.c | 121 +++++++++++++++++++++++++++-
drivers/net/rnp/base/rnp_mac.h | 2 +
drivers/net/rnp/base/rnp_mac_regs.h | 2 +
drivers/net/rnp/rnp.h | 4 +
drivers/net/rnp/rnp_ethdev.c | 26 ++++++
11 files changed, 181 insertions(+), 2 deletions(-)
diff --git a/doc/guides/nics/features/rnp.ini b/doc/guides/nics/features/rnp.ini
index 48d250c86b..801a8de711 100644
--- a/doc/guides/nics/features/rnp.ini
+++ b/doc/guides/nics/features/rnp.ini
@@ -20,6 +20,7 @@ Promiscuous mode = Y
Allmulticast mode = Y
MTU update = Y
Unicast MAC filter = Y
+Multicast MAC filter = Y
VLAN filter = Y
VLAN offload = Y
QinQ offload = P
diff --git a/doc/guides/nics/rnp.rst b/doc/guides/nics/rnp.rst
index 8854b45220..537c6d4af4 100644
--- a/doc/guides/nics/rnp.rst
+++ b/doc/guides/nics/rnp.rst
@@ -99,6 +99,7 @@ Listed below are the rte_eth functions supported:
* ``rte_eth_dev_default_mac_addr_set``
* ``rte_eth_dev_mac_addr_add``
* ``rte_eth_dev_mac_addr_remove``
+* ``rte_eth_dev_set_mc_addr_list``
* ``rte_eth_dev_get_supported_ptypes``
* ``rte_eth_dev_get_vlan_offload``
* ``rte_eth_dev_set_vlan_offload``
diff --git a/drivers/net/rnp/base/rnp_crc32.c b/drivers/net/rnp/base/rnp_crc32.c
index c287b35759..9d03754a4b 100644
--- a/drivers/net/rnp/base/rnp_crc32.c
+++ b/drivers/net/rnp/base/rnp_crc32.c
@@ -5,6 +5,7 @@
#include "rnp_osdep.h"
#include "rnp_crc32.h"
+#define RNP_CRC32_POLY_LE 0xedb88320
static inline int get_bitmask_order(u32 count)
{
int order;
@@ -30,7 +31,22 @@ u32 rnp_vid_crc32_calc(u32 crc_init, u16 vid_le)
crc >>= 1;
data_byte >>= 1;
if (temp)
- crc ^= 0xedb88320;
+ crc ^= RNP_CRC32_POLY_LE;
+ }
+
+ return crc;
+}
+
+u32 rnp_calc_crc32(u32 seed, u8 *mac, u32 len)
+{
+ u32 crc = seed;
+ u32 i;
+
+ while (len--) {
+ crc ^= *mac++;
+ for (i = 0; i < 8; i++)
+ crc = (crc >> 1) ^ ((crc & 1) ?
+ RNP_CRC32_POLY_LE : 0);
}
return crc;
diff --git a/drivers/net/rnp/base/rnp_crc32.h b/drivers/net/rnp/base/rnp_crc32.h
index e117dcfc2f..dc3026ddf8 100644
--- a/drivers/net/rnp/base/rnp_crc32.h
+++ b/drivers/net/rnp/base/rnp_crc32.h
@@ -6,5 +6,6 @@
#define _RNP_CRC32_H_
u32 rnp_vid_crc32_calc(u32 crc_init, u16 vid_le);
+u32 rnp_calc_crc32(u32 seed, u8 *mac, u32 len);
#endif /* _RNP_CRC32_H_ */
diff --git a/drivers/net/rnp/base/rnp_eth_regs.h b/drivers/net/rnp/base/rnp_eth_regs.h
index 5c3f7f906c..1378328add 100644
--- a/drivers/net/rnp/base/rnp_eth_regs.h
+++ b/drivers/net/rnp/base/rnp_eth_regs.h
@@ -57,6 +57,8 @@
#define RNP_MAC_HASH_MASK RTE_GENMASK32(11, 0)
#define RNP_MAC_MULTICASE_TBL_EN RTE_BIT32(2)
#define RNP_MAC_UNICASE_TBL_EN RTE_BIT32(3)
+#define RNP_HTA_BIT_SHIFT (5)
+#define RNP_HTA_BIT_MASK ((1 << RNP_HTA_BIT_SHIFT) - 1)
/* vlan strip ctrl */
#define RNP_VLAN_Q_STRIP_CTRL(n) _ETH_(0x8040 + 0x4 * ((n) / 32))
/* vlan filter ctrl */
@@ -87,5 +89,6 @@
#define RNP_RAL_BASE_ADDR(n) _ETH_(0xA000 + (0x04 * (n)))
#define RNP_RAH_BASE_ADDR(n) _ETH_(0xA400 + (0x04 * (n)))
#define RNP_MAC_FILTER_EN RTE_BIT32(31)
+#define RNP_MC_HASH_TABLE(n) _ETH_(0xAC00 + ((0x04) * ((n))))
#endif /* _RNP_ETH_REGS_H */
diff --git a/drivers/net/rnp/base/rnp_hw.h b/drivers/net/rnp/base/rnp_hw.h
index 8cf57db185..8dc29b6873 100644
--- a/drivers/net/rnp/base/rnp_hw.h
+++ b/drivers/net/rnp/base/rnp_hw.h
@@ -74,6 +74,10 @@ struct rnp_mac_ops {
/* Receive Address Filter table */
int (*set_rafb)(struct rnp_eth_port *port, const u8 *mac, u32 index);
int (*clear_rafb)(struct rnp_eth_port *port, u32 index);
+ /* update multicast address table */
+ int (*update_mta)(struct rnp_eth_port *port, u8 *mc_addr);
+ /* clear all multicast hash table */
+ int (*clear_mta)(struct rnp_eth_port *port, bool en);
/* receive vlan filter */
int (*vlan_f_en)(struct rnp_eth_port *port, bool en);
int (*update_vlan)(struct rnp_eth_port *port, u16 vid, bool en);
diff --git a/drivers/net/rnp/base/rnp_mac.c b/drivers/net/rnp/base/rnp_mac.c
index b723c29ac5..96750e1cde 100644
--- a/drivers/net/rnp/base/rnp_mac.c
+++ b/drivers/net/rnp/base/rnp_mac.c
@@ -46,7 +46,7 @@ rnp_update_mpfm_indep(struct rnp_eth_port *port, u32 mode, bool en)
reg |= disable;
}
/* disable common filter when indep mode */
- reg |= RNP_MAC_HPF;
+ reg |= RNP_MAC_HPF | RNP_MAC_HMC;
RNP_MAC_REG_WR(hw, nr_lane, RNP_MAC_PKT_FLT_CTRL, reg);
RNP_MAC_REG_WR(hw, nr_lane, RNP_MAC_FCTRL, RNP_MAC_FCTRL_BYPASS);
@@ -283,11 +283,112 @@ rnp_update_vlan_filter_indep(struct rnp_eth_port *port,
return 0;
}
+static u32
+rnp_sample_mac_vector(struct rnp_eth_port *port, u8 *mc_addr)
+{
+ u32 vector = 0;
+
+ switch (port->hash_filter_type) {
+ case 0: /* Use bits [11:0] of the address */
+ vector = ((mc_addr[4] << 8) | (((u16)mc_addr[5])));
+ break;
+ case 1: /* Use bits [12:1] of the address */
+ vector = ((mc_addr[4] << 7) | (((u16)mc_addr[5]) >> 1));
+ break;
+ case 2: /* Use bits [13:2] of the address */
+ vector = ((mc_addr[4] << 6) | (((u16)mc_addr[5]) >> 2));
+ break;
+ case 3: /* Use bits [14:3] of the address */
+ vector = ((mc_addr[4] << 4) | (((u16)mc_addr[5]) >> 4));
+ break;
+ default: /* Invalid mc_filter_type */
+ RNP_PMD_ERR("Mac Hash filter type param set incorrect");
+ break;
+ }
+ vector &= RNP_MAC_HASH_MASK;
+
+ return vector;
+}
+
+static int
+rnp_update_mta_pf(struct rnp_eth_port *port, u8 *mc_addr)
+{
+ struct rnp_hw *hw = port->hw;
+ u32 vector, hash_bit;
+ u32 mta_row, mta_col;
+ u32 value, reg;
+
+ vector = rnp_sample_mac_vector(port, mc_addr);
+ mta_row = (vector >> RNP_HTA_BIT_SHIFT) & 0x7f;
+ mta_col = vector & (RNP_HTA_BIT_MASK);
+ hash_bit = 1 << mta_col;
+ value = port->mc_hash_table[mta_row];
+ if (!(value & hash_bit)) {
+ port->mc_hash_table[mta_row] |= hash_bit;
+ reg = port->mc_hash_table[mta_row];
+ RNP_E_REG_WR(hw, RNP_MC_HASH_TABLE(mta_row), reg);
+ }
+
+ return 0;
+}
+
+static int
+rnp_clear_mta_pf(struct rnp_eth_port *port, bool en __rte_unused)
+{
+ struct rnp_hw *hw = port->hw;
+ u16 idx = 0;
+
+ for (idx = 0; idx < port->attr.mc_hash_tb_size; idx++)
+ RNP_E_REG_WR(hw, RNP_MC_HASH_TABLE(idx), 0);
+ memset(&port->mc_hash_table, 0, sizeof(port->mc_hash_table));
+
+ return 0;
+}
+
+static int
+rnp_update_mta_indep(struct rnp_eth_port *port, u8 *mc_addr)
+{
+ u32 hash_bit, mta_row, mta_col;
+ u16 lane = port->attr.nr_lane;
+ struct rnp_hw *hw = port->hw;
+ u32 crc, value, reg;
+
+ crc = bitrev32(~rnp_calc_crc32(~0, mc_addr, RTE_ETHER_ADDR_LEN));
+ crc >>= port->attr.hash_table_shift;
+ mta_row = (crc >> RNP_HTA_BIT_SHIFT) & 0x07;
+ mta_col = crc & RNP_HTA_BIT_MASK;
+ value = port->mc_hash_table[mta_row];
+ hash_bit = 1 << mta_col;
+ if (!(value & hash_bit)) {
+ port->mc_hash_table[mta_row] |= hash_bit;
+ reg = port->mc_hash_table[mta_row];
+ RNP_MAC_REG_WR(hw, lane, RNP_MAC_ADDR_HASH_TB(mta_row), reg);
+ }
+
+ return 0;
+}
+
+static int
+rnp_clear_mta_indep(struct rnp_eth_port *port, bool en __rte_unused)
+{
+ u16 lane = port->attr.nr_lane;
+ struct rnp_hw *hw = port->hw;
+ u16 idx = 0;
+
+ for (idx = 0; idx < port->attr.mc_hash_tb_size; idx++)
+ RNP_MAC_REG_WR(hw, lane, RNP_MAC_ADDR_HASH_TB(idx), 0);
+ memset(&port->mc_hash_table, 0, sizeof(port->mc_hash_table));
+
+ return 0;
+}
+
const struct rnp_mac_ops rnp_mac_ops_pf = {
.get_macaddr = rnp_mbx_fw_get_macaddr,
.update_mpfm = rnp_update_mpfm_pf,
.set_rafb = rnp_set_mac_addr_pf,
.clear_rafb = rnp_clear_mac_pf,
+ .update_mta = rnp_update_mta_pf,
+ .clear_mta = rnp_clear_mta_pf,
.vlan_f_en = rnp_en_vlan_filter_pf,
.update_vlan = rnp_update_vlan_filter_pf,
};
@@ -297,6 +398,8 @@ const struct rnp_mac_ops rnp_mac_ops_indep = {
.update_mpfm = rnp_update_mpfm_indep,
.set_rafb = rnp_set_mac_addr_indep,
.clear_rafb = rnp_clear_mac_indep,
+ .update_mta = rnp_update_mta_indep,
+ .clear_mta = rnp_clear_mta_indep,
.vlan_f_en = rnp_en_vlan_filter_indep,
.update_vlan = rnp_update_vlan_filter_indep,
};
@@ -334,6 +437,22 @@ int rnp_clear_macaddr(struct rnp_eth_port *port, u32 index)
return rnp_call_hwif_impl(port, mac_ops->clear_rafb, index);
}
+int rnp_update_mc_hash(struct rnp_eth_port *port, u8 *mc_addr)
+{
+ const struct rnp_mac_ops *mac_ops =
+ RNP_DEV_PP_TO_MAC_OPS(port->eth_dev);
+
+ return rnp_call_hwif_impl(port, mac_ops->update_mta, mc_addr);
+}
+
+int rnp_clear_mc_hash(struct rnp_eth_port *port)
+{
+ const struct rnp_mac_ops *mac_ops =
+ RNP_DEV_PP_TO_MAC_OPS(port->eth_dev);
+
+ return rnp_call_hwif_impl(port, mac_ops->clear_mta, TRUE);
+}
+
int rnp_rx_vlan_filter_en(struct rnp_eth_port *port, bool en)
{
const struct rnp_mac_ops *mac_ops =
diff --git a/drivers/net/rnp/base/rnp_mac.h b/drivers/net/rnp/base/rnp_mac.h
index 6f22c8279a..44d500a9df 100644
--- a/drivers/net/rnp/base/rnp_mac.h
+++ b/drivers/net/rnp/base/rnp_mac.h
@@ -26,6 +26,8 @@ void rnp_mac_ops_init(struct rnp_hw *hw);
int rnp_get_mac_addr(struct rnp_eth_port *port, u8 *mac);
int rnp_set_macaddr(struct rnp_eth_port *port, u8 *mac, u32 index);
int rnp_clear_macaddr(struct rnp_eth_port *port, u32 index);
+int rnp_update_mc_hash(struct rnp_eth_port *port, u8 *mc_addr);
+int rnp_clear_mc_hash(struct rnp_eth_port *port);
int rnp_update_mpfm(struct rnp_eth_port *port,
u32 mode, bool en);
int rnp_rx_vlan_filter_en(struct rnp_eth_port *port, bool en);
diff --git a/drivers/net/rnp/base/rnp_mac_regs.h b/drivers/net/rnp/base/rnp_mac_regs.h
index f15d7b2d72..d76efb2f39 100644
--- a/drivers/net/rnp/base/rnp_mac_regs.h
+++ b/drivers/net/rnp/base/rnp_mac_regs.h
@@ -114,6 +114,8 @@
#define RNP_MAC_VLAN_VLC_REPLACE (0x3 << RNP_MAC_VLAN_VLC_SHIFT)
/* VLAN Tag for Transmit Packets For Insert/Remove */
#define RNP_MAC_VLAN_VLT RTE_GENMASK32(15, 0)
+/* Mac Hash Table */
+#define RNP_MAC_ADDR_HASH_TB(n) (0x10 + ((n) * 0x4))
/* mac link ctrl */
#define RNP_MAC_LPI_CTRL (0xd0)
/* PHY Link Status Disable */
diff --git a/drivers/net/rnp/rnp.h b/drivers/net/rnp/rnp.h
index 301e6ef203..3a2185329d 100644
--- a/drivers/net/rnp/rnp.h
+++ b/drivers/net/rnp/rnp.h
@@ -71,6 +71,7 @@
#define RNP_PORT_MAX_MACADDR (32)
#define RNP_PORT_MAX_MC_HASH_TB (8)
#define RNP_PORT_MAX_MC_MAC_SIZE (RNP_PORT_MAX_MC_HASH_TB * 32)
+#define RNP_PORT_HASH_SHIFT (26 - (RNP_PORT_MAX_MC_MAC_SIZE >> 7))
/* hardware media type */
enum rnp_media_type {
RNP_MEDIA_TYPE_UNKNOWN,
@@ -99,6 +100,7 @@ struct rnp_port_attr {
uint16_t max_mc_mac_hash; /* max hash multicast mac size */
uint16_t uc_hash_tb_size; /* max unicast hash table block num */
uint16_t mc_hash_tb_size; /* max multicast hash table block num */
+ uint16_t hash_table_shift;/* hash mac table shift num */
uint16_t max_rx_queues; /* belong to this port rxq resource */
uint16_t max_tx_queues; /* belong to this port txq resource */
@@ -200,6 +202,8 @@ struct rnp_eth_port {
bool reta_has_cfg;
bool hw_rss_en;
uint32_t indirtbl[RNP_RSS_INDIR_SIZE];
+ uint32_t mc_hash_table[RNP_MAC_MC_HASH_TABLE];
+ uint8_t hash_filter_type;
uint16_t cur_mtu;
bool jumbo_en;
diff --git a/drivers/net/rnp/rnp_ethdev.c b/drivers/net/rnp/rnp_ethdev.c
index 30964efa55..e4e24ae6d6 100644
--- a/drivers/net/rnp/rnp_ethdev.c
+++ b/drivers/net/rnp/rnp_ethdev.c
@@ -1431,6 +1431,29 @@ rnp_dev_mac_addr_remove(struct rte_eth_dev *dev,
rnp_clear_macaddr(port, index);
}
+static int
+rnp_dev_set_mc_addr_list(struct rte_eth_dev *dev,
+ struct rte_ether_addr *mc_addr_list,
+ uint32_t nb_mc_addr)
+{
+ struct rnp_eth_port *port = RNP_DEV_TO_PORT(dev);
+ uint32_t idx = 0;
+
+ if (nb_mc_addr > port->attr.max_mc_mac_hash)
+ return -EINVAL;
+ rnp_clear_mc_hash(port);
+ for (idx = 0; idx < nb_mc_addr; idx++) {
+ if (!rte_is_multicast_ether_addr(&mc_addr_list[idx])) {
+ RNP_PMD_ERR("mc_list[%d] isn't a valid multicast", idx);
+ return -EINVAL;
+ }
+ }
+ for (idx = 0; idx < nb_mc_addr; idx++)
+ rnp_update_mc_hash(port, (uint8_t *)&mc_addr_list[idx]);
+
+ return 0;
+}
+
static uint32_t *rnp_support_ptypes_get(void)
{
static uint32_t ptypes[] = {
@@ -1502,6 +1525,7 @@ static const struct eth_dev_ops rnp_eth_dev_ops = {
.mac_addr_set = rnp_dev_mac_addr_set,
.mac_addr_add = rnp_dev_mac_addr_add,
.mac_addr_remove = rnp_dev_mac_addr_remove,
+ .set_mc_addr_list = rnp_dev_set_mc_addr_list,
/* vlan offload */
.vlan_offload_set = rnp_vlan_offload_set,
.vlan_strip_queue_set = rnp_vlan_strip_queue_set,
@@ -1535,12 +1559,14 @@ rnp_setup_port_attr(struct rnp_eth_port *port,
attr->max_mc_mac_hash = RNP_PORT_MAX_MC_MAC_SIZE;
attr->uc_hash_tb_size = 0;
attr->mc_hash_tb_size = RNP_PORT_MAX_MC_HASH_TB;
+ attr->hash_table_shift = RNP_PORT_HASH_SHIFT;
} else {
attr->max_mac_addrs = RNP_MAX_MAC_ADDRS;
attr->max_uc_mac_hash = RNP_MAX_HASH_UC_MAC_SIZE;
attr->max_mc_mac_hash = RNP_MAX_HASH_MC_MAC_SIZE;
attr->uc_hash_tb_size = RNP_MAX_UC_HASH_TABLE;
attr->mc_hash_tb_size = RNP_MAC_MC_HASH_TABLE;
+ attr->hash_table_shift = 0;
}
port->outvlan_type = RNP_SVLAN_TYPE;
port->invlan_type = RNP_CVLAN_TYPE;
--
2.25.1
prev parent reply other threads:[~2025-02-25 8:44 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-25 8:40 [PATCH v14 00/28] [v14]drivers/net Add Support mucse N10 Pmd Driver Wenbo Cao
2025-02-25 8:40 ` [PATCH v15 01/29] net/rnp: add skeleton Wenbo Cao
2025-02-25 8:40 ` [PATCH v15 02/29] net/rnp: add ethdev probe and remove Wenbo Cao
2025-02-25 8:41 ` [PATCH v15 03/29] net/rnp: add log Wenbo Cao
2025-02-25 8:41 ` [PATCH v15 04/29] net/rnp: support mailbox basic operate Wenbo Cao
2025-02-25 8:41 ` [PATCH v15 05/29] net/rnp: add device init and uninit Wenbo Cao
2025-02-25 8:41 ` [PATCH v15 06/29] net/rnp: add get device information operation Wenbo Cao
2025-02-25 8:41 ` [PATCH v15 07/29] net/rnp: add support MAC promisc mode Wenbo Cao
2025-02-25 8:41 ` [PATCH v15 08/29] net/rnp: add queue setup and release operations Wenbo Cao
2025-02-25 8:41 ` [PATCH v15 09/29] net/rnp: add queue stop and start operations Wenbo Cao
2025-02-25 16:08 ` Stephen Hemminger
2025-02-25 8:41 ` [PATCH v15 10/29] net/rnp: add support device start stop operations Wenbo Cao
2025-02-25 8:41 ` [PATCH v15 11/29] net/rnp: add RSS support operations Wenbo Cao
2025-02-25 8:41 ` [PATCH v15 12/29] net/rnp: add support link update operations Wenbo Cao
2025-02-25 8:41 ` [PATCH v15 13/29] net/rnp: add support link setup operations Wenbo Cao
2025-02-25 8:41 ` [PATCH v15 14/29] net/rnp: add Rx burst simple support Wenbo Cao
2025-02-25 8:41 ` [PATCH v15 15/29] net/rnp: add Tx " Wenbo Cao
2025-02-25 8:41 ` [PATCH v15 16/29] net/rnp: add MTU set operation Wenbo Cao
2025-02-25 8:41 ` [PATCH v15 17/29] net/rnp: add Rx scatter segment version Wenbo Cao
2025-02-25 8:41 ` [PATCH v15 18/29] net/rnp: add Tx multiple " Wenbo Cao
2025-02-25 8:41 ` [PATCH v15 19/29] net/rnp: add support basic stats operation Wenbo Cao
2025-02-25 8:41 ` [PATCH v15 20/29] net/rnp: add support xstats operation Wenbo Cao
2025-02-25 8:41 ` [PATCH v15 21/29] net/rnp: add unicast MAC filter operation Wenbo Cao
2025-02-25 8:41 ` [PATCH v15 22/29] net/rnp: add supported packet types Wenbo Cao
2025-02-25 8:41 ` [PATCH v15 23/29] net/rnp: add support Rx checksum offload Wenbo Cao
2025-02-25 8:41 ` [PATCH v15 24/29] net/rnp: add support Tx TSO offload Wenbo Cao
2025-02-25 8:41 ` [PATCH v15 25/29] net/rnp: support VLAN offloads Wenbo Cao
2025-02-25 8:41 ` [PATCH v15 26/29] net/rnp: add support VLAN filters operations Wenbo Cao
2025-02-25 8:41 ` [PATCH v15 27/29] net/rnp: add queue info operation Wenbo Cao
2025-02-25 8:41 ` [PATCH v15 28/29] net/rnp: support Rx/Tx burst mode info Wenbo Cao
2025-02-25 8:41 ` Wenbo Cao [this message]
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=1740472886-30411-30-git-send-email-caowenbo@mucse.com \
--to=caowenbo@mucse.com \
--cc=dev@dpdk.org \
--cc=stephen@networkplumber.org \
--cc=thomas@monjalon.net \
--cc=yaojun@mucse.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).