Commit 212dab05 authored by Linus Torvalds's avatar Linus Torvalds

Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net

Pull networking fixes from David Miller:

 1) Handle frames in error situations properly in AF_XDP, from Jakub
    Kicinski.

 2) tcp_mmap test case only tests ipv6 due to a thinko, fix from
    Maninder Singh.

 3) Session refcnt fix in l2tp_ppp, from Guillaume Nault.

 4) Fix regression in netlink bind handling of multicast gruops, from
    Dmitry Safonov.

* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net:
  netlink: Don't shift on 64 for ngroups
  net/smc: no cursor update send in state SMC_INIT
  l2tp: fix missing refcount drop in pppol2tp_tunnel_ioctl()
  mlxsw: core_acl_flex_actions: Remove redundant mirror resource destruction
  mlxsw: core_acl_flex_actions: Remove redundant counter destruction
  mlxsw: core_acl_flex_actions: Remove redundant resource destruction
  mlxsw: core_acl_flex_actions: Return error for conflicting actions
  selftests/bpf: update test_lwt_seg6local.sh according to iproute2
  drivers: net: lmc: fix case value for target abort error
  selftest/net: fix protocol family to work for IPv4.
  net: xsk: don't return frames via the allocator on error
  tools/bpftool: fix a percpu_array map dump problem
parents 60f5a217 91874ecf
...@@ -327,12 +327,16 @@ static void mlxsw_afa_resource_add(struct mlxsw_afa_block *block, ...@@ -327,12 +327,16 @@ static void mlxsw_afa_resource_add(struct mlxsw_afa_block *block,
list_add(&resource->list, &block->resource_list); list_add(&resource->list, &block->resource_list);
} }
static void mlxsw_afa_resource_del(struct mlxsw_afa_resource *resource)
{
list_del(&resource->list);
}
static void mlxsw_afa_resources_destroy(struct mlxsw_afa_block *block) static void mlxsw_afa_resources_destroy(struct mlxsw_afa_block *block)
{ {
struct mlxsw_afa_resource *resource, *tmp; struct mlxsw_afa_resource *resource, *tmp;
list_for_each_entry_safe(resource, tmp, &block->resource_list, list) { list_for_each_entry_safe(resource, tmp, &block->resource_list, list) {
list_del(&resource->list);
resource->destructor(block, resource); resource->destructor(block, resource);
} }
} }
...@@ -530,6 +534,7 @@ static void ...@@ -530,6 +534,7 @@ static void
mlxsw_afa_fwd_entry_ref_destroy(struct mlxsw_afa_block *block, mlxsw_afa_fwd_entry_ref_destroy(struct mlxsw_afa_block *block,
struct mlxsw_afa_fwd_entry_ref *fwd_entry_ref) struct mlxsw_afa_fwd_entry_ref *fwd_entry_ref)
{ {
mlxsw_afa_resource_del(&fwd_entry_ref->resource);
mlxsw_afa_fwd_entry_put(block->afa, fwd_entry_ref->fwd_entry); mlxsw_afa_fwd_entry_put(block->afa, fwd_entry_ref->fwd_entry);
kfree(fwd_entry_ref); kfree(fwd_entry_ref);
} }
...@@ -579,6 +584,7 @@ static void ...@@ -579,6 +584,7 @@ static void
mlxsw_afa_counter_destroy(struct mlxsw_afa_block *block, mlxsw_afa_counter_destroy(struct mlxsw_afa_block *block,
struct mlxsw_afa_counter *counter) struct mlxsw_afa_counter *counter)
{ {
mlxsw_afa_resource_del(&counter->resource);
block->afa->ops->counter_index_put(block->afa->ops_priv, block->afa->ops->counter_index_put(block->afa->ops_priv,
counter->counter_index); counter->counter_index);
kfree(counter); kfree(counter);
...@@ -626,8 +632,8 @@ static char *mlxsw_afa_block_append_action(struct mlxsw_afa_block *block, ...@@ -626,8 +632,8 @@ static char *mlxsw_afa_block_append_action(struct mlxsw_afa_block *block,
char *oneact; char *oneact;
char *actions; char *actions;
if (WARN_ON(block->finished)) if (block->finished)
return NULL; return ERR_PTR(-EINVAL);
if (block->cur_act_index + action_size > if (block->cur_act_index + action_size >
block->afa->max_acts_per_set) { block->afa->max_acts_per_set) {
struct mlxsw_afa_set *set; struct mlxsw_afa_set *set;
...@@ -637,7 +643,7 @@ static char *mlxsw_afa_block_append_action(struct mlxsw_afa_block *block, ...@@ -637,7 +643,7 @@ static char *mlxsw_afa_block_append_action(struct mlxsw_afa_block *block,
*/ */
set = mlxsw_afa_set_create(false); set = mlxsw_afa_set_create(false);
if (!set) if (!set)
return NULL; return ERR_PTR(-ENOBUFS);
set->prev = block->cur_set; set->prev = block->cur_set;
block->cur_act_index = 0; block->cur_act_index = 0;
block->cur_set->next = set; block->cur_set->next = set;
...@@ -724,8 +730,8 @@ int mlxsw_afa_block_append_vlan_modify(struct mlxsw_afa_block *block, ...@@ -724,8 +730,8 @@ int mlxsw_afa_block_append_vlan_modify(struct mlxsw_afa_block *block,
MLXSW_AFA_VLAN_CODE, MLXSW_AFA_VLAN_CODE,
MLXSW_AFA_VLAN_SIZE); MLXSW_AFA_VLAN_SIZE);
if (!act) if (IS_ERR(act))
return -ENOBUFS; return PTR_ERR(act);
mlxsw_afa_vlan_pack(act, MLXSW_AFA_VLAN_VLAN_TAG_CMD_NOP, mlxsw_afa_vlan_pack(act, MLXSW_AFA_VLAN_VLAN_TAG_CMD_NOP,
MLXSW_AFA_VLAN_CMD_SET_OUTER, vid, MLXSW_AFA_VLAN_CMD_SET_OUTER, vid,
MLXSW_AFA_VLAN_CMD_SET_OUTER, pcp, MLXSW_AFA_VLAN_CMD_SET_OUTER, pcp,
...@@ -806,8 +812,8 @@ int mlxsw_afa_block_append_drop(struct mlxsw_afa_block *block) ...@@ -806,8 +812,8 @@ int mlxsw_afa_block_append_drop(struct mlxsw_afa_block *block)
MLXSW_AFA_TRAPDISC_CODE, MLXSW_AFA_TRAPDISC_CODE,
MLXSW_AFA_TRAPDISC_SIZE); MLXSW_AFA_TRAPDISC_SIZE);
if (!act) if (IS_ERR(act))
return -ENOBUFS; return PTR_ERR(act);
mlxsw_afa_trapdisc_pack(act, MLXSW_AFA_TRAPDISC_TRAP_ACTION_NOP, mlxsw_afa_trapdisc_pack(act, MLXSW_AFA_TRAPDISC_TRAP_ACTION_NOP,
MLXSW_AFA_TRAPDISC_FORWARD_ACTION_DISCARD, 0); MLXSW_AFA_TRAPDISC_FORWARD_ACTION_DISCARD, 0);
return 0; return 0;
...@@ -820,8 +826,8 @@ int mlxsw_afa_block_append_trap(struct mlxsw_afa_block *block, u16 trap_id) ...@@ -820,8 +826,8 @@ int mlxsw_afa_block_append_trap(struct mlxsw_afa_block *block, u16 trap_id)
MLXSW_AFA_TRAPDISC_CODE, MLXSW_AFA_TRAPDISC_CODE,
MLXSW_AFA_TRAPDISC_SIZE); MLXSW_AFA_TRAPDISC_SIZE);
if (!act) if (IS_ERR(act))
return -ENOBUFS; return PTR_ERR(act);
mlxsw_afa_trapdisc_pack(act, MLXSW_AFA_TRAPDISC_TRAP_ACTION_TRAP, mlxsw_afa_trapdisc_pack(act, MLXSW_AFA_TRAPDISC_TRAP_ACTION_TRAP,
MLXSW_AFA_TRAPDISC_FORWARD_ACTION_DISCARD, MLXSW_AFA_TRAPDISC_FORWARD_ACTION_DISCARD,
trap_id); trap_id);
...@@ -836,8 +842,8 @@ int mlxsw_afa_block_append_trap_and_forward(struct mlxsw_afa_block *block, ...@@ -836,8 +842,8 @@ int mlxsw_afa_block_append_trap_and_forward(struct mlxsw_afa_block *block,
MLXSW_AFA_TRAPDISC_CODE, MLXSW_AFA_TRAPDISC_CODE,
MLXSW_AFA_TRAPDISC_SIZE); MLXSW_AFA_TRAPDISC_SIZE);
if (!act) if (IS_ERR(act))
return -ENOBUFS; return PTR_ERR(act);
mlxsw_afa_trapdisc_pack(act, MLXSW_AFA_TRAPDISC_TRAP_ACTION_TRAP, mlxsw_afa_trapdisc_pack(act, MLXSW_AFA_TRAPDISC_TRAP_ACTION_TRAP,
MLXSW_AFA_TRAPDISC_FORWARD_ACTION_FORWARD, MLXSW_AFA_TRAPDISC_FORWARD_ACTION_FORWARD,
trap_id); trap_id);
...@@ -856,6 +862,7 @@ static void ...@@ -856,6 +862,7 @@ static void
mlxsw_afa_mirror_destroy(struct mlxsw_afa_block *block, mlxsw_afa_mirror_destroy(struct mlxsw_afa_block *block,
struct mlxsw_afa_mirror *mirror) struct mlxsw_afa_mirror *mirror)
{ {
mlxsw_afa_resource_del(&mirror->resource);
block->afa->ops->mirror_del(block->afa->ops_priv, block->afa->ops->mirror_del(block->afa->ops_priv,
mirror->local_in_port, mirror->local_in_port,
mirror->span_id, mirror->span_id,
...@@ -908,8 +915,8 @@ mlxsw_afa_block_append_allocated_mirror(struct mlxsw_afa_block *block, ...@@ -908,8 +915,8 @@ mlxsw_afa_block_append_allocated_mirror(struct mlxsw_afa_block *block,
char *act = mlxsw_afa_block_append_action(block, char *act = mlxsw_afa_block_append_action(block,
MLXSW_AFA_TRAPDISC_CODE, MLXSW_AFA_TRAPDISC_CODE,
MLXSW_AFA_TRAPDISC_SIZE); MLXSW_AFA_TRAPDISC_SIZE);
if (!act) if (IS_ERR(act))
return -ENOBUFS; return PTR_ERR(act);
mlxsw_afa_trapdisc_pack(act, MLXSW_AFA_TRAPDISC_TRAP_ACTION_NOP, mlxsw_afa_trapdisc_pack(act, MLXSW_AFA_TRAPDISC_TRAP_ACTION_NOP,
MLXSW_AFA_TRAPDISC_FORWARD_ACTION_FORWARD, 0); MLXSW_AFA_TRAPDISC_FORWARD_ACTION_FORWARD, 0);
mlxsw_afa_trapdisc_mirror_pack(act, true, mirror_agent); mlxsw_afa_trapdisc_mirror_pack(act, true, mirror_agent);
...@@ -996,8 +1003,8 @@ int mlxsw_afa_block_append_fwd(struct mlxsw_afa_block *block, ...@@ -996,8 +1003,8 @@ int mlxsw_afa_block_append_fwd(struct mlxsw_afa_block *block,
act = mlxsw_afa_block_append_action(block, MLXSW_AFA_FORWARD_CODE, act = mlxsw_afa_block_append_action(block, MLXSW_AFA_FORWARD_CODE,
MLXSW_AFA_FORWARD_SIZE); MLXSW_AFA_FORWARD_SIZE);
if (!act) { if (IS_ERR(act)) {
err = -ENOBUFS; err = PTR_ERR(act);
goto err_append_action; goto err_append_action;
} }
mlxsw_afa_forward_pack(act, MLXSW_AFA_FORWARD_TYPE_PBS, mlxsw_afa_forward_pack(act, MLXSW_AFA_FORWARD_TYPE_PBS,
...@@ -1052,8 +1059,8 @@ int mlxsw_afa_block_append_allocated_counter(struct mlxsw_afa_block *block, ...@@ -1052,8 +1059,8 @@ int mlxsw_afa_block_append_allocated_counter(struct mlxsw_afa_block *block,
{ {
char *act = mlxsw_afa_block_append_action(block, MLXSW_AFA_POLCNT_CODE, char *act = mlxsw_afa_block_append_action(block, MLXSW_AFA_POLCNT_CODE,
MLXSW_AFA_POLCNT_SIZE); MLXSW_AFA_POLCNT_SIZE);
if (!act) if (IS_ERR(act))
return -ENOBUFS; return PTR_ERR(act);
mlxsw_afa_polcnt_pack(act, MLXSW_AFA_POLCNT_COUNTER_SET_TYPE_PACKETS_BYTES, mlxsw_afa_polcnt_pack(act, MLXSW_AFA_POLCNT_COUNTER_SET_TYPE_PACKETS_BYTES,
counter_index); counter_index);
return 0; return 0;
...@@ -1123,8 +1130,8 @@ int mlxsw_afa_block_append_fid_set(struct mlxsw_afa_block *block, u16 fid) ...@@ -1123,8 +1130,8 @@ int mlxsw_afa_block_append_fid_set(struct mlxsw_afa_block *block, u16 fid)
char *act = mlxsw_afa_block_append_action(block, char *act = mlxsw_afa_block_append_action(block,
MLXSW_AFA_VIRFWD_CODE, MLXSW_AFA_VIRFWD_CODE,
MLXSW_AFA_VIRFWD_SIZE); MLXSW_AFA_VIRFWD_SIZE);
if (!act) if (IS_ERR(act))
return -ENOBUFS; return PTR_ERR(act);
mlxsw_afa_virfwd_pack(act, MLXSW_AFA_VIRFWD_FID_CMD_SET, fid); mlxsw_afa_virfwd_pack(act, MLXSW_AFA_VIRFWD_FID_CMD_SET, fid);
return 0; return 0;
} }
...@@ -1193,8 +1200,8 @@ int mlxsw_afa_block_append_mcrouter(struct mlxsw_afa_block *block, ...@@ -1193,8 +1200,8 @@ int mlxsw_afa_block_append_mcrouter(struct mlxsw_afa_block *block,
char *act = mlxsw_afa_block_append_action(block, char *act = mlxsw_afa_block_append_action(block,
MLXSW_AFA_MCROUTER_CODE, MLXSW_AFA_MCROUTER_CODE,
MLXSW_AFA_MCROUTER_SIZE); MLXSW_AFA_MCROUTER_SIZE);
if (!act) if (IS_ERR(act))
return -ENOBUFS; return PTR_ERR(act);
mlxsw_afa_mcrouter_pack(act, MLXSW_AFA_MCROUTER_RPF_ACTION_TRAP, mlxsw_afa_mcrouter_pack(act, MLXSW_AFA_MCROUTER_RPF_ACTION_TRAP,
expected_irif, min_mtu, rmid_valid, kvdl_index); expected_irif, min_mtu, rmid_valid, kvdl_index);
return 0; return 0;
......
...@@ -1362,7 +1362,7 @@ static irqreturn_t lmc_interrupt (int irq, void *dev_instance) /*fold00*/ ...@@ -1362,7 +1362,7 @@ static irqreturn_t lmc_interrupt (int irq, void *dev_instance) /*fold00*/
case 0x001: case 0x001:
printk(KERN_WARNING "%s: Master Abort (naughty)\n", dev->name); printk(KERN_WARNING "%s: Master Abort (naughty)\n", dev->name);
break; break;
case 0x010: case 0x002:
printk(KERN_WARNING "%s: Target Abort (not so naughty)\n", dev->name); printk(KERN_WARNING "%s: Target Abort (not so naughty)\n", dev->name);
break; break;
default: default:
......
...@@ -1201,13 +1201,18 @@ static int pppol2tp_tunnel_ioctl(struct l2tp_tunnel *tunnel, ...@@ -1201,13 +1201,18 @@ static int pppol2tp_tunnel_ioctl(struct l2tp_tunnel *tunnel,
l2tp_session_get(sock_net(sk), tunnel, l2tp_session_get(sock_net(sk), tunnel,
stats.session_id); stats.session_id);
if (session && session->pwtype == L2TP_PWTYPE_PPP) { if (!session) {
err = pppol2tp_session_ioctl(session, cmd, err = -EBADR;
arg); break;
}
if (session->pwtype != L2TP_PWTYPE_PPP) {
l2tp_session_dec_refcount(session); l2tp_session_dec_refcount(session);
} else {
err = -EBADR; err = -EBADR;
break;
} }
err = pppol2tp_session_ioctl(session, cmd, arg);
l2tp_session_dec_refcount(session);
break; break;
} }
#ifdef CONFIG_XFRM #ifdef CONFIG_XFRM
......
...@@ -1013,8 +1013,8 @@ static int netlink_bind(struct socket *sock, struct sockaddr *addr, ...@@ -1013,8 +1013,8 @@ static int netlink_bind(struct socket *sock, struct sockaddr *addr,
if (nlk->ngroups == 0) if (nlk->ngroups == 0)
groups = 0; groups = 0;
else else if (nlk->ngroups < 8*sizeof(groups))
groups &= (1ULL << nlk->ngroups) - 1; groups &= (1UL << nlk->ngroups) - 1;
bound = nlk->bound; bound = nlk->bound;
if (bound) { if (bound) {
......
...@@ -233,6 +233,7 @@ static void smc_cdc_msg_recv_action(struct smc_sock *smc, ...@@ -233,6 +233,7 @@ static void smc_cdc_msg_recv_action(struct smc_sock *smc,
/* force immediate tx of current consumer cursor, but /* force immediate tx of current consumer cursor, but
* under send_lock to guarantee arrival in seqno-order * under send_lock to guarantee arrival in seqno-order
*/ */
if (smc->sk.sk_state != SMC_INIT)
smc_tx_sndbuf_nonempty(conn); smc_tx_sndbuf_nonempty(conn);
} }
} }
......
...@@ -84,10 +84,8 @@ static int __xsk_rcv_zc(struct xdp_sock *xs, struct xdp_buff *xdp, u32 len) ...@@ -84,10 +84,8 @@ static int __xsk_rcv_zc(struct xdp_sock *xs, struct xdp_buff *xdp, u32 len)
{ {
int err = xskq_produce_batch_desc(xs->rx, (u64)xdp->handle, len); int err = xskq_produce_batch_desc(xs->rx, (u64)xdp->handle, len);
if (err) { if (err)
xdp_return_buff(xdp);
xs->rx_dropped++; xs->rx_dropped++;
}
return err; return err;
} }
......
...@@ -36,6 +36,7 @@ ...@@ -36,6 +36,7 @@
#include <assert.h> #include <assert.h>
#include <errno.h> #include <errno.h>
#include <fcntl.h> #include <fcntl.h>
#include <linux/kernel.h>
#include <stdbool.h> #include <stdbool.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
...@@ -90,7 +91,8 @@ static bool map_is_map_of_progs(__u32 type) ...@@ -90,7 +91,8 @@ static bool map_is_map_of_progs(__u32 type)
static void *alloc_value(struct bpf_map_info *info) static void *alloc_value(struct bpf_map_info *info)
{ {
if (map_is_per_cpu(info->type)) if (map_is_per_cpu(info->type))
return malloc(info->value_size * get_possible_cpus()); return malloc(round_up(info->value_size, 8) *
get_possible_cpus());
else else
return malloc(info->value_size); return malloc(info->value_size);
} }
...@@ -161,9 +163,10 @@ static void print_entry_json(struct bpf_map_info *info, unsigned char *key, ...@@ -161,9 +163,10 @@ static void print_entry_json(struct bpf_map_info *info, unsigned char *key,
jsonw_name(json_wtr, "value"); jsonw_name(json_wtr, "value");
print_hex_data_json(value, info->value_size); print_hex_data_json(value, info->value_size);
} else { } else {
unsigned int i, n; unsigned int i, n, step;
n = get_possible_cpus(); n = get_possible_cpus();
step = round_up(info->value_size, 8);
jsonw_name(json_wtr, "key"); jsonw_name(json_wtr, "key");
print_hex_data_json(key, info->key_size); print_hex_data_json(key, info->key_size);
...@@ -176,7 +179,7 @@ static void print_entry_json(struct bpf_map_info *info, unsigned char *key, ...@@ -176,7 +179,7 @@ static void print_entry_json(struct bpf_map_info *info, unsigned char *key,
jsonw_int_field(json_wtr, "cpu", i); jsonw_int_field(json_wtr, "cpu", i);
jsonw_name(json_wtr, "value"); jsonw_name(json_wtr, "value");
print_hex_data_json(value + i * info->value_size, print_hex_data_json(value + i * step,
info->value_size); info->value_size);
jsonw_end_object(json_wtr); jsonw_end_object(json_wtr);
...@@ -207,9 +210,10 @@ static void print_entry_plain(struct bpf_map_info *info, unsigned char *key, ...@@ -207,9 +210,10 @@ static void print_entry_plain(struct bpf_map_info *info, unsigned char *key,
printf("\n"); printf("\n");
} else { } else {
unsigned int i, n; unsigned int i, n, step;
n = get_possible_cpus(); n = get_possible_cpus();
step = round_up(info->value_size, 8);
printf("key:\n"); printf("key:\n");
fprint_hex(stdout, key, info->key_size, " "); fprint_hex(stdout, key, info->key_size, " ");
...@@ -217,7 +221,7 @@ static void print_entry_plain(struct bpf_map_info *info, unsigned char *key, ...@@ -217,7 +221,7 @@ static void print_entry_plain(struct bpf_map_info *info, unsigned char *key,
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
printf("value (CPU %02d):%c", printf("value (CPU %02d):%c",
i, info->value_size > 16 ? '\n' : ' '); i, info->value_size > 16 ? '\n' : ' ');
fprint_hex(stdout, value + i * info->value_size, fprint_hex(stdout, value + i * step,
info->value_size, " "); info->value_size, " ");
printf("\n"); printf("\n");
} }
......
...@@ -115,14 +115,14 @@ ip netns exec ns2 ip -6 route add fb00::6 encap bpf in obj test_lwt_seg6local.o ...@@ -115,14 +115,14 @@ ip netns exec ns2 ip -6 route add fb00::6 encap bpf in obj test_lwt_seg6local.o
ip netns exec ns2 ip -6 route add fd00::1 dev veth3 via fb00::43 scope link ip netns exec ns2 ip -6 route add fd00::1 dev veth3 via fb00::43 scope link
ip netns exec ns3 ip -6 route add fc42::1 dev veth5 via fb00::65 ip netns exec ns3 ip -6 route add fc42::1 dev veth5 via fb00::65
ip netns exec ns3 ip -6 route add fd00::1 encap seg6local action End.BPF obj test_lwt_seg6local.o sec add_egr_x dev veth4 ip netns exec ns3 ip -6 route add fd00::1 encap seg6local action End.BPF endpoint obj test_lwt_seg6local.o sec add_egr_x dev veth4
ip netns exec ns4 ip -6 route add fd00::2 encap seg6local action End.BPF obj test_lwt_seg6local.o sec pop_egr dev veth6 ip netns exec ns4 ip -6 route add fd00::2 encap seg6local action End.BPF endpoint obj test_lwt_seg6local.o sec pop_egr dev veth6
ip netns exec ns4 ip -6 addr add fc42::1 dev lo ip netns exec ns4 ip -6 addr add fc42::1 dev lo
ip netns exec ns4 ip -6 route add fd00::3 dev veth7 via fb00::87 ip netns exec ns4 ip -6 route add fd00::3 dev veth7 via fb00::87
ip netns exec ns5 ip -6 route add fd00::4 table 117 dev veth9 via fb00::109 ip netns exec ns5 ip -6 route add fd00::4 table 117 dev veth9 via fb00::109
ip netns exec ns5 ip -6 route add fd00::3 encap seg6local action End.BPF obj test_lwt_seg6local.o sec inspect_t dev veth8 ip netns exec ns5 ip -6 route add fd00::3 encap seg6local action End.BPF endpoint obj test_lwt_seg6local.o sec inspect_t dev veth8
ip netns exec ns6 ip -6 addr add fb00::6/16 dev lo ip netns exec ns6 ip -6 addr add fb00::6/16 dev lo
ip netns exec ns6 ip -6 addr add fd00::4/16 dev lo ip netns exec ns6 ip -6 addr add fd00::4/16 dev lo
......
...@@ -402,7 +402,7 @@ int main(int argc, char *argv[]) ...@@ -402,7 +402,7 @@ int main(int argc, char *argv[])
exit(1); exit(1);
} }
fd = socket(AF_INET6, SOCK_STREAM, 0); fd = socket(cfg_family, SOCK_STREAM, 0);
if (fd == -1) { if (fd == -1) {
perror("socket"); perror("socket");
exit(1); exit(1);
......
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