link = smc_llc_usable_link(lgr);
                if (!link)
                        return;
-               /* tbd: call smc_llc_srv_add_link_local(link); */
+               smc_llc_srv_add_link_local(link);
        } else {
                /* invite server to start add link processing */
                u8 gid[SMC_GID_SIZE];
 
        if (lgr->role == SMC_SERV) {
                /* trigger local delete link processing */
+               smc_llc_srv_delete_link_local(to_lnk, del_link_id);
        } else {
                if (lgr->llc_flow_lcl.type != SMC_LLC_FLOW_NONE) {
                        /* another llc task is ongoing */
 
        union smc_llc_msg msg;
 };
 
+static void smc_llc_enqueue(struct smc_link *link, union smc_llc_msg *llc);
+
 struct smc_llc_qentry *smc_llc_flow_qentry_clr(struct smc_llc_flow *flow)
 {
        struct smc_llc_qentry *qentry = flow->qentry;
        mutex_unlock(&lgr->llc_conf_mutex);
 }
 
+/* enqueue a local add_link req to trigger a new add_link flow, only as SERV */
+void smc_llc_srv_add_link_local(struct smc_link *link)
+{
+       struct smc_llc_msg_add_link add_llc = {0};
+
+       add_llc.hd.length = sizeof(add_llc);
+       add_llc.hd.common.type = SMC_LLC_ADD_LINK;
+       /* no dev and port needed, we as server ignore client data anyway */
+       smc_llc_enqueue(link, (union smc_llc_msg *)&add_llc);
+}
+
 /* worker to process an add link message */
 static void smc_llc_add_link_work(struct work_struct *work)
 {
        smc_llc_flow_stop(lgr, &lgr->llc_flow_lcl);
 }
 
+/* enqueue a local del_link msg to trigger a new del_link flow,
+ * called only for role SMC_SERV
+ */
+void smc_llc_srv_delete_link_local(struct smc_link *link, u8 del_link_id)
+{
+       struct smc_llc_msg_del_link del_llc = {0};
+
+       del_llc.hd.length = sizeof(del_llc);
+       del_llc.hd.common.type = SMC_LLC_DELETE_LINK;
+       del_llc.link_num = del_link_id;
+       del_llc.reason = htonl(SMC_LLC_DEL_LOST_PATH);
+       del_llc.hd.flags |= SMC_LLC_FLAG_DEL_LINK_ORDERLY;
+       smc_llc_enqueue(link, (union smc_llc_msg *)&del_llc);
+}
+
 static void smc_llc_process_cli_delete_link(struct smc_link_group *lgr)
 {
        struct smc_link *lnk_del = NULL, *lnk_asym, *lnk;
 
        if (lgr->type == SMC_LGR_SINGLE && !list_empty(&lgr->list)) {
                /* trigger setup of asymm alt link */
-               /* tbd: call smc_llc_srv_add_link_local(lnk); */
+               smc_llc_srv_add_link_local(lnk);
        }
 out:
        mutex_unlock(&lgr->llc_conf_mutex);
 
 int smc_llc_send_delete_link(struct smc_link *link, u8 link_del_id,
                             enum smc_llc_reqresp reqresp, bool orderly,
                             u32 reason);
+void smc_llc_srv_delete_link_local(struct smc_link *link, u8 del_link_id);
 void smc_llc_lgr_init(struct smc_link_group *lgr, struct smc_sock *smc);
 void smc_llc_lgr_clear(struct smc_link_group *lgr);
 int smc_llc_link_init(struct smc_link *link);
 void smc_llc_flow_qentry_del(struct smc_llc_flow *flow);
 int smc_llc_cli_add_link(struct smc_link *link, struct smc_llc_qentry *qentry);
 int smc_llc_srv_add_link(struct smc_link *link);
+void smc_llc_srv_add_link_local(struct smc_link *link);
 int smc_llc_init(void) __init;
 
 #endif /* SMC_LLC_H */